线性回归及其Python实现(最大似然法)

来源:互联网 发布:软件开发费用明细 编辑:程序博客网 时间:2024/06/06 08:23

线性回归及其Python实现(最大似然法)

标签: Python 机器学习

本节内容总结于博主在牛客网机器学习特训营的笔记
参考资料:《机器学习实战》


目录

1.什么是线性回归
2.回归系数公式推导
3.线性回归Python实现
4.线性回归的应用
5.总结
6.附录

1.什么是线性回归(Linear Regression)

维基百科:线性回归
在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

按照博主自己的理解,线性就是因变量的变化量和自变量的变化量成比例(比如1个鸡蛋1元钱,2个鸡蛋2元钱,3个鸡蛋3元钱,其中价格变化量:鸡蛋变化量始终为1:1),数学上表现为一阶导数为常数。例如这个例子的线性回归方程就是y=x,一阶导数y=1

线性回归就是把因变量和自变量之间的关系看做线性的关系,然后求它们之间线性关系,感觉是一种减熵的效果,所以是回归。比如把人脚底板长度作为自变量,身高作为因变量,那么在这两种数据之间就可以做一个简单线性回归,可以得到脚底板长度和身高的关系式。公安人员可以依据这种方法从犯罪现场的脚印推断出犯罪嫌疑人身高。

2.回归系数公式推导

假设因变量为y,自变量为x1,x2,...,xn,则有

y=hw(x)=w0+w1x1+...+wnxn=i=0nwixi=wTx(1)

w0x0=1的系数,表示全局偏移量,在平面直线中的具体意义为截距,也作为自变量的一个维度。

因为种种原因,数据是按照一定的误差分布在拟合的曲线两边,否则只需要少数的几个数据就能拟合出完美的直线了。幸运的是,这种误差符合正态分布,所以从此处入手开始推导线性回归方程。

假设一共有m个样本,对于第i个数据(注意不是平方),有

y(i)=wTx(i)+ξ(i)(2)

其中ξ(i)概率密度为正态分布的概率密度

p(ξ(i))=12πσexp[(ξ(i))22σ2](3)

结合(2)(3)式有

p(y(i)|x(i);ξ(i))=12πσexp[(y(i)wTx(i))22σ2](4)

有了(4)式就可以得到似然函数

L(w)=i=1mp(y(i)|x(i);ξ(i))=i=1m12πσexp[(y(i)wTx(i))22σ2](5)

似然函数是根据样本估计分布参数w的,为什么相乘?可以理解为独立事件互不影响,它们同时发生的概率就是相乘,所以求出使得似然函数最大时的w^最接近理论中的w(点击查看最大似然估计的例子)。似然函数中有指数,取对数比较好计算,故有对数似然函数

l(w)===logL(w)logi=1m12πσexp[(y(i)wTx(i))22σ2]mlog12πσ1σ212i=1m(y(i)wTx(i))2(6)

我们取目标函数
J(w)=12i=1m(y(i)wTx(i))2(7)

似然函数有最大值时,目标函数有最小值,我们对(7)式进行求导即可得到w的估计值,不过先整理一下等式,用矩阵X表示mn维样本,每一行表示一个样本,则XM×N阶矩阵,将矩阵X整合到公式中
J(w)=12i=1m(y(i)wTx(i))2=12(Xwy)T(Xwy)(8)

对(8)式求向量w导数

J(w)=XTXwXTy(9)

求目标函数的最小值,那么最小值的点应该是驻点,有
0w=XTXwXTy=(XXT)1XTy(10)

(10)就是推导出求w的等式,这里要求XXT是可逆的,因此采集的样本的个数一定要比样本的维数多,而且最好没有没有无效的数据,所以样本的数量最好好远远大于样本的维数,这样计算的回归系数会更加的准确。

3.线性回归Python实现

代码主要分为两个部分,第一个部分模拟样本的采集,第二个部分是线性回归。
样本的生成公式为

y=0.5x+3+random4sinx

其中random是[0,1]之间的一个随机的小数。按照这个样本的计算的线性回归系数w,应该接近[3,0.5]T

import numpy as npimport matplotlib.pyplot as pltimport mathimport random#制造样本x = np.arange(0, 100, 0.2)xArr = []yArr = []for i in x:    lineX = [1]    lineX.append(i)    xArr.append(lineX)    yArr.append( 0.5 * i + 3 + random.uniform(0, 1) * 4 *math.sin(i) )#线性回归xMat = np.mat(xArr)yMat = np.mat(yArr).TxTx = xMat.T * xMatif np.linalg.det(xTx) == 0.0:    print "Can't inverse"ws = xTx.I * xMat.T * yMatprint wsy = xMat * ws#画图plt.title("linear regression")plt.xlabel("independent variable")plt.ylabel("dependent variable")plt.plot(x, yArr, 'go')plt.plot(x, y, 'r', linewidth = 2)plt.show()

样本数据和回归直线:

4.线性回归的应用

线性回归主要有两个用处,一个是预测,一个是分类。

4.1预测

以上面的线性回归为例子,我们只采集了自变量为[0,100]的数据,但是经过线性回归方程则可以预测出自变量在[100,200]内对应的因变量。常见的应用是GDP,石油价格和股票价格趋势预测(参考维基百科)。

4.2分类


上图中有圆形样本点和三角形样本点,中间红色的线是回归方程所对应的曲线,线性回归方程是y=f(x)。可以做一个简单的判断,对于一个样本(x0,y0),可以计算y=f(x0),当y<y0时,可以推测该样本为圆形,否则为三角形样本点。

5.总结

  • 线性回归应用广泛,计算简单,应当明白其推导过程和最终求解表达式
  • 本文介绍了最大似然法求回归系数,还有梯度下降法求回归系数
  • 线性回归最后的结果是一个直线,可能还不能达到我们的要求,比如本例想要得到接近y=0.5x+3+4sinx的结果,则可以使用局部加权线性回归
  • 对于XXT不可逆的情况,可用岭回归方法
  • 最后推荐3个良心资料
    • Harrington P. 机器学习实战[J]. 人民邮电出版社, 北京, 2013.
    • 李航. 统计学习方法[J]. 2012.
    • 维基百科(有离线版)

6.附录

6.1维基百科中最大似然估计的一个例子


点击查看原图

0 0