[置顶] 《机器学习实战》--局部加权线性回归(LWR)
2017-03-17 19:53
134 查看
一 概述
通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是一个钟形的曲线。而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕,因为它导致数据的
过拟合(overfitting),不符合数据真实的模型。
局部加权回归(LWR)是非参数学习方法。 首先参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的训练数据了,参数值是确定的。而非参数学习方法是这样一种算法:在预测新样本值时候每次都会重新训练数据得到新的参数值,也就是说每次预测新样本都会依赖训练数据集合,所以每次得到的参数值是不确定的。
具体的介绍在我之前的斯坦福机器学习笔记(一)中有详细介绍。链接为:http://blog.csdn.net/qq_30091945/article/details/61615501
这次运用的数据是来自《机器学习实战》这本书中第八章ex0文件中的数据。
二 代码
import numpy as np import matplotlib.pyplot as plt def 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, labelset def 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*theta return ytest def 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 ytest def 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()
下面是模型运行结果如下:
k = 1.0 (欠拟合)
k = 0.01(最佳拟合)
k = 0.003(过拟合)
相关文章推荐
- LWR 局部加权线性回归算法
- [置顶] 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3
- 局部加权线性回归(LWLR)
- CS229学习笔记之概率解释与局部加权线性回归
- 加权最小二乘法与局部加权线性回归
- 线性回归和局部加权线性回归
- 局部加权线性回归
- 线性回归、局部加权线性回归、岭回归、lasso及逐步线性回归
- 线性回归和局部加权线性回归
- 线性回归和局部加权回归
- 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)
- 机器学习与算法(8)--局部加权学习算法(LWR)
- 局部加权线性回归(Locally weighted linear regression)
- 线性回归和局部加权线性回归
- 线性回归和局部加权线性回归
- 局部加权线性回归
- 局部加权线性回归(内含代码)
- 局部加权线性回归
- 局部加权线性回归
- 机器学习之局部加权线性回归