简单线性回归

来源:互联网 发布:淘宝商城包包大全 编辑:程序博客网 时间:2024/05/02 01:08
一、麦子学院部分
1. 介绍:回归(regression) Y变量为连续数值型(continuous numerical variable)
                    如:房价,人数,降雨量
             分类(Classification): Y变量为类别型(categorical variable)
                    如:颜色类别,电脑品牌,有无信誉
2、 简单线性回归介绍
       简单线性回归包含一个自变量(x)和一个因变量(y)
       以上两个变量的关系用一条直线来模拟
       如果包含两个以上的自变量,则称作多元回归分析(multiple regression)

3、简单线性回归模型
      被用来描述因变量(y)和自变量(X)以及偏差(error)之间关系的方程叫做回归模型
      简单线性回归的模型是:
      y = b0 + b1*x + ε
         
4、 估计的简单线性回归方程
          ŷ=b0+b1x
     这个方程叫做估计线性方程(estimated regression line)
     其中,b0是估计线性方程的纵截距
               b1是估计线性方程的斜率
               是在自变量x等于一个给定值的时候,y的估的估计值
5、  关于偏差ε的假定
      是一个随机的变量,均值为0
      ε的方差(variance)对于所有的自变量x是一样的
      ε的值是独立的
      ε满足正态分布
import numpy as npdef fitSLR(x, y):    dinominator = 0    numerator = 0        for i in range(0,len(x)):        numerator += (x[i] - np.mean(x))*(y[i] - np.mean(y))        dinominator += (x[i] - np.mean(x))**2            b1 = numerator/float(dinominator)    b0 = np.mean(y) - b1*np.mean(x)        return b0, b1def predict(x, b0, b1):    return b1+x*b0x = [1, 3, 2, 1, 3]y = [14, 24, 18, 17, 27]b0, b1=fitSLR(x, y)print "intercept:",b1,"slope",b0x_test = 6y_test = predict(x_test, b0, b1)print y_test         

二、机器学习部分
     回归与分类的不同,就在于目标变量是连续数值型,分类的目标标称型数据
   
回归的目的是预测数值型的目标值。最直接的办法是依据输人写出一个目标值的计算公式。假如你想要预测姐姐男友汽车的功率大小,可能会这么计算:

这就是所谓的回归方程,其中的0.0015和-0.99称作为回归系数,求这些回归系数的过程就是回归

回归的一般方法:

(1)收集数据:采用任意方法收集数据
(2)准备数据:回归需要数值型数据,标称型数据将被转化成二值型数据
(3)分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线在图上作为对比
(4)训练算法:求得回归系数
(5)测试算法:使用R2或者预测值和数据的拟合度,来分析模型的效果
(6)使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续性数据而不仅仅是离散的类别标签

假定输入数据存放在矩阵X中,而回归系数存放在向量w中,那么对于给定的数据X预测结果将会通过 给出,加入在给定数据X和Y的情况下怎么求得W?

误差最小化:

同过找到最小误差求W(误差是真实Y和预测Y之间的差值,使用该误差的简单累加将使得正误差和负误差相互抵消,所有我们采用平方误差)
                                          


我们可以通过调用Numpy库的矩阵方法求得w,即所谓最小二乘法(OLS)

  
#encoding:utf-8import numpy as pyfrom numpy import *def loadDataSet(filename):    datMat=[]    labelMat=[]    numfat = len(open(filename).readline().split('\t')) - 1    print numfat    for line in open(filename).readlines():        linArr =[]        curline = line.strip().split('\t')        for i in range(numfat):            linArr.append(float(curline[i]))        datMat.append(linArr)        labelMat.append(float(curline[-1]))    return datMat,labelMatdef standRegress(xArr,yArr):#返回相关系数 ws  最终会得到yhat = ws[0] + ws[1]*x,因为常量设的是1, 1*ws[0]=ws[0]        xMat = mat(xArr)    yMat = mat(yArr).T#将y化成n*1的向量    xTx = xMat.T*xMat#     print "xMat"#     print xMat#     print "yMat"#     print yMat#     print "xtx"#     print xTx#     print "----"    if linalg.det(xTx) == 0:#判断行列式是否为0  如果行列式为0 计算逆矩阵的时候会出现错误        print "this matrix is singular,cannot do inverse"        return    ws = xTx.I*xMat.T*yMat#其中w[0]是常变量 w[1]是x前面的系数    return ws   def show(xArr,yArr,ws):     import matplotlib.pyplot as plt    xMat = mat(xArr)    yMat = mat(yArr)       fig = plt.figure()    ax = fig.add_subplot(111)    xCopy = xMat.copy()    yHat = xCopy*ws    print yMat.T#     ax.plot(xMat[:,-1],yMat.T,'o')#‘o’画的是原点    ax.scatter(array(xMat[:,-1].T)[0],array(yMat)[0])#前两个参数接受一维数组    ax.plot(xCopy[:,1],yHat) #plot参数可以接受二维矩阵 只加两个参数  默认画的是线         plt.show() #     ax.scatter(array(xMat[:,-1].T)[0],array(yMat)[0])#前两个参数接受一维数组 #     import matplotlib.pyplot as plt#     from matplotlib.pyplot import scatter#     scatter(array(xMat[:,-1].T)[0],array(yMat)[0],color="blue",marker='o',s=30)#     plt.show()    returnxArr,yArr = loadDataSet('ex0.txt')# print yArrws = standRegress(xArr,yArr)show(xArr,yArr,ws)




原创粉丝点击