一 概述

通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是
一个钟形的曲线。而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕,因为它导致数据的
过拟合(overfitting),不符合数据真实的模型。

局部加权回归(LWR)是非参数学习方法。 首先参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的训练数据了,参数值是确定的。而非参数学习方法是这样一种算法:在预测新样本值时候每次都会重新训练数据得到新的参数值,也就是说每次预测新样本都会依赖训练数据集合,所以每次得到的参数值是不确定的。

具体的介绍在我之前的斯坦福机器学习笔记(一)中有详细介绍。链接为:http://blog.csdn.net/qq_30091945/article/details/61615501

这次运用的数据是来自《机器学习实战》这本书中第八章ex0文件中的数据。

二 代码

import numpy as np
import matplotlib.pyplot as pltdef LoadDataSet(file):""":param file:文件路径:return: 返回测试数据与标签"""ftrain = open(file)trainingset = []labelset = []for line in ftrain.readlines():LineArr = line.strip().split('\t')trainingset.append([float(LineArr[0]),float(LineArr[1])])labelset.append(float(LineArr[2]))return trainingset, labelsetdef LWRTest(traingxarr,xarr,yarr,k):Xmat = np.mat(xarr)Ymat = np.mat(yarr)# m是输入数据的个数,weights是单位矩阵m = np.shape(Xmat)[0]weights = np.eye(m)for i in range(m):diffmat = traingxarr - Xmat[i,:]weights[i,i] = np.exp(-(diffmat*diffmat.transpose())/(2.0*k**2))XT = Xmat.transpose()*(weights*Xmat)if np.linalg.det(XT) == 0:              #矩阵的行列式为0时不能进行之后的计算print('This Matrix is singular, cannot do inverse')return#theta是回归系数theta = XT.I*Xmat.transpose()*(weights*Ymat.transpose())ytest= traingxarr*thetareturn ytestdef LWR(trainingset,xarr,yarr,k):""":param trianingset:训练数据集:param xarr: 输入样本的横坐标:param yarr: 输入样本的纵坐标:param k: 带宽参数:return:返回预测值"""# m是输入数据的个数,weights是单位矩阵m = np.shape(trainingset)[0]ytest = np.zeros(m)for i in range(m):ytest[i] = LWRTest(trainingset[i],xarr,yarr,k)return  ytestdef Show(xarr,yarr,ytest,k):""":param xarr: 样本数据特征值:param ytest: LWR回归得到的预测:param yarr: 样本数据标记值"""xmat = np.mat(xarr)strInd = xmat[:, 1].argsort(0)xSort = xmat[strInd][:, 0, :]fig = plt.figure()ax = fig.add_subplot(1,1,1)ax.plot(xSort[:, 1], ytest[strInd])ax.scatter(xmat[:, 1].flatten().A[0], np.mat(yarr).T.flatten().A[0], s=2, c='red')title = "k = "title += str(k)ax.set_title(title)plt.savefig("D:\\Program Files (x86)\\机器学习\\斯坦福大学机器学习\\中文笔记\\Linear Regression\\LWR\\"+title+".jpg",dpi=400,bbox_inches='tight')plt.show()def run_main():"""这是主函数"""file = 'D:\\Program Files (x86)\\机器学习\\机器学习实战\\源代码\\Ch08\\ex0.txt'xarr,yarr = LoadDataSet(file)k = [1.0,0.01,0.003]for i in k:ytest = LWR(xarr,xarr,yarr,i)Show(xarr,yarr,ytest,i)if __name__ == '__main__':run_main()

下面是将上述代码利用面向对象程序设计进行重写的Python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/8/1614:07
# @Author  : DaiPuWei
# E-Mail   : 771830171@qq.com
# @Site    :
# @File    : LWR.py
# @Software: PyCharmimport numpy as np
import matplotlib as mpl
import matplotlib.pyplot as pltclass LWR:def __init__(self,train_data,train_predict):"""这是局部加权回归的构造函数:param train_data: 训练数据集:param train_predict: 训练数据集对应的预测值"""self.Train_Data = train_dataself.Train_Predict = train_predictdef Gaussian_Weight(self,data,k):"""这是计算测试数据data高斯核函数:param data: 预测数据:param k: 带宽系数"""# data的数据类型是np.array,那么利用dot方法进行矩阵运算的结果是矩阵,哪怕只有一个元素sum = np.sum(data*data)return np.exp(sum/(-2*k*k))def predict(self,test_data,k):"""这是预测测试数据结果的函数:param test_data:测试数据:param k: 带宽系数"""size = np.shape(self.Train_Data)[0]weights = np.zeros((size,size))for i in range(size):diff = test_data-self.Train_Data[i]weights[i,i] = self.Gaussian_Weight(diff,k)XT = self.Train_Data.T.dot(weights)inv = np.linalg.inv(XT.dot(self.Train_Data))theta = inv.T.dot(XT.dot(self.Train_Predict))test_predict = np.sum(theta.T*test_data)return test_predictdef Test(self,Test_Data,k):Test_Predict = []for test_data in Test_Data:test_predict = self.predict(test_data,k)Test_Predict.append(test_predict)Test_Predict = np.array(Test_Predict)return Test_Predictdef LoadDataSet(file):'''导入西瓜数据'''ftrain = open(file)trainingset = []labelset = []for line in ftrain.readlines():LineArr = line.strip().split('\t')trainingset.append([float(LineArr[0]),float(LineArr[1])])labelset.append(float(LineArr[2]))trainingset = np.array(trainingset)labelset = np.array(labelset).reshape((len(labelset),1))return trainingset, labelsetdef run_main():"""这是主函数"""path = "./ex0.txt"trainingset, labelset = LoadDataSet(path)# 解决画图是的中文乱码问题mpl.rcParams['font.sans-serif'] = [u'simHei']mpl.rcParams['axes.unicode_minus'] = FalseK = [1.0,0.1,0.01,0.003]for k in K:lwr = LWR(trainingset,labelset)testpredict = lwr.Test(trainingset,k)plt.scatter(trainingset[:,1],labelset,s =2,c='red')index = trainingset[:, 1].argsort(0)xdata = trainingset[index][:,1]plt.plot(xdata,testpredict[index],'b')plt.title("k=%f"%(k))plt.savefig("k=%f.jpg"%(k))plt.show()plt.close()if __name__ == '__main__':run_main()

下面是模型运行结果如下:
k = 1.0 (欠拟合)


k = 0.01(最佳拟合)

k = 0.003(过拟合)

机器学习实战--局部加权线性回归(LWR)相关推荐

  1. 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授

    程序示例–局部加权线性回归 现在,我们在回归中又添加了 JLwr() 方法用于计算预测代价,以及 lwr() 方法用于完成局部加权线性回归: # coding: utf-8 # linear_regr ...

  2. 【机器学习】线性回归之概率解释及局部加权线性回归

    Probabilistic interpretation 我们应该想这样一个问题:当我们讨论回归问题时,我们为什么要最小化平方损失函数?在CS229的课程中,吴恩达教授给我们做了详细的概率解释.现总结 ...

  3. 机器学习--局部加权线性回归

    文章目录 局部加权线性回归 预测鲍鱼年龄 局部加权线性回归 具体理论见上次笔记<线性回归> 预测鲍鱼年龄 import numpy as npclass LocalWeightedLine ...

  4. 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)

    1. 线性回归 线性回归根据最小二乘法直接给出权值向量的解析解(closed-form solution): w=(XTX)−1XTy w=(\mathbf X^T\mathbf X)^{-1}\ma ...

  5. 机器学习:局部加权线性回归(Locally Weighted Linear Regression)

    线性回归 先复习一下线性回归的损失函数: 我们的目标是使该函数最小,用矩阵表示为: 对参数w求导得: 令上式等于0可估计出回归系数w得最优解: 但线性回归往往容易欠拟合,除了使用更复杂得函数拟合,还可 ...

  6. 机器学习(回归五)——线性回归-局部加权线性回归

    前面博客有讲到,样本如果不是线性的可以通过多项式扩展,映射到多维空间来拟合.如此之外,还可以做一个局部加权线性回归(Locally Weighted Linear Regression,LWLR). ...

  7. 局部加权线性回归,线性回归高级版

    http://www.cnblogs.com/mooba/p/5947161.html 本来不想乱改别人的,但是他的不对,跑不出来有错误 我自己做了个数据 height weight 1.5 50 1 ...

  8. 机器学习18-局部加权线性回归

    局部加权线性回归 1.回归和特性的关系 回头来看知识点二,左图的拟合效果为underfitting(欠拟合),数据中的明显的结构关系没有被模型所捕获.右图的拟合效果为overfitting(过拟合), ...

  9. 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归

    局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归 locally weighted scatterplot smoothing,LOWE ...

最新文章

  1. 暑期集训5:并查集 线段树 练习题G: HDU - 1754
  2. 算法学习之路|统计同成绩学生
  3. Coolite Cool Study 3 MVC + Coolite 的例子
  4. 智能实验室-全能优化(Guardio) 4.96.0.850
  5. 对象属性结构赋值_(六)面向对象-下
  6. 简约的蓝色流量卡网站源码
  7. MTK 驱动(80)---MTK平台User版本开机异常/无法开机,如何抓取log
  8. 转 LCD的接口类型详解
  9. 任学堂说科技:穿越计算机迷雾,从零开始构建计算机
  10. 《认知天性》:讲述基于科学的学习方法
  11. Titan XP值不值?教你如何挑选深度学习GPU
  12. html5页面适配方法,H5案例分享:HTML5移动页面适配方法
  13. Java类的继承学生研究生类图_UML part3 类图、对象图
  14. apache ii评分怎么评_如何正确进行APACHE II评分
  15. 把自己曾经写的一个客户间聊天的程序与大家分享(2)
  16. 马毅老师讲座收获总结
  17. 复杂正态分布运用——独立正态分布组合概率、二项分布、泊松分布近似正态分布的运用
  18. 如何在C语言中添加自己的函数
  19. 钉钉氚云到金碟之三 DELPHI从氚云下载数据
  20. 智能工厂需要哪些条件和技术?

热门文章

  1. linux中ess33没有IP地址问题
  2. 全球喷气发动机收入预计2028年达到1189.6亿美元
  3. 计算机打游戏的硬件,玩电脑常见的六大误区 看看你犯了几条
  4. 六级单词词组积累(三)
  5. 解决在MyEclipse中,process报launching client等待的问题
  6. ipad未能与itunes连接到服务器,itunes与ipad无法连接怎么办-互盾苹果恢复精灵
  7. 一些学习的网站 (持续更新)
  8. 苹果手机投影到墙上_实用派amp;小零碎:快充数据线、实木理线器、小电视支架、高清投影仪……...
  9. Android Wifi密码查看器实现思路
  10. LP前缀是什么意思?