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

线性回归

算法优缺点:

  • 优点:结果易于理解,计算不复杂
  • 缺点:对非线性数据拟合不好
  • 适用数据类型:数值型和标称型

算法思想:

这里是采用了最小二乘法计算(证明比较冗长略去)。这种方式的优点是计算简单,但是要求数据矩阵X满秩,并且当数据维数较高时计算很慢;这时候我们应该考虑使用梯度下降法或者是随机梯度下降(同Logistic回归中的思想完全一样,而且更简单)等求解。这里对估计的好坏采用了相关系数进行度量。

数据说明:

这里的txt中包含了x0的值,也就是下图中前面的一堆1,但是一般情况下我们是不给出的,也就是根据一个x预测y,这时候我们会考虑到计算的方便也会加上一个x0。

数据是这样的

函数:

loadDataSet(fileName):
读取数据。
standRegres(xArr,yArr)
普通的线性回归,这里用的是最小二乘法


plotStandRegres(xArr,yArr,ws)
画出拟合的效果
calcCorrcoef(xArr,yArr,ws)
计算相关度,用的是numpy内置的函数

结果:

局部加权线性回归(Locally Weighted Linear Regression)

算法思想:

这里的想法是:我们赋予预测点附近每一个点以一定的权值,在这上面基于最小均方差来进行普通的线性回归。这里面用“核”(与支持向量机相似)来对附近的点赋予最高的权重。这里用的是高斯核:

函数:

lwlr(testPoint,xArr,yArr,k=1.0)
根据计算公式计算出再testPoint处的估计值,这里要给出k作为参数,k为1的时候算法退化成普通的线性回归。k越小越精确(太小可能会过拟合)求解用最小二乘法得到如下公式:


lwlrTest(testArr,xArr,yArr,k=1.0)
因为lwlr需要指定每一个点,这里把整个通过循环算出来了
lwlrTestPlot(xArr,yArr,k=1.0)
将结果绘制成图像

结果:

  1.  1 from numpy import *
     2 def loadDataSet(fileName):
     3     numFeat = len(open(fileName).readline().split(‘\t‘)) - 1
     4     dataMat = []; labelMat = []
     5     fr = open(fileName)
     6     for line in fr.readlines():
     7         lineArr =[]
     8         curLine = line.strip().split(‘\t‘)
     9         for i in range(numFeat):
    10             lineArr.append(float(curLine[i]))
    11         dataMat.append(lineArr)
    12         labelMat.append(float(curLine[-1]))
    13     return dataMat,labelMat
    14 def standRegres(xArr,yArr):
    15     xMat = mat(xArr)
    16     yMat = mat(yArr).T
    17     xTx = xMat.T * xMat
    18     if linalg.det(xTx) == 0.0:
    19         print ‘This matrix is singular, cannot do inverse‘
    20         return
    21     ws = xTx.I * (xMat.T * yMat)
    22     return ws
    23 def plotStandRegres(xArr,yArr,ws):
    24     import matplotlib.pyplot as plt
    25     fig = plt.figure()
    26     ax = fig.add_subplot(111)
    27     ax.plot([i[1] for i in xArr],yArr,‘ro‘)
    28     xCopy = xArr
    29     print type(xCopy)
    30     xCopy.sort()
    31     yHat = xCopy*ws
    32     ax.plot([i[1] for i in xCopy],yHat)
    33     plt.show()
    34 def calcCorrcoef(xArr,yArr,ws):
    35     xMat = mat(xArr)
    36     yMat = mat(yArr)
    37     yHat = xMat*ws
    38     return corrcoef(yHat.T, yMat)
    39 def lwlr(testPoint,xArr,yArr,k=1.0):
    40     xMat = mat(xArr); yMat = mat(yArr).T
    41     m = shape(xMat)[0]
    42     weights = mat(eye((m)))
    43     for j in range(m):
    44         diffMat = testPoint - xMat[j,:]
    45         weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
    46     xTx = xMat.T * (weights * xMat)
    47     if linalg.det(xTx) == 0.0:
    48         print "This matrix is singular, cannot do inverse"
    49         return
    50     ws = xTx.I * (xMat.T * (weights * yMat))
    51     return testPoint * ws
    52 def lwlrTest(testArr,xArr,yArr,k=1.0):
    53     m = shape(testArr)[0]
    54     yHat = zeros(m)
    55     for i in range(m):
    56         yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    57     return yHat
    58 def lwlrTestPlot(xArr,yArr,k=1.0):
    59     import matplotlib.pyplot as plt
    60     yHat = zeros(shape(yArr))
    61     xCopy = mat(xArr)
    62     xCopy.sort(0)
    63     for i in range(shape(xArr)[0]):
    64         yHat[i] = lwlr(xCopy[i],xArr,yArr,k)
    65     fig = plt.figure()
    66     ax = fig.add_subplot(111)
    67     ax.plot([i[1] for i in xArr],yArr,‘ro‘)
    68     ax.plot(xCopy,yHat)
    69     plt.show()
    70     #return yHat,xCopy
    71 def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays
    72     return ((yArr-yHatArr)**2).sum()
    73 def main():
    74     #regression
    75     xArr,yArr = loadDataSet(‘ex0.txt‘)
    76     ws = standRegres(xArr,yArr)
    77     print ws
    78     #plotStandRegres(xArr,yArr,ws)
    79     print calcCorrcoef(xArr,yArr,ws)
    80     #lwlr
    81     lwlrTestPlot(xArr,yArr,k=1)
    82 if __name__ == ‘__main__‘:
    83     main()


来自为知笔记(Wiz)

时间: 2024-10-19 07:32:51

线性回归和局部加权线性回归的相关文章

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

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

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

线性回归 用线性回归找到最佳拟合直线 回归的目的是预测数值型数据,根据输入写出一个目标值的计算公式,这个公式就是回归方程(regression equation),变量前的系数(比如一元一次方程)称为回归系数(regression weights).求这些回归系数的过程就是回归. 假设输入数据存放在矩阵X 中,回归系数存放在向量w 中,那么对于数据X 1  的预测结果可以用Y 1 =X T 1 w 得出.我们需要找到使误差最小的w ,但是如果使用误差之间的累加的话,那么正负误差将会抵消,起不到效

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

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

【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

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

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

Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现

鲁棒局部加权回归 算法参考文献: (1) Robust Locally Weighted Regression and Smoothing Scatterplots (Willism_S.Cleveland) (2) 数据挖掘中强局部加权回归算法实现 (虞乐,肖基毅) R实现 #Robust Locally Weighted Regression 鲁棒局部加权回归 # 一元样本值x,y ;待预测样本点xp ;f局部加权窗口大小(一般取1/3~2/3);d局部加权回归阶数; #time鲁棒局部加权

局部加权回归、欠拟合、过拟合 - Andrew Ng机器学习公开课笔记1.3

本文主要讲解局部加权(线性)回归.在讲解局部加权线性回归之前,先讲解两个概念:欠拟合.过拟合,由此引出局部加权线性回归算法. 欠拟合.过拟合 如下图中三个拟合模型.第一个是一个线性模型,对训练数据拟合不够好,损失函数取值较大.如图中第二个模型,如果我们在线性模型上加一个新特征项,拟合结果就会好一些.图中第三个是一个包含5阶多项式的模型,对训练数据几乎完美拟合. 模型一没有很好的拟合训练数据,在训练数据以及在测试数据上都存在较大误差,这种情况称之为欠拟合(underfitting). 模型三对训练

局部加权回归、欠拟合、过拟合-Andrew Ng机器学习公开课笔记1.3

本文主要讲解局部加权(线性)回归.在讲解局部加权线性回归之前,先讲解两个概念:欠拟合.过拟合,由此引出局部加权线性回归算法. 欠拟合.过拟合 如下图中三个拟合模型.第一个是一个线性模型,对训练数据拟合不够好,损失函数取值较大.如图中第二个模型,如果我们在线性模型上加一个新特征项,拟合结果就会好一些.图中第三个是一个包含5阶多项式的模型,对训练数据几乎完美拟合. 模型一没有很好的拟合训练数据,在训练数据以及在测试数据上都存在较大误差,这种情况称之为欠拟合(underfitting). 模型三对训练

机器学习-局部加权回归

Locally weighted regression,局部加权回归  对于线性回归,问题是选取的特征的个数和什么特征会极大影响fit的效果. 比如下图,是分布使用下面几个模型进行拟合的 :    通常会认为第一个模型underfitting(欠拟合),而第三个模型overfitting(过拟合),第二个模型相对比较好的fit到训练集 所以可以看出,找出一个全局的线性模型去fit整个训练集,是个比较困难的工作,因为选择特征成为一个关键的因素. 局部加权线性回归的思路,就是我不需要去fit整个训练