回归(《Machine Learning in Action》笔记(2))

如果数据的特征比样本点还多的话,则输入数据的矩阵X就不是满秩矩阵,而非满秩的矩阵在求逆时会出现问题。
有人想出了很好的解决方法——通过缩减系数来“理解”数据的方法。

岭回归:在矩阵上加一坨东西(单位矩阵 * 常量)使得矩阵非奇异,通过引入惩罚项来减少不重要的参数。

def ridgeRegres(xMat, yMat, lam = 0.2):
    '''用于计算回归系数 '''
    xTx = xMat.T * xMat
    denom = xTx + numpy.eye(numpy.shape(xMat)[1]) * lam
    if numpy.linalg.det(denom) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = denom.I  * (xMat.T * yMat.T)
    return ws

def ridgeTest(xArr, yArr):
    '''测试结果 输入:tezheng '''
    xMat = numpy.mat(xArr)
    yMat = numpy.mat(yArr)
    yMean = numpy.mean(yMat, 0)
    yMat = yMat - yMean
    xMeans = numpy.mean(xMat, 0)
    xVar = numpy.var(xMat, 0)
    xMat = (xMat - xMeans) / xVar       #标准化处理,所有特征减去各自的平均值再除以方差
    numTestPts = 30
    wMat = numpy.zeros((numTestPts, numpy.shape(xMat)[1]))
    for i in range(numTestPts):
        ws = ridgeRegres(xMat, yMat, numpy.exp(i - 10))     #在30个不同的lambda下调用ridgeRegression()函数
        wMat[i, :] = ws.T
    return wMat

aX, aY = loadDataSet('abalone.txt')
abX = numpy.mat(aX)
abY = numpy.mat(aY)
ridgeWeights = ridgeRegres(abX, abY)
print ridgeWeights

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

def stageWise(xArr, yArr, eps = 0.01, numIt = 100):
    ''' 逐步线性回归算法 输入:特征数据,预测变量,每次迭代需要调整的步长,迭代次数 '''
    xMat = numpy.mat(xArr)
    yMat = numpy.mat(yArr).T
    yMean = numpy.mean(yMat, 0)
    yMat =  yMat = yMean
    xMeans = numpy.mean(xMat, 0)
    xVar = numpy.var(xMat, 1)
    xMat = (xMat - xMeans) / xVar
    m, n = numpy.shape(xMat)
    returnMat = numpy.zeros((numIt, n))
    ws = numpy.zeros((n, 1))
    wsTest = ws.copy()      #为了实现贪心算法建立两个ws的副本
    wsMax = ws.copy()
    for i in range(numIt):
        print ws.T
        lowestError = numpy.Inf
        for j in range(n):
            for sign in [-1, 1]:
                wsTest = ws.copy()
                wsTest[j] += eps * sign
                yTest = xMat * wsTest
                rssE = rssError(yMat.A, yTest.A)        #平方误差
                if rrsE < lowestError:
                    lowestError = rssE
                    wsMax = wsTest
        ws = wsMax.copy()
        returnMat[i, :] = ws.T
    return returnMat

总结:与分类一样,回归也是预测目标值的过程。当样本数比特征数多时,可以使用缩减法,相当于对回归系数的大小施加了限制。缩减法还可以看做是对一个模型增加偏差的同时减少方差。偏差方差折中是一个重要的概念,可以帮助我们理解现有的模型并且作出改进,从而得到更好的模型。(数学真是一门美的学科)

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