第8章 机器学习实战之线性回归

第二部分 回归

写在前面:

回归是监督学习的方法的延续。
监督学习指的是有目标变量或预测目标的机器学习方法 。
回归与分类的不同,就在于其目标变量是连续数值型 。分类输出的是标称型类别值。


主要内容:
● 线性回归
● 局部加权线性回归
● 岭回归和逐步线性回归
● 预测鲍鱼年龄和玩具售价

分类的目标变量是标称型数据,下面我们会对连续型的数据做出预测。

8.1 用线性回归找到最佳拟合曲线
优点:结果易于理解,计算上不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值和标称型数据

回归的目的是预测数值型的目标值。
最直接的方法就是依据输入写出一个目标值得计算公式。
假如想要预测姐姐的男友汽车功率的大小,可能需要下面这个公式:

HorsePower = 0.0015 * annualSalary - 0.99 * hoursListenimgToPulicRadio

这就是所谓的回归方程(regression equation) ,其中 0.0015 - 0.99 称作 回归系数(regression weights) ,求回归系数的过程就是回归。
具体的做法就是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值(这些运算就是求出二者的内积)。

值得一提的是,存在一种非线性回归的回归模型,该模型认为输出可能是输入的乘积,上面的功率计算公式也可以这样写:

HorsePower = 0.0015 * annualSalary / hoursListenimgToPulicRadio

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

假定输入的数据存放在矩阵 X 中 ,回归系数存放在向量 w 中。那么对于给定的数据X1,预测结果将会通过Y1 = X1^T * w 。
如果我们知道X对应的Y,如何找到w呢?方法就是找到使用误差最小的w 。这里的误差指的是预测y值和真是y值之间的差值。使用该误差的简单累加将使得正差值和负差值相互抵消,所以采用平方误差。

平方误差可以写为:
这里写图片描述

用矩阵表示还可以写作: (y - Xw)^T (y - Xw)-
若对w进行求导: 得,X ^(Y - Xw)
令 X ^(Y - Xw) = 0
解得(当前估计出的w的最优解)
这里写图片描述

上述的(X^T * X)^-1 ,这个公式是对矩阵求逆,但是矩阵的逆可能不存在,所以代码里面需要加一个判断条件。求解最佳w的方法也称之为 OLS,普通最小二乘法。

这里写图片描述

# 标准回归函数和数据导入函数 

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
#求最佳拟合直线
def standRegres(xArr,yArr):
    xMat = np.mat(xArr); yMat = np.mat(yArr)
    xTx = xMat.T * xMat 
    #判断矩阵是否可逆,np.linalg.det()矩阵求行列式(标量)
    if np.linalg.det(xTx) == 0.0:   
        print "This matrix is singular, cannot do inverse"
        return
    #ws = xTx.I * (xMat.T * yMat)
    ws = np.linalg.solve(xTx, xMat.T * yMat.T)
    return ws 

np.linalg.inv():矩阵求逆
np.linalg.det():矩阵求行列式(标量)

调用矩阵求行列式,如果行列式结果不为零,说明矩阵的逆是存在的。
其实对于上述代码,如果我们调用numpy下面的linalg线性代数库,我们的代码还可以写为:

ws = np.linalg.solve(xTx, xMat.T * yMatT)
In [3]: import regression

In [4]: reload(regression)
Out[4]: <module 'regression' from 'regression.pyc'>

In [5]: xArr,yArr = regression.loadDataSet(r"E:\ML\ML_source_code\mlia\Ch08\ex0.txt")

In [6]: ws = regression.standRegres(xArr,yArr)

In [7]: ws
Out[16]:
matrix([[ 3.00774324],[ 1.69532264]])

得到的结果ws,里面就存放着回归系数。
我们知道 xArr[:2] = [[1.0, 0.067732], [1.0, 0.42781]]
X0 = 1.0
我们假定偏移量就是一个常数。
在用内积预测y的时候,第一维将乘以前面的常数X0 , 第二维将乘以变量X1 。
假定X0 = 1,得 y = ws[0] + ws [1] *X1
这个y是实际预测给出的。

In [39]: xMat = np.mat(xArr)
    ...:
In [40]: yMat = np.mat(yArr)
    ...:
In [
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值