【Python机器学习】回归——局部加权线性回归

线性回归有一个问题就是有可能出现过拟合现象,因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。

其中一个方法就是局部加权线性回归(LWLR),在该算法中,我们给待预测点附近的每个点赋予一定的权重,然后在这个子集上基于最小均方差来进行普通的回归,与kNN一样,这种算法每次预测均需要事先选取出对应的数据子集。

该算法解出回归系数w的形式如下:

其中w是一个矩阵,用来给每个数据点赋予权重。

LWLR使用"核"来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核是高斯核,高斯核对应的权重如下:

这样就构建了一个只包含对角元素的权重矩阵w,并且点x与x(i)越近,w(i,i)将会越大。上述工时包含一个需要用户指定的参数k,它决定了对附近的点赋予多大的权重,这也是使用LWLR时唯一需要考虑的参数。

下面是具体的代码实现:

python 复制代码
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):
        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('行列式为0')
        return 
    ws=xTx.I*(xMat.T*(weights*yMat))
    return testPoint*ws

def lwlrTest(testArr,xArr,yArr,k=1.0):
    m=shape(testArr)[0]
    yHat=zeros(m)
    for i in range(m):
        yHat[i]=lwlr(testArr[i],xArr,yArr,k)
    return yHat

上述代码的作用是给定x空间中的任意一点,计算出对应的预测值yHat。函数lwlr()的开头读入数据并创建所需矩阵,之后创建对角权重矩阵weights。权重矩阵时一个方针,阶数等于样本点个数。也就是说,该矩阵为每个样本点初始化了一个权重,接着算法将遍历数据集,计算每个样本点对应的权重值:随着样本点与待预测点距离的递增,权重将以指数级衰减。输入参数k控制衰减的速度。在权重矩阵计算完毕后,就可以得到对回归系数ws的一个估计。

另一个函数是lwlrTest(),用于为数据集中每个点调用lwlr(),这有助于求解k的大小。

载入数据并对单点进行估计:

python 复制代码
xArr,yArr=loadDataSet('ex0.txt')
print(lwlr(xArr[0],xArr,yArr,1.0))
print(lwlr(xArr[0],xArr,yArr,0.001))

计算拟合曲线并绘图

python 复制代码
yHat=lwlrTest(xArr,xArr,yArr,0.003)
xMat=mat(xArr)
srtInd=xMat[:,1].argsort(0)
xSort=xMat[srtInd][:,0,:]

import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat[srtInd])
ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0],s=2,c='red')
plt.show()

可以观察上图的效果。

局部加权线性回归也存在一个问题,那就是增加了计算了,因为它对每个点做预测时都必须使用整个数据集。如果避免这些计算就可以减少程序运行时间,从而环节因计算了增加带来的问题。

相关推荐
SunnyDays101121 分钟前
Python PDF 转 Markdown 详解(转换整个文档,特定页面,表格,扫描 PDF)
python·pdf 转 markdown·pdf 转 md·扫描 pdf 转 md·pdf 表格转 md
2601_9547064939 分钟前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
Jerry1 小时前
LeetCode 151. 反转字符串中的单词
算法
a1117763 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜4 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry4 小时前
LeetCode 541. 反转字符串 II
算法
Jerry4 小时前
LeetCode 344. 反转字符串
算法
Alan_6914 小时前
聊聊 Swagger/Postman/Apifox 的真实选型与 Python 项目实战
python·测试工具·postman
搞科研的小刘选手4 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议
Java小白笔记5 小时前
Codex config.toml配置实战指南
人工智能·算法·chatgpt·ai编程·集成学习