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

线性回归

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

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

假设输入数据存放在矩阵X 中,回归系数存放在向量w 中,那么对于数据X 1  的预测结果可以用Y 1 =X T 1 w 得出。我们需要找到使误差最小的w ,但是如果使用误差之间的累加的话,那么正负误差将会抵消,起不到效果,所以采用平方误差。如下:

∑ i=1 n (y i ?x T i w) 2

用矩阵表示:(Y?Xw) T (Y?Xw) 。对W 求导得到X T (Y?Xw) ,令其等于零得到w 的最佳估计:

w ^ =(X T X) ?1 X T y

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

from numpy import *
def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split(‘\t‘))-1
    dataMat = []; 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分隔,并且最后一个值是目标值。接下来计算回归系数:

def standRegres(xArr, yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws

该函数首先读入x 和y 数组,然后将它们转换成矩阵,之后根据公式计算平方误差,注意,需要对X T X 求逆,此时需要判断它的行列式是否为0,行列式等于0的矩阵无法求逆,可以直接使用linalg.det() 来计算行列式。好了,我们来看看效果,首先读入数据:

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

我们先看看前两条数据:

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

第一个值总是等于1.0,也就是x 0  ,假定偏移量是一个常数,第二个值是x 1  。

现在看看计算回归系数函数效果:

 ws = standRegres(xArr,yArr)
 print ws

[[ 3.00774324]
 [ 1.69532264]]

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

xMat = mat(xArr)
yMat = mat(yArr)
yHat = xMat*ws

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

import matplotlib.pyplot as plt
fig = 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*ws
ax.plot(xCopy[:,1], yHat)
plt.show()

我们来看看效果:

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

局部加权线性回归

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

w ^ =(X T WX) ?1 X T Wy

其中W 是一个矩阵,用来给每个数据点赋予权重。

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

w(i,i)=exp(|x i ?x|?2k 2  )

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

def lwlr(testPoint, xArr, yArr, k = 1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = 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:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws

def lwlrTest(testArr, xArr, yArr, k=1.0):
    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,:]

然后使用Matplotlib绘图:

 fig = plt.figure()
 ax = fig.add_subplot(111)
 ax.plot(xSort[:,1],yHat[srtInd])
 ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0], s = 2, c = ‘red‘)
 plt.show()

当k=1.0时,权重很大,相当于将所有数据视为等权重,得出的最佳拟合直线与标准线性回归一致:

当使用k=0.01时:

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

结果如下:

当使用k=0.003时:

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

结果如下:

由上三种结果可以看出,在k=1.0时,得出的拟合曲线欠拟合,k=0.01时,曲线拟合效果不错,而k=0.003时,又有些过拟合。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 09:22:14

机器学习实战线性回归局部加权线性回归笔记的相关文章

【CS229笔记一】监督学习,线性回归,LMS算法,正态方程,概率解释和局部加权线性回归

监督学习 对于一个房价预测系统,给出房间的面积和价格,以面积和价格作坐标轴,绘出各个点. 定义符号: \(x_{(i)}\)表示一个输入特征\(x\). \(y_{(i)}\)表示一个输出目标\(y\). \((x_{(i)},y_{(i)})\)表示一个训练样本. \(\left\{(x_{(i)},y_{(i)});i=1,\dots,m\right\}\)代表m个样本,也称为训练集. 上标\((i)\)代表样本在训练集中的索引. \(\mathcal{X}\)代表输入值的空间,\(\mat

线性回归和局部加权线性回归

线性回归 算法优缺点: 优点:结果易于理解,计算不复杂 缺点:对非线性数据拟合不好 适用数据类型:数值型和标称型 算法思想: 这里是采用了最小二乘法计算(证明比较冗长略去).这种方式的优点是计算简单,但是要求数据矩阵X满秩,并且当数据维数较高时计算很慢:这时候我们应该考虑使用梯度下降法或者是随机梯度下降(同Logistic回归中的思想完全一样,而且更简单)等求解.这里对估计的好坏采用了相关系数进行度量. 数据说明: 这里的txt中包含了x0的值,也就是下图中前面的一堆1,但是一般情况下我们是不给

局部加权线性回归(Locally weighted linear regression)

首先我们来看一个线性回归的问题,在下面的例子中,我们选取不同维度的特征来对我们的数据进行拟合. 对于上面三个图像做如下解释: 选取一个特征,来拟合数据,可以看出来拟合情况并不是很好,有些数据误差还是比较大 针对第一个,我们增加了额外的特征,,这时我们可以看出情况就好了很多. 这个时候可能有疑问,是不是特征选取的越多越好,维度越高越好呢?所以针对这个疑问,如最右边图,我们用5揭多项式使得数据点都在同一条曲线上,为.此时它对于训练集来说做到了很好的拟合效果,但是,我们不认为它是一个好的假设,因为它不

Locally Weighted Linear Regression 局部加权线性回归-R实现

线性回归容易出现过拟合或欠拟合的问题. 局部加权线性回归是一种非参数学习方法,在对新样本进行预测时,会根据新的权值,重新训练样本数据得到新的参数值,每一次预测的参数值是不相同的. 权值函数: t用来控制权值的变化速率(建议对于不同的样本,先通过调整t值确定合适的t) 不同t值下的权值函数图像: 局部加权线性回归R实现: #Locally Weighted Linear Regression 局部加权回归(非参数学习方法) ##x为数据矩阵(mxn m:样本数 n:特征数 );y观测值(mx1);

matlab练习程序(局部加权线性回归)

通常我们使用的最小二乘都需要预先设定一个模型,然后通过最小二乘方法解出模型的系数. 而大多数情况是我们是不知道这个模型的,比如这篇博客中z=ax^2+by^2+cxy+dx+ey+f 这样的模型. 局部加权线性最小二乘就不需要我们预先知道待求解的模型,因为该方法是基于多个线性函数的叠加,最终只用到了线性模型. 计算线性模型时引入了一个加权函数: 来给当前预测数据分配权重,分配机制是:给距离近的点更高的权重,给距离远的点更低的权重. 公式中的k类似与高斯函数中的sigma. 当sigma变大时,函

机器学习实战(二)个人笔记

程序主体: 以kNN算法为基础 增加了文件数据导入函数 增加了可视化操作 增加了算法错误率判定 1 # -*- coding:utf-8 -*- 2 from numpy import * 3 import operator 4 import math 5 import matplotlib 6 import matplotlib.pyplot as plt 7 import numpy as np 8 import random 9 import collections 10 11 def c

机器学习实战3:决策树学习笔记(python)

决策树就是在已知各种情况发生概率的情况下,通过构造决策树,评价项目风险,判断其可行性的决策分析方法,它是运用概率分析的一种图解法. 优缺点分析: 优点:计算复杂度不高,输出结果较直观,易于理解,对中间值的缺失不敏感,可以处理不相关特征数据 缺点:可能产生过度匹配 创建数据集并计算其熵值: from math import log import operator def createDataSet(): dataSet = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0,

机器学习实战(一)个人笔记

1 from numpy import * 2 import operator 3 import math 4 5 def createDataSet(): 6 group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) 7 labels = ['A','A','B','B'] 8 return group,labels 9 def classify0(inX,dataSet,labels,k): 10 dataSetSize = dataSet.sha

机器学习day13 机器学习实战线性回归

这两天学习了回归的相关知识,后面本来有个实战案例,但无奈不能上网站抓取信息不能实现,还有一个缩减的方法前向逐步回归没有看,lasso的简化版,只看了岭回归. 回归与分类的区别:回归的标签值为连续的数值,我们做的是预测未知点的标签数值,分类的标签值为类别,我们做的是预测其他样本的分类. 相关系数的计算: 有柯西不等式可以得到相关系数的绝对值|r| < 1.-1 < r < 1,r越趋近1或-1相关性越大,越能用直线表示,r > 0说明x,y同增,r < 0说明x,y同减. 直线