zoukankan      html  css  js  c++  java
  • 线性回归 python小样例

    线性回归
    优点:结果易于理解,计算上不复杂
    缺点:对非线性的数据拟合不好
    适用数据类型:数值型和标称型数据
    horse=0.0015*annualSalary-0.99*hoursListeningToPulicRadio
    这就是所谓的回归方程,其中的0.0015和-0.99称作回归系数,
    求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了
    具体的做法就是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值
    回归的一般方法
    (1)收集数据:采用任意方法收集数据
    (2)准备数据:回归需要数值型数据,标称型数据将被转成二值型数据(3)分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法球的新回归系数之后,
    可以将新拟合线绘在图上作为对比
    (4)训练算法:找到回归系数
    (5)测试算法:适用R2或者预测值和数据的拟合度,来分析模型的效果
    (6)使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,
    因为这样可以预测连续型数据而不仅仅是离散的类别标签
    应当怎样从一大堆数据中求出回归方程呢?嘉定输入数据存放在举着呢X中,而回归系数存放在向量w中,那么对于
    给定的数据x1,预测结果将会通过y1=x1^T *W给出。现在的问题是,手里有些x和对应的y值,怎样才能找到W呢?
    一个常用的方法就是找出使误差最小的w。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加
    将使得正差值和负差值相互抵消,所以我们采用平方误差

     1 from numpy import *
     2 
     3 def loadDataSet(fileName):      #general function to parse tab -delimited floats
     4     numFeat = len(open(fileName).readline().split('	')) - 1 #get number of fields
     5     dataMat = []; labelMat = []
     6     fr = open(fileName)
     7     for line in fr.readlines():
     8         lineArr =[]
     9         curLine = line.strip().split('	')
    10         for i in range(numFeat):
    11             lineArr.append(float(curLine[i]))
    12         dataMat.append(lineArr)
    13         labelMat.append(float(curLine[-1]))
    14     return dataMat,labelMat
    15 
    16 def standRegres(xArr,yArr):
    17     xMat = mat(xArr); yMat = mat(yArr).T
    18     xTx = xMat.T*xMat
    19     if linalg.det(xTx) == 0.0:
    20         print("This matrix is singular, cannot do inverse")
    21         return
    22     ws = xTx.I * (xMat.T*yMat)
    23     return ws

    线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。
    显而易见,如果模型欠拟合将不能取得较好的预测结果。所以有些方法允许在估计中引入一些偏差,
    从而降低预测的均方误差。
    其中一个方法是局部加权线性回归(LWLR)。在该算法中,我们给待预测点附近的每个点赋予一定的权重;

     1 def lwlr(testPoint,xArr,yArr,k=1.0):
     2     xMat = mat(xArr); yMat = mat(yArr).T
     3     m = shape(xMat)[0]
     4     weights = mat(eye((m)))
     5     for j in range(m):                      #next 2 lines create weights matrix
     6         diffMat = testPoint - xMat[j,:]     #
     7         weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
     8     xTx = xMat.T * (weights * xMat)
     9     if linalg.det(xTx) == 0.0:
    10         print("This matrix is singular, cannot do inverse")
    11         return
    12     ws = xTx.I * (xMat.T * (weights * yMat))
    13     return testPoint * ws

    如果数据的特征比样本点还多应该怎么办?是否可以使用线性回归和之前的方法来做预测?
    答案是否定的,即不能再使用前面介绍的方法,这是因为在计算(x^T*x)^-1的时候会出错
    如果特征比样本点还多(n>m),也就是说输入数据的矩阵x不是满秩矩阵,非满秩矩阵在求逆
    的时会出现问题,为解决这个问题,专家引入了岭回归的概念。简单来说,岭回归就是在矩阵
    X^T*X上加一个λI从而使得矩阵非奇异,进而能对x^T*x+λI求逆。其中I是单位矩阵,λ是用户定

    义的一个数值。

    岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。Lasso难以求解,但可以使用计算简便的逐步线性回归方法来求得近似的结果

    缩减法还可以看作是对一个模型增加偏差的同时减少方差。偏差方差分析折中是一个重要的概念,可以帮助我们理解现有规模并做出改进,从而得到更好的模型

  • 相关阅读:
    MySQL系列(二)--数据类型
    并发和多线程(十)--锁状态概念
    并发和多线程(九)--并发容器J.U.C和lock简介
    并发和多线程(八)--线程安全、synchronized、CAS简介
    Nuxt 2.3.X 配置babel
    Nuxt 2.3.X 配置sass
    vscode写vue模板--代码片段
    ES6和ES5中的this指向问题
    TypeScript -- JavaScript的救赎
    Pycharm 查看一个类的继承关系图
  • 原文地址:https://www.cnblogs.com/zhibei/p/9355907.html
Copyright © 2011-2022 走看看