局部加权线性回归(LWLR)

考虑从x∈R中预测y的问题。下面最左边的图显示了将拟合到数据集的结果。我们看到数据并不是直线上的,所以拟合不是很好。

取代原来的方法,如果我们加上一个额外的特征 x^{2},并用y=\theta _{0}+\theta _{1}x+\theta _{2}x^{2} 来拟合数据,你会发现效果稍微好了那么一点(看中间这幅图片)。似乎可以天真地认为,我们添加的特征越多越好。然而,添加的特征太多也是很危险的:最右边的图像是使用一个五次多项式 y=\sum \theta _{j}x^{j}来拟合数据的结果。我们看到,即使拟合曲线完美地穿过数据,我们也无法确定这就是一个相当好的预测,能够针对不同生活地区 (x)来预测房价 (y)。在还没有正式地定义这些术语之前,我们可以说最左侧的图像展示的是一种 欠拟合(underfitting) 的实例 —— 很明显看出模型未能捕获到数据的结构 —— 最右侧的图像展示的是一种 过拟合(overfitting) 的实例。(在这节课的后面部分,当我们谈到学习理论的时候,我们将把这些概念形式化,并更仔细地去定义一个假设是好的还是坏的。)

正如上面所看到的,特征的选取方式能够决定学习算法表现性能的好坏。(当我们谈到模型选择时,我们也会见到一些算法能够自动选择一些好的特征。)在这一小节,让我们简要地谈一谈关于局部加权线性回归(LWR)算法的内容,假设我们有足够数量的训练集,使得对于特征的选择不是那么重要。在原始版本的线性回归算法中,要对一个查询点 xx 进行预测,比如要评估 h(x)h(x) ,要经过下面的步骤

  1. 拟合\theta来最小化 \sum (y^{(i)}-\theta ^{T}x^{(i)})^{2}
  2. 输出\theta ^{T}x

相比之下,局部加权线性回归算法做的是:

  1. 拟合\theta来最小化\sum \omega ^{(i)}(y^{(i)}-\theta ^{T}x^{(i)})^{2}
  2. 输出\theta ^{T}x

此处的 \omega (i) 是非负的 权重(weights)值。直观看来,如果对于某个特定的 i ,它的\omega (i)很大,那么在选择\theta的时候,我们将会尽可能地使 (y^{(i)}-\theta ^{T}x^{(i)})^{2} 更小。如果\omega (i)很小,那么在拟合的过程中(y^{(i)}-\theta ^{T}x^{(i)})^{2}误差项就能够大大地忽略。

对于权值的选取可以使用下面这个比较标准的公式:

参考最小二乘法,推导一下计算过程:

J(\theta )​对 \theta求导与上面步骤类似,得到结果为:

令导数为零,整理可得:

其中,\omega是 m\times m维的对角矩阵,对角线依次存放\omega (i) .

自己的理解:因为线性回归出现的欠拟合问题,提出了局部加权线性回归算法。算法的思想是:我们将给预测值附近所有的点赋予一个权值,这个权重加入到了损失函数中,这个权重的值决定了损失函数的 大小。要使得损失函数最小,就必须保证权重的值不能太大,所以求导得到θ的表达式,θ就是回归系数,与预测值相关。权重计算公式中:

(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
 

 

 

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