线性回归

1、基本概念

线性回归假设因变量与自变量之间存在线性关系,因变量可通过自变量线性叠加而得到,即因变量和自变量之间可用如下方式表示。

线性回归取出系数 Python python线性回归方程_多项式

式中

线性回归取出系数 Python python线性回归方程_拟合_02

为自变量,

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_03

为权重系数,

线性回归取出系数 Python python线性回归方程_多项式_04

为偏置。

线性回归就是要解决如何利用样本求取

线性回归取出系数 Python python线性回归方程_线性回归_05

拟合出上述表达式,获得最佳直线的问题。最常用的就是最小二乘法。

最小二乘法:最佳拟合线下,将已知样本的自变量代入拟合直线,得到的观测值与实际值之间的误差平方和最小。

2、一元线性回归

为了好理解,先从简单的情况开始,即一元线性回归。

2.1、利用方程组来解系数

假设因变量和自变量可用如下函数表示:

线性回归取出系数 Python python线性回归方程_拟合_06

对于任意样本点

线性回归取出系数 Python python线性回归方程_拟合_07

有误差

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_08

误差平方和

线性回归取出系数 Python python线性回归方程_拟合_09

那什么样的a和b会使得误差平方和最小呢?

上面是求最值的问题,我们会想到导数和偏导数,这里在偏导数等于0的地方能取到极值,并且也是最值。

分别对a和b求偏导得到如下表达式:

线性回归取出系数 Python python线性回归方程_python线性回归模型_10

通过对二元一次方程组

线性回归取出系数 Python python线性回归方程_多项式_11

进行求解,可以得到如下解:

线性回归取出系数 Python python线性回归方程_拟合_12

上面的数学过程用代码表示如下:

import numpy as np
import matplotlib.pyplot as plt
def calcAB(x,y):
n = len(x)
sumX, sumY, sumXY, sumXX = 0, 0, 0, 0
for i in range(0, n):
sumX += x[i]
sumY += y[i]
sumXX += x[i] * x[i]
sumXY += x[i] * y[i]
a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX)
b = (sumXX * sumY - sumX * sumXY) / (n * sumXX - sumX * sumX)
return a, b
xi = [1,2,3,4,5,6,7,8,9,10]
yi = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
a,b=calcAB(xi,yi)
print("y = %10.5fx + %10.5f" %(a,b))
x = np.linspace(0,10)
y = a * x + b
plt.plot(x,y)
plt.scatter(xi,yi)
plt.show()

python数据散点和拟合的直线如下:

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_13

2.2、利用矩阵的方法来求解系数

函数

线性回归取出系数 Python python线性回归方程_多项式_14

也可以表示成如下的形式

线性回归取出系数 Python python线性回归方程_python线性回归模型_15

式中

线性回归取出系数 Python python线性回归方程_线性回归_16

对于n个样本,此时损失函数(即误差平方和)为:

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_17

假如我们将样本表示成如下形式:

线性回归取出系数 Python python线性回归方程_python线性回归模型_18

线性回归取出系数 Python python线性回归方程_拟合_19

进一步,可以将损失函数表示如下形式:

线性回归取出系数 Python python线性回归方程_拟合_20

L对W求导,可得到

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_21

令导数为0,则有

从而

进而可以求得

上面的数学过程用代码表示如下:x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
X = np.vstack([np.ones(len(x)),x]).T
Y = np.array(y).T
W=np.dot(np.matrix(np.dot(X.T,X))**-1,np.dot(X.T,Y))
yi=np.dot(X,W.T)#这里公式里是不需要转置的,但由于矩阵运算时W自动保存成一行多列的矩阵,所以多转置一下,配合原公式的计算。
print(X)
print(Y)
print(W)
print(yi)#拟合出的预测点
plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,yi,'r',label='line')
plt.show()
结果如下:
X=
[[ 1. 1.]
[ 1. 2.]
[ 1. 3.]
[ 1. 4.]
[ 1. 5.]
[ 1. 6.]
[ 1. 7.]
[ 1. 8.]
[ 1. 9.]
[ 1. 10.]]
Y=
[ 10. 11.5 12. 13. 14.5 15.5 16.8 17.3 18. 18.7]
W=
[[ 9.30666667 0.98606061]]
yi=
[[ 10.29272727]
[ 11.27878788]
[ 12.26484848]
[ 13.25090909]
[ 14.2369697 ]
[ 15.2230303 ]
[ 16.20909091]
[ 17.19515152]
[ 18.18121212]
[ 19.16727273]]

3、多元线性回归

将一元线性回归及回归系数的计算公式推广到多元线性回归也是一样。

损失函数可表示如下:

线性回归取出系数 Python python线性回归方程_线性回归_22

对L求导有

线性回归取出系数 Python python线性回归方程_多项式_23

不防令

线性回归取出系数 Python python线性回归方程_多项式_24

则上式可化简为

线性回归取出系数 Python python线性回归方程_拟合_25

线性回归取出系数 Python python线性回归方程_拟合_26

线性回归取出系数 Python python线性回归方程_线性回归_27


记则

线性回归取出系数 Python python线性回归方程_python线性回归模型_28

3.1、当矩阵满秩时(数据点的个数大于x的维度时)

令导数为0的方程组有足够的已知条件求解,令导数为0,则有

线性回归取出系数 Python python线性回归方程_线性回归_29

线性回归取出系数 Python python线性回归方程_拟合_30

则有

线性回归取出系数 Python python线性回归方程_多项式_31

从而有

3.2、当矩阵不满秩时

最小二乘法多项式曲线拟合

多项式曲线拟合与多元线性回归拟合不同点在于,多元线性回归自变量有多个,因变量是多个自变量的线性组合,其形式为

而多项式拟合自变量还是一个,只不过因变量可以看作是自变量不同多项式的线性组合,其形式为

但利用矩阵计算时,如果满秩,两者系数的表达方式是一样的

概念

默认地认为因变量是自变量的多项式的线性组全,即有如下形式

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_32

最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是拟合曲线

线性回归取出系数 Python python线性回归方程_线性回归_33

上的数据点到原数据点的误差平方和最小。即有

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_34

回归系数求解

求最值问题,如果直接求解那么必然在可能的极值点获得(此时没有边界限制)。 对(1)式求偏导,如下

线性回归取出系数 Python python线性回归方程_python线性回归模型_35

为便于理解,我们每次都只对w的一个维度求偏导,则有

线性回归取出系数 Python python线性回归方程_多项式_36

线性回归取出系数 Python python线性回归方程_线性回归_37

线性回归取出系数 Python python线性回归方程_python线性回归模型_38

写成矩阵形式有

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_39

将这个范德蒙得矩阵化简后可得到:

线性回归取出系数 Python python线性回归方程_python线性回归模型_40

线性回归取出系数 Python python线性回归方程_线性回归_41

线性回归取出系数 Python python线性回归方程_线性回归取出系数 Python_42

便得到了系数矩阵A,同时,我们也就得到了拟合曲线。

其实我想说的是看到(2)中的矩阵等式,这个等式都不用推导的,因为函数的表达式就是这样的代入,代入样本后自然会有这样的等式。

而(3)通过矩阵运算自然就能得到。

用python代码编写多项式回归代码,结果如下:

线性回归取出系数 Python python线性回归方程_拟合_43