机器学习算法与Python实践(3) - 前向逐步回归

关于逐步回归的资料,查阅等等都比较的少,所以隔了一天才进行总结。

前向逐步回归算法

  前向逐步回归算法属于一种贪心算法,即每一步都尽可能减少误差。一开始,所有的权重都设置为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

看别人总结都是和岭回归等一起总结的,所以等到时候我会将这篇文章进行更新。

你可能感兴趣的:(机器学习)