局部加权线性回归(LWLR)
考虑从x∈R中预测y的问题。下面最左边的图显示了将拟合到数据集的结果。我们看到数据并不是直线上的,所以拟合不是很好。
取代原来的方法,如果我们加上一个额外的特征 ,并用
来拟合数据,你会发现效果稍微好了那么一点(看中间这幅图片)。似乎可以天真地认为,我们添加的特征越多越好。然而,添加的特征太多也是很危险的:最右边的图像是使用一个五次多项式
来拟合数据的结果。我们看到,即使拟合曲线完美地穿过数据,我们也无法确定这就是一个相当好的预测,能够针对不同生活地区
来预测房价
。在还没有正式地定义这些术语之前,我们可以说最左侧的图像展示的是一种 欠拟合(underfitting) 的实例 —— 很明显看出模型未能捕获到数据的结构 —— 最右侧的图像展示的是一种 过拟合(overfitting) 的实例。(在这节课的后面部分,当我们谈到学习理论的时候,我们将把这些概念形式化,并更仔细地去定义一个假设是好的还是坏的。)
正如上面所看到的,特征的选取方式能够决定学习算法表现性能的好坏。(当我们谈到模型选择时,我们也会见到一些算法能够自动选择一些好的特征。)在这一小节,让我们简要地谈一谈关于局部加权线性回归(LWR)算法的内容,假设我们有足够数量的训练集,使得对于特征的选择不是那么重要。在原始版本的线性回归算法中,要对一个查询点 xx 进行预测,比如要评估 h(x)h(x) ,要经过下面的步骤
- 拟合
来最小化
- 输出
相比之下,局部加权线性回归算法做的是:
- 拟合
来最小化
- 输出
此处的 是非负的 权重(weights)值。直观看来,如果对于某个特定的
,它的
很大,那么在选择
的时候,我们将会尽可能地使
更小。如果
很小,那么在拟合的过程中
误差项就能够大大地忽略。
对于权值的选取可以使用下面这个比较标准的公式:
参考最小二乘法,推导一下计算过程:
对
求导与上面步骤类似,得到结果为:
令导数为零,整理可得:
其中,是
维的对角矩阵,对角线依次存放
.
自己的理解:因为线性回归出现的欠拟合问题,提出了局部加权线性回归算法。算法的思想是:我们将给预测值附近所有的点赋予一个权值,这个权重加入到了损失函数中,这个权重的值决定了损失函数的 大小。要使得损失函数最小,就必须保证权重的值不能太大,所以求导得到θ的表达式,θ就是回归系数,与预测值相关。权重计算公式中:
(1)如果,则
。
(2)如果,则
。
根据上面的计算,发现距离预测值远的点的权重将变为0,距离预测值近的点权重接近1,根据权重的变化来更新回归系数(即斜率),斜率的值变成一个矩阵,从而使得直线变成了曲线,对数据的拟合就更好了。当然如果k值选择不恰当,也会出现过拟合的情况。
同时,新增一个概念:
对于线性回归算法,一旦拟合出适合训练数据的参数θi’s,保存这些参数θi’s,对于之后的预测,不需要再使用原始训练数据集,所以是参数学习算法。
对于局部加权线性回归算法,每次进行预测都需要全部的训练数据(每次进行的预测得到不同的参数θi’s),没有固定的参数θi’s,所以是非参数算法。
代码实现:
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))
for j in range(m): #next 2 lines create weights matrix
diffMat = testPoint - xMat[j,:] #
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0.0:
print ("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws