线性回归是确定两种及两种以上变量的相互依赖关系。在数据分析中,线性回归是最简单且最有效的分析方法。举个简单的例子,某商品的利润在售价为2元、5元、10元时分别为4元、10元、20元,我们很容易得出商品的利润与售价的关系符合直线:.在上面这个简单的一元线性回归方程中,我们称“2”为回归系数,即斜率为其回归系数,回归系数表示商品的售价(x)每变动一个单位,其利润(y)与之对应的变动关系。
1.线性回归
如上图所示,上图为一个简单的一元线性回归示意图,线性回归表示这些离散的点总体上“最逼近”哪条直线。同理,在二元线性回归中,离散的点在空间中最逼近哪个平面。其它多元线性回归亦是如此。线性回归在数据量化分析,数据预测方面有着重要应用。
2.最小二乘法
同样是上图,那这些离散的点总体上“最逼近”哪条直线呢,这需要一个量化。对于同一x,实际数据为y,回归方程的推断数据为ax,则误差d=y-ax。最小二乘法定义为,当,D最小时,回归方程的拟合度最高,根据求出a即可,对最小二乘法的定义方程进行微分求极值即可得出a。
对于多元变量,设
, ,
其回归方程为Y=Xa。同理,现在我们要求矩阵a的值,使得
取最小值即可。对上式进行微分求解(具体求解步骤可参考线性代数相关知识),可得
如果该矩阵满秩,则
上述便为最小二乘法的基本思想。
3.python实现
一元线性回归测试:
from numpy.linalg import inv # 矩阵求逆
from numpy import dot # 矩阵点乘
from numpy import mat # 二维矩阵
X = mat([1, 2, 3]).reshape(3, 1) # x为1,2,3
Y = mat([5, 10, 15]).reshape(3, 1) # y为5,10,15
a = dot(dot(inv(dot(X.T, X)), X.T), Y) # 最小二乘法公式
print(a)
首先,这里推荐一个公式的代码实现技巧,代码从内向外写,即X的转置与X点乘,再求逆, 再与X的转置点乘,再与Y点乘,一层层加括号即可。
由上述代码不难看出,y与x的关系为y=5x,下面我们看测试结果是否为5:
测试结果正确。
实战:
这里准备了一组数据,数据示例截图如下:
上述数据为某一商品的销售量与售价、服务投资和其它投资的对应关系,即我们要求出:
, ,
中,矩阵a。
代码如下:
import numpy as np
import pandas as pd
from numpy.linalg import inv # 矩阵求逆
from numpy import dot # 矩阵点乘
dataset = pd.read_csv('C:\\Users\\57105\\Desktop\\data.csv') # 读入数据
X = dataset.iloc[:, 2: 5] # x为所有行,2到4列
Y = dataset.iloc[:, 1] # y为所有行,第1列
a = dot(dot(inv(np.dot(X.T, X)), X.T), Y) # 最小二乘法求解公式
print(a)
测试结果:
即,对于单条数据,即,该回归方程反应了商品销售量与售价、服务投资和其它投资的关系。
上述便为线性回归的最小二乘法求解方式,关于线性回归的另一种求解方式—梯度下降法可见笔者相关文章。