您的位置:首页 > 其它

简单线性回归

2017-06-18 17:37 363 查看
一、麦子学院部分
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 np

def 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, b1
def predict(x, b0, b1):
return b1+x*b0

x = [1, 3, 2, 1, 3]
y = [14, 24, 18, 17, 27]

b0, b1=fitSLR(x, y)
print "intercept:",b1,"slope",b0
x_test = 6
y_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-8
import numpy as py
from 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,labelMat
def 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()
    return
xArr,yArr = loadDataSet('ex0.txt')
# print yArr
ws = standRegress(xArr,yArr)

show(xArr,yArr,ws)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: