局部加权线性回归
线性回归的一个问题可能是有可能出现欠拟合(如下图所示样本),因为它求的是具有最小均方误差的无偏估计。如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。其中的一个方法是局部加权线性回归。在该算法中,我们给待预测点附近的每一个点赋予一定的权重,在这个子集上基于最小均方差来进行普通的回归。与KNN类似,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数w的形式如下:
其中是一个矩阵,用来给每个数据点赋予权重。
局部线性加权使用核(类似支持向量机中的核)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
下图可以看到对应不同值,高斯核对应的样本覆盖范围。
这样就构建了一个只含有对角元素的权重矩阵,并且点与越近,将会越大。上述公式包含一个需要用户指定的参数k,它决定了对附近的点赋予多大的权重,这也是使用局部线性加权回归时唯一需要考虑的参数,在下图中可以看到参数与权重的关系。(实际应用中k可以通过K折交叉验证确定)
1 def lwlr(testPoint, xArr, yArr, k=1.0): 2 xMat = mat(xArr); yMat = mat(yArr).T 3 m = shape(xMat)[0] 4 weights = mat(eye((m))) 5 for j in range(m): 6 diffMat = testPoint - xMat[j, :] 7 weights[j, j] = exp(diffMat * diffMat.T / (-2.0 * k ** 2.0)) 8 xTx = xMat.T * (weights * xMat) 9 if linalg.det(xTx) == 0.0: 10 print("This matrix is singular, cannot do inverse") 11 return 12 ws = xTx.I * (xMat.T * (weights * yMat)) 13 return testPoint * ws 14 15 def lwlrTest(testArr, xArr, yArr, k=1.0): 16 m = shape(testArr)[0] 17 yHat = zeros(m) 18 for i in range(m): 19 yHat[i] = lwlr(testArr[i], xArr, yArr, k) 20 return yHat
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?