局部加权线性回归 | 冰水数据智能专题 | 3rd
数据分析——局部加权线性回归
局部加权线性回归(Locally Weighted Linear Regression,LWLR),针对于线性回归存在的欠 拟合现象,可以引入一些偏差得到局部加权线性回归对算法进行优化。
在该算法中,给待测 点附近的每个点赋予一定的权重,进而在所建立的子集上进行给予最小均方差来进行普通的 回归,分析可得回归系数 w 可表示为: w = (xTWx)-1xTWy,其中 W 为每个数据点赋予的权重,那么怎样求权重呢,核函数可以 看成是求解点与点之间的相似度,在此可以采用核函数,相应的根据预测点与附近点之间的 相似程度赋予一定的权重,在此选用最常用的高斯核,则权重可以表示为: w(i,i) = exp(|x(i) - x| / -2k2) 其中 K 为宽度参数,至于此参数的取值,目前仍没有一个确切的标准,只有一个范围的 描述,所以在算法的应用中,可以采用不同的取值分别调试,进而选取最好的结果。
python 编程实现
结合上述的分析,采用 python 编程实现,代码如下:
def lwlr(testPoint,xArr,yArr,k):
xMat = mat(xArr)
yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m))) for i in range(m): weights[i,i] = exp((testPoint - xMat[i,:])*(testPoint - xMat[i,:]).T / (-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0:
print "输入有误"
return
ws = xTx.I * xMat.T * weights * yMat
return testPoint * ws #为数据点中的每个数据调用
lwlr def lwlrTest(testArr,xArr,yArr,k):
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat 结合上述分析,我们可以选取不同的 k 值分别求得结果,进而采用 Matplotlib 绘图直观 的表示,在此,分别选取 k = 1,0.01,0.002,代码如下: #test x,y = loadData("ex0.txt") a = lwlr(x[0],x,y,0.002) b = lwlrTest(x,x,y,0.002)
#采用 matplotlib 绘制图像
xMat = mat(x) srtInd = xMat[:,1].argsort(0)#按升序排序,返回下标
xSort = xMat[srtInd][:,0,:]#将 xMat 按照升序排列
fig = plt.figure() ax = fig.add_subplot(111) ax.plot(xSort[:,1],b[srtInd]) ax.scatter(xMat[:,1].flatten().A[0],mat(y).T.flatten().A[0],s = 2,c = 'red') plt.show()
最终结果分别如下,依次为 k = 1,0.01,0.002 对应的结果:
可以看出,当 k = 1 时,结果和线性回归使用最小二乘法的结果相似,而 k=0.001 时噪 声太多,属于过拟合的情况,相比之下,k = 0.01 得到的结果更理想。虽然 LWLR 得到了较为 理想的结果,但是此种方法的缺点是在对每个点进行预测时都必须遍历整个数据集,这样无 疑是增加了工作量,并且该方法中的的宽度参数的取值对于结果的影响也是蛮大的。同时,当数据的特征比样本点还多当然是用线性回归和之前的方法是不能实现的,当特征比样本点 还多时,表明输入的矩阵 X 不是一个满秩矩阵,在计算(XTX)-1 时会出错。
- 程序猿是如何解决SQLServer占CPU100%的
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
- 分享一个自制的 .net线程池1
- 分享一个自制的 .net线程池2
- 基于百度翻译的简单爬虫翻译-- coding:utf-8 --访问网址模拟浏览器创建文件夹用一个text文件保存,文件名用单词名字
- .net采集网页方法大全(5种)
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
- 中文分词之结巴分词~~~附使用场景+demo(net)
- 用微信二维码登录自己的网站
- 2620: [Usaco2012 Mar]Haybale Restacking
- 1671: [Usaco2005 Dec]Knights of Ni 骑士
- 1592: [Usaco2008 Feb]Making the Grade 路面修整
- Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
- 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- numpy 矩阵形状调整:拉伸、变成一位数组的实例
- 使用Nibabel库对nii格式图像的读写操作
- ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
- 使用SimpleITK读取和保存NIfTI/DICOM文件实例
- php中上传文件的的解决方案
- python 实现两个npy档案合并
- PHP使用函数用法详解
- 读取nii或nii.gz文件中的信息即输出图像操作
- PHP实现SMTP邮件的发送实例
- 多个Laravel项目如何共用migrations详解
- PHP实现文字写入图片功能
- php中file_get_contents()函数用法实例
- PHP通过GD库实现验证码功能示例
- Thinkphp 5.0实现微信企业付款到零钱
- 使用npy转image图像并保存的实例