机器学习实战线性回归局部加权线性回归笔记

下载CSDN移动客户端微信开发学习路线高级篇上线《Cocos3D与Shader从入门到精通》套餐限时优惠恭喜博主张安站新书上市

机器学习实战线性回归局部加权线性回归笔记

分类:

线性回归 用线性回归找到最佳拟合直线

回归的目的是预测数值型数据,根据输入写出一个目标值的计算公式,这个公式就是回归方程(regression equation),变量前的系数(比如一元一次方程)称为回归系数(regression weights)。求这些回归系数的过程就是回归。

假设输入数据存放在矩阵的预测结果可以用得出。我们需要找到使误差最小的

用矩阵表示:

首先我们导入数据,代码如下:

from numpy import *:numFeat = len(open(fileName).readline().split(‘\t’))-1dataMat = []; labelMat = []fr = open(fileName)for line in fr.readlines():lineArr = []curLine = line.strip().split(‘\t’)for i in range(numFeat):lineArr.append(float(curLine[i]))dataMat.append(lineArr)labelMat.append(float(curLine[-1]))return dataMat, labelMat

这部分数据是由tap分隔,并且最后一个值是目标值。接下来计算回归系数:

:xMat = mat(xArr); yMat = mat(yArr).TxTx = xMat.T*xMatif linalg.det(xTx) == 0.0:ws = xTx.I * (xMat.T*yMat)return ws

该函数首先读入求逆,此时需要判断它的行列式是否为0,行列式等于0的矩阵无法求逆,可以直接使用linalg.det() 来计算行列式。好了,我们来看看效果,首先读入数据:

xArr,yArr=loadDataSet(‘ex0.txt’)

我们先看看前两条数据:

print xArr[0:2][[1.0, 0.067732], [1.0, 0.42781]]

第一个值总是等于1.0,也就是,假定偏移量是一个常数,第二个值是。 现在看看计算回归系数函数效果:

ws = standRegres(xArr,yArr) print ws[[ 3.00774324] [ 1.69532264]]

现在得到了回归系数,那么我们可以通过回归方程进行预测yHat:

为方便观察,我们画出数据集散点图:

import matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xMat[:,1].flatten().A[0], yMat.T[:,0].flatten().A[0])

现在绘制最佳拟合直线,那么需要画出预测值yHat,如果直线上数据点次序混乱,绘图时将会出现问题,所以要将点按照升序排序:

xCopy = xMat.copy()xCopy.sort(0)yHat=xCopy*wsax.plot(xCopy[:,1], yHat)plt.show()

我们来看看效果:

最佳拟合直线方法将数据视为直线进行建模,但图中的数据集似乎还有更好的拟合方式。

局部加权线性回归

线性回归可能出现欠拟合的现象,如上图所示,因为它求的是具有最小均方误差的无偏差估计。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。其中一个方法就是使用局部加权线性回归(Locally Weighted Linear Regression,LWLR),我们给待测点附近的每个点赋予一定的权重,是用此方法解出的回归系数如下:是一个矩阵,用来给每个数据点赋予权重。

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

下面来编写局部加权线性回归:

):xMat = mat(xArr); yMat = mat(yArr).Tm = shape(xMat)[0]# eye()返回一个对角线元素为1,其他元素为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:ws = xTx.I * (xMat.T * (weights * yMat))return testPoint * ws):m = shape(testArr)[0]yHat = zeros(m)for i in range(m):yHat[i] = lwlr(testArr[i],xArr,yArr,k)return yHat

lwlr()函数得到的是单点的估计,为得到所有点的估计,可以调用lwlrTest()函数。

yHat = lwlrTest(xArr,xArr,yArr,1.0)

下面绘出估计值和原始值,看看yHat的拟合效果。需要将数据点按序排列。

xMat = mat(xArr)srtInd = xMat[:,1].argsort(0)xSort = xMat[srtInd][:,0,:]去陌生的街角,去做一切我们曾经或现在也很想做的事情,

机器学习实战线性回归局部加权线性回归笔记

相关文章:

你感兴趣的文章:

标签云: