关于逐步回归的资料,查阅等等都比较的少,所以隔了一天才进行总结。
前向逐步回归算法
前向逐步回归算法属于一种贪心算法,即每一步都尽可能减少误差。一开始,所有的权重都设置为1,然后每一步所做的决策是对某个权重增加或减少一个很小的值。
观察每次循环得到的回归系数,一段时间后会出现系数达到饱和并在特定值之间来回震荡的情况,这是由于步长设置过大导致的。
当我们构建一个模型后,运行该算法找到重要的特征,这样就有可能及时停止对那些不重要特征(非常小,趋于零的回归系数)的收集。
看起来可能有点太抽象了,看下面的伪代码以及代码的例子就可以理解了。
伪代码如下:
数据标准化,使其分布满足0均值和单位方差
每次迭代过程中:
设置当前最小误差lowestError为正无穷
对每个特称:
增大或减小:
改变一个系数得到一个新的w
计算新的w下的误差
如果当前误差w小雨最小误差lowestError,那么将wbest设置为w
Python代码如下:
### Front stage-wise Regression ###
def rssError(yArr, yHatArr):
return ((yArr - yHatArr) ** 2).sum()
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 stageWise(xArr, yArr, step=0.01, numIt=100):
xMat = mat(xArr)
xMat = regularize(xMat)
yMat = mat(yArr).T
yMean = mean(yMat)
yMat = yMat - yMean
N, n = shape(xMat)
returnMat = zeros((numIt, n))
ws = zeros((n, 1))
wsTest = ws.copy()
weMax = ws.copy()
for ii in range(numIt):
print(ws.T)
lowestErr = inf
for jj in range(n):
for sign in [-1, 1]:
wsTest = ws.copy()
wsTest[jj] += step * sign
yTest = xMat * wsTest
rssE = rssError(yMat.A, yTest.A)
if rssE < lowestErr:
lowestErr = rssE
wsMax = wsTest
ws = wsMax.copy()
returnMat[ii, :] = ws.T
return returnMat
看别人总结都是和岭回归等一起总结的,所以等到时候我会将这篇文章进行更新。