机器学习:从公式推导到代码实现多元线性回归
前面我们已经讨论过一元线性回归没如果大家对这个看的比较晦涩,可以查看前置内容: 机器学习:从公式推导到代码实现一元线性回归
多元线性回归
我认为多元线性回归与一元线性回归本质上是一样的,一元线性回归可以看成数据特征维度为1的多元线性回归,而多元主要体现在数据维度的多样性,比如说房价预测,决定房价的因素有很多(比如,位置,新旧,大小。。。等)。
求解过程
设DataSet:={(x1,y1),(x2,y2),(x3,y3)…(xn,yn))},其中
x
i
∈
R
p
xi \in R^p
xi∈Rp,
y
i
∈
R
yi \in R
yi∈R,也就是说X=
(
x
1
,
x
2
,
x
3.....
x
n
)
T
(x1,x2,x3.....xn)^T
(x1,x2,x3.....xn)T,其中这里,每个元素x
都是一个p维的列向量,我们继续化简,X=
[
x
11
x
12
.
.
.
x
1
p
x
21
x
22
.
.
.
x
2
p
.
.
.
.
.
.
x
n
1
x
n
2
.
.
.
x
n
p
]
(1)
\left[ \begin{matrix} x_{11} & x_{12} &... x_{1p} \\ x_{21} & x_{22} &... x_{2p} \\ \\...... \\x_{n1} & x_{n2} &... x_{_{np}} \end{matrix} \right]\tag{1}
⎣⎢⎢⎢⎢⎡x11x21......xn1x12x22xn2...x1p...x2p...xnp⎦⎥⎥⎥⎥⎤(1)
Y=
[
y
1
y
2
.
.
.
.
.
.
y
n
]
(2)
\left[ \begin{matrix} y_{1} \\ y_{2} \\ \\...... \\y_n \end{matrix} \right]\tag{2}
⎣⎢⎢⎢⎢⎡y1y2......yn⎦⎥⎥⎥⎥⎤(2)
W=
[
w
1
w
2
.
.
.
.
.
.
w
p
]
(3)
\left[ \begin{matrix} w_{1} \\ w_{2} \\ \\...... \\w_p \end{matrix} \right]\tag{3}
⎣⎢⎢⎢⎢⎡w1w2......wp⎦⎥⎥⎥⎥⎤(3)
我们假设Y与X的线性关系为f(xi)=
W
T
∗
x
i
+
b
W^T*xi+b
WT∗xi+b,这里W,b为参数,为了方便后续计算,我们偏执项b与W合为一体,写成W=(W;b),那么X也就变成了
X=
[
x
11
x
12
.
.
.
x
1
p
1
x
21
x
22
.
.
.
x
2
p
1
.
.
.
.
.
.
x
n
1
x
n
2
.
.
.
x
n
p
1
]
(4)
\left[ \begin{matrix} x_{11} & x_{12} &... x_{1p} &1 \\ x_{21} & x_{22} &... x_{2p} &1 \\ \\...... \\x_{n1} & x_{n2} &... x_{np} &1 \end{matrix} \right]\tag{4}
⎣⎢⎢⎢⎢⎡x11x21......xn1x12x22xn2...x1p...x2p...xnp111⎦⎥⎥⎥⎥⎤(4)
W=
[
w
1
w
2
.
.
.
.
.
.
w
n
b
]
(5)
\left[ \begin{matrix} w_{1} \\ w_{2} \\ \\...... \\w_n \\b \end{matrix} \right]\tag{5}
⎣⎢⎢⎢⎢⎢⎢⎡w1w2......wnb⎦⎥⎥⎥⎥⎥⎥⎤(5)
所以我们把假设函数写成 f ( x i ) = W T ∗ x i f(x_i)=W^T*x_i f(xi)=WT∗xi,我们的目的是找到一条直线,使这条直线的距离到每个每个坐标点的距离最小,这也就是最小二乘估计的核心思想,所以我们可以把Cost Function写成
L ( W ) = ( f ( ϵ i ) − y i ) 2 L(W)=(f(\epsilon_i)-y_i)^2 L(W)=(f(ϵi)−yi)2
这里之所以用平方,如果没有平方,Cost Fuction可能为负值,如果为负,这样就不利于我们对真实值与预测值差距多少的判断,这样我们会有一个疑问,我们可以不用均方误差,直接加上一个绝对值就可以保证代价函数的值域大于等于0,答案显然是不可以的,因为绝对值函数不能保证在整个定义域上>=0,所以最终采用均方误差,这个代价函数也可以用最小二乘估计推出来,我们下一节在做讨论。
最终代价函数被定义为
L
(
ϵ
i
)
=
∑
i
=
1
n
(
f
(
ϵ
i
)
−
y
i
)
2
L(\epsilon_i)=\sum_{i=1}^{n}(f(\epsilon_i)-y_i)^2
L(ϵi)=∑i=1n(f(ϵi)−yi)2,我们想要得到最优解,也就是代价函数最小,我们对这个优化函数继续化简,
L
(
W
)
=
∑
i
=
1
n
(
f
(
ϵ
i
)
−
y
i
)
2
L(W)=\sum_{i=1}^{n}(f(\epsilon_i)-y_i)^2
L(W)=∑i=1n(f(ϵi)−yi)2
L ( W ) = ∑ i = 1 n ( W T ∗ ϵ i − y i ) 2 L(W)=\sum_{i=1}^{n}(W^T*\epsilon_i-y_i)^2 L(W)=∑i=1n(WT∗ϵi−yi)2
L
(
W
)
=
L(W)=
L(W)=
[
W
T
∗
ϵ
1
−
y
1
W
T
∗
ϵ
2
−
y
2
.
.
.
.
.
.
W
T
∗
ϵ
n
−
y
n
b
]
∗
[
W
T
∗
ϵ
1
−
y
1
W
T
∗
ϵ
2
−
y
2
.
.
.
W
T
∗
ϵ
n
−
y
n
1
]
\left[ \begin{matrix} W^T*\epsilon_1-y_1 \\ W^T*\epsilon_2-y_2 \\ \\...... \\W^T*\epsilon_n-y_n \\b \end{matrix} \right]* \left[ \begin{matrix} W^T*\epsilon_1-y_1 & W^T*\epsilon_2-y_2 &...&W^T*\epsilon_n-y_n &1 \\ \end{matrix} \right]
⎣⎢⎢⎢⎢⎢⎢⎡WT∗ϵ1−y1WT∗ϵ2−y2......WT∗ϵn−ynb⎦⎥⎥⎥⎥⎥⎥⎤∗[WT∗ϵ1−y1WT∗ϵ2−y2...WT∗ϵn−yn1]
通过化简得到:
L
(
W
)
=
(
W
T
∗
X
T
−
Y
T
)
∗
(
X
∗
W
−
Y
)
L(W)=(W^T*X^T-Y^T)*(X*W-Y)
L(W)=(WT∗XT−YT)∗(X∗W−Y)
L ( W ) = W T ∗ X T ∗ X ∗ W − W T ∗ X T ∗ Y − Y T ∗ X ∗ W − Y T ∗ Y L(W)=W^T*X^T*X*W-W^T*X^T*Y-Y^T*X*W-Y^T*Y L(W)=WT∗XT∗X∗W−WT∗XT∗Y−YT∗X∗W−YT∗Y
然后我们通过矩阵乘法的运算性质,我们可以得出这四项都是一个一维的常数,其中第二项于第三项互为转置,可以化简得(如果大家忘记了矩阵运算法则,下图以给出性质):
L
(
W
)
=
W
T
∗
X
T
∗
X
∗
W
−
2
∗
W
T
∗
X
T
∗
Y
−
−
Y
T
∗
Y
L(W)=W^T*X^T*X*W-2*W^T*X^T*Y--Y^T*Y
L(W)=WT∗XT∗X∗W−2∗WT∗XT∗Y−−YT∗Y
为了使代价函数最小,我们对其求导数,这里矩阵求导过程以省略,
W
∗
=
a
r
g
m
i
n
(
L
(
W
)
)
W^*=argmin(L(W))
W∗=argmin(L(W))
W ∗ = ( X T ∗ X − 1 ) ∗ X T ∗ Y W^*=(X^T*X^{-1})*X^T*Y W∗=(XT∗X−1)∗XT∗Y
代码
import numpy as np
import pandas as pd
import statsmodels.api as sm
file = r'C:\Users\data.xlsx'
data = pd.read_excel(file)
data.columns = ['y', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9']
x = sm.add_constant(data.iloc[:,1:]) #生成自变量
y = data['y'] #生成因变量
model = sm.OLS(y, x) #生成模型
result = model.fit() #模型拟合
result.summary() #模型描述