1. 前言:
我们知道线性回归的一个问题就是欠拟合,将不能取得很好的预测效果。因为它是具有最小均方误差的无偏估计。解决这个问题的方法就是允许在估计中一些偏差。其中一个非常有效的方法就是局部加权线性回归(LWLR)。
2. 算法思想:
2.1. 比较线性回归:
2.2. 局部加权线性回归:(使用高斯核权重)
解释:
当样本点 接近预测点
时,权值大。
当样本点 远离预测点
时,权值小。
权值系数 指数衰减,其中参数
为衰减因子,即权重衰减的速率。
越小 权重衰减越快。(依据权重函数易得知)
从后面实战中我们可以更好的理解参数
最小二乘法,求解最佳回归系数。
其中 W 为权重矩阵(对角阵):
求解:(详细过程类似于线性回归求解过程)
3. 实战:(附完整项目代码)
3.1. 核心代码:局部线性回归函数
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = np.mat(xArr); yMat = np.mat(yArr).T
m = np.shape(xMat)[0]
weights = np.mat(np.eye((m)))
for j in range(m): #next 2 lines create weights matrix
diffMat = testPoint - xMat[j,:] #difference matrix
weights[j,j] = np.exp(diffMat*diffMat.T/(-2.0*k**2)) #weighted matrix
xTx = xMat.T * (weights * xMat)
if np.linalg.det(xTx) == 0.0:
print ("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * (weights * yMat)) #normal equation
return testPoint * w
3.2. 结果:
当 = 1 时,结果类似于线性回归 欠拟合
当 = 0.01 时 结果如下
当 = 0.003 过拟合
从结果来看 局部线性回归能很好地解决线性回归欠拟合的问题,但又可能出现过拟合。
所以参数调整影响了模型的泛化能力。选取合适参数至关重要。
虽然局部线性回归能增强模型的泛化能力。但是它也有自己的缺陷。就是对每个点的预测都必须使用整个数据集。这样大大增加了计算量。
4. 存在问题:
考虑一个问题,当数据特征比训练集样本点还多时,也就是说不可逆,矩阵求导无计可施。 此时就要用缩减样本来“理解”数据,求得回归系数矩阵。
现在我们知道了线性回归以及局部加权线性回归,用此来预测鲍鱼的年龄。