前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前向逐步线性回归

前向逐步线性回归

作者头像
用户6021899
发布2019-08-14 17:30:24
7790
发布2019-08-14 17:30:24
举报

前向逐步线性回归属于一种贪心算法,即每一步尽可能减少误差。一开始,所有权重都设为1,然后每一步所做的决策是对某个权重增加或者减少一个很小的步长。

该算法的伪代码如下:

加载数据集
数据标准化,使其分布满足0均值和单位方差。
初始回归系数全部设为1
在每轮迭代过程中:
    设置当前最小误差lowestError为正无穷
    对每个特征的权重系数:
        增大或者缩小一个步长
        计算新回归系数W下的误差
        如果误差小于当前最小误差:
            设置最佳回归系数 Wbest = W
返回最终的最佳回归系数Wbest

下面的结果还是基于上一篇中相同的海洋生物数据集:

步长取0.001,共迭代20000次。可以看出14000次迭代后回归系数已收敛。

源代码如下:

from numpy import *
def loadDataSet(fileName):      #general function to parse tab -delimited floats
    numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr =[]
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

def regularize(xMat):#regularize by columns
    inMat = xMat.copy()
    inMeans = mean(inMat,0)   #calc mean then subtract it off
    inVar = var(inMat,0)      #calc variance of Xi then divide by it
    inMat = (inMat - inMeans)/inVar
    return inMat
def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays
    return ((yArr-yHatArr)**2).sum()
def stageWise(xArr,yArr,eps=0.01,numIt=100):
    xMat = mat(xArr)
    yMat=mat(yArr).T
    yMean = mean(yMat,0)
    yMat = yMat - yMean     #can also regularize ys but will get smaller coef
    xMat = regularize(xMat)
    m,n=shape(xMat)
    #returnMat = zeros((numIt,n)) #testing code remove
    #ws = zeros((n,1)) #初始所有权重为0
    ws = ones((n,1)) #初始所有权重为1
    #wsMax = ws.copy()
    Mat = zeros((numIt, n))
    for i in range(numIt):
        if i%1000 ==0 : #每迭代1000次,打印归回系数
            print ("第%d次迭代后回归系数为:"%i,end ="")
            print(ws.T)
        lowestError = inf #初始误差设为正无穷大
        for j in range(n):
            for sign in [-1,1]: # 贪心算法,左右试探
                wsTest = ws.copy() # 初始化
                wsTest[j] += eps*sign #eps 为步长
                yTest = xMat*wsTest #预测值
                rssE = rssError(yMat.A,yTest.A)
                if rssE < lowestError:
                    lowestError = rssE
                    wsMax = wsTest
        ws = wsMax.copy()
        Mat[i,:]=ws.T
    return Mat
xArr,yArr = loadDataSet("abalone.txt")
numIt = 20000
Wmat = stageWise(xArr,yArr,eps=0.001, numIt=numIt)
print(Wmat.shape)
import matplotlib.pyplot as plt
n = Wmat.shape[1]#特征数,即回归系数个数
for i in range(n):
    plt.plot(arange(numIt), Wmat[:,i], label = "W(%s)"%i)
plt.legend(loc="upper right")
plt.title(r"前向逐步回归""\n基于数据集'abalone.txt'", fontsize=16)
plt.xlabel(r"迭代次数")
plt.grid(ls="--",lw =1)
plt.show()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档