简介
最小二乘法就是用过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便的求得未知的数据。
一元线性回归下的最小二乘法
下面来讲解一下最小二乘法(以二维数据为例)
首先,我们得到一组数据(
x
1
,
y
1
x_1,y_1
x1,y1), (
x
2
,
y
2
x_2,y_2
x2,y2)…(
x
n
,
y
n
x_n,y_n
xn,yn),我们的预测函数
f
(
x
i
)
=
ω
x
i
+
b
f(x_i)=\omega x_i+b
f(xi)=ωxi+b,也就是预测值
y
^
i
\hat y_i
y^i, 那么我们的误差的平方和为:
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
=
∑
i
=
1
n
(
y
i
−
ω
x
i
−
b
)
2
\sum_{i=1}^n(y_i-\hat y_i)^2=\sum_{i=1}^n(y_i-\omega x_i-b)^2
i=1∑n(yi−y^i)2=i=1∑n(yi−ωxi−b)2
而我们需要使得上面的式子为最小值,从而求得我们需要的
ω
和
b
\omega和b
ω和b, 我们将其记作
(
ω
∗
,
b
∗
)
(\omega^*, b^*)
(ω∗,b∗),即
(
ω
∗
,
b
∗
)
=
arg
min
(
ω
,
b
)
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
=
arg
min
(
ω
,
b
)
(
y
i
−
ω
x
i
−
b
)
2
(\omega^*,b^*)=\arg\min_{(\omega, b)}\sum^n_{i=1}(y_i-\hat y_i)^2=\arg\min_{(\omega,b)}(y_i-\omega x_i-b)^2
(ω∗,b∗)=arg(ω,b)mini=1∑n(yi−y^i)2=arg(ω,b)min(yi−ωxi−b)2
求解
ω
\omega
ω和
b
b
b的使得
E
(
ω
,
b
)
=
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
E_{(\omega, b)}=\sum^n_{i=1}(y_i-\hat y_i)^2
E(ω,b)=∑i=1n(yi−y^i)2的过程,称为线性回归模型的最小二乘"参数估计"
我们要求得
E
(
ω
,
b
)
E_{(\omega, b)}
E(ω,b)的最小值,只需要求得其极值即可。
我们可将
E
(
ω
,
b
)
E_{(\omega, b)}
E(ω,b)分别对
ω
\omega
ω和
b
b
b求偏导:
∂
E
(
ω
,
b
)
∂
ω
=
2
(
ω
∑
i
=
1
n
x
i
2
−
∑
i
=
1
n
(
y
i
−
b
)
x
i
)
=
0
\frac{\partial E{(\omega, b)}}{\partial\omega}=2\left(\omega\sum^n_{i=1}x_i^2-\sum^n_{i=1}(y_i-b)x_i\right)=0
∂ω∂E(ω,b)=2(ωi=1∑nxi2−i=1∑n(yi−b)xi)=0
∂
E
(
ω
,
b
)
∂
b
=
2
(
n
b
−
∑
i
=
1
n
(
y
i
−
ω
x
i
)
)
=
0
\frac{\partial E{(\omega, b)}}{\partial b}=2\left(nb-\sum^n_{i=1}(y_i-\omega x_i)\right)=0
∂b∂E(ω,b)=2(nb−i=1∑n(yi−ωxi))=0
对上面的方程求解可以得到
ω
=
∑
i
=
1
n
y
i
(
x
i
−
x
‾
)
∑
i
=
1
n
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
\omega=\frac{\sum^n_{i=1}y_i(x_i-\overline x)}{\sum^n_{i=1}x^2_i-\frac1m\left(\sum^m_{i=1}x_i\right)^2}
ω=∑i=1nxi2−m1(∑i=1mxi)2∑i=1nyi(xi−x)
b
=
1
m
∑
i
=
1
n
(
y
i
−
ω
x
i
)
b = \frac1m\sum^n_{i=1}(y_i-\omega x_i)
b=m1i=1∑n(yi−ωxi)
其中
x
‾
=
1
n
∑
i
=
1
n
x
i
\overline x=\frac1n\sum^n_{i=1}x_i
x=n1∑i=1nxi即
x
‾
\overline x
x是
x
x
x的均值
通过上面的步骤我们就可以得到最小二乘法的
ω
和
b
\omega和b
ω和b了。
从而我们就可以得到关系式
f
(
x
i
)
=
ω
x
i
+
b
f(x_i)=\omega x_i+b
f(xi)=ωxi+b
多元线性回归下的最小二乘法
同样的,如果将最小二乘法应用到
n
n
n维数据中
我们的数据
x
x
x如下:
x
=
(
x
11
x
12
…
x
1
n
x
21
x
22
…
x
2
n
⋮
⋮
⋱
⋮
x
m
1
x
m
2
…
x
m
n
)
x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}\\ x_{21}&x_{22}&\dots&x_2n\\ \vdots&\vdots&\ddots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn} \end{matrix} \right)
x=
x11x21⋮xm1x12x22⋮xm2……⋱…x1nx2n⋮xmn
对应的
ω
\omega
ω为
(
ω
1
ω
2
…
ω
n
)
\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n\end{matrix}\right)
(ω1ω2…ωn),所对应的方程为
ω
1
x
1
+
ω
2
x
2
+
⋯
+
ω
n
x
n
+
b
\omega_1 x_1+\omega_2 x_2+\dots+\omega_n x_n+b
ω1x1+ω2x2+⋯+ωnxn+b
为了方便计算,我们可以将
b
b
b放在
x
x
x和
ω
\omega
ω中,即将
b
b
b作为一维,其为固定值1,参数为
ω
b
\omega_b
ωb
x
=
(
x
11
x
12
…
x
1
n
1
x
21
x
22
…
x
2
n
1
⋮
⋮
⋱
⋮
⋮
x
m
1
x
m
2
…
x
m
n
1
)
=
(
x
1
T
1
x
2
T
1
⋮
⋮
x
m
T
1
)
ω
=
(
ω
1
ω
2
…
ω
n
ω
b
)
x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}&1\\ x_{21}&x_{22}&\dots&x_2n&1\\ \vdots&\vdots&\ddots&\vdots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn}&1 \end{matrix} \right)= \left( \begin{matrix} x_1^T&1\\ x_2^T&1\\ \vdots&\vdots\\ x_m^T&1 \end{matrix} \right)\\ \omega=\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n&\omega_b\end{matrix}\right)
x=
x11x21⋮xm1x12x22⋮xm2……⋱…x1nx2n⋮xmn11⋮1
=
x1Tx2T⋮xmT11⋮1
ω=(ω1ω2…ωnωb)
因此,我们的方程就变为了
f
(
x
i
)
=
ω
T
x
f(x_i) = \omega^Tx
f(xi)=ωTx
与上方一元线性回归下的误差类似地
ω
∗
=
arg
min
ω
(
y
−
X
ω
)
T
(
y
−
X
ω
)
\omega^*=\arg\min_{\omega}(y-X\omega)^T(y-X\omega)
ω∗=argωmin(y−Xω)T(y−Xω)
令
E
ω
=
(
y
−
X
ω
)
T
(
y
−
X
ω
)
E_\omega=(y-X\omega)^T(y-X\omega)
Eω=(y−Xω)T(y−Xω),对
ω
\omega
ω求导可得:
∂
E
ω
∂
ω
=
2
X
T
(
X
ω
−
y
)
\frac{\partial E_\omega}{\partial\omega}=2X^T(X\omega-y)
∂ω∂Eω=2XT(Xω−y)
令上式等于零可得
ω
\omega
ω的最优解:
ω
∗
=
(
X
T
X
)
−
1
X
T
y
\omega^*=(X^TX)^{-1}X^Ty
ω∗=(XTX)−1XTy
从而可以得到我们需要的函数
f
(
x
i
)
=
ω
′
T
x
′
=
ω
T
x
+
ω
b
=
ω
T
x
+
b
f(x_i)=\omega'^Tx'=\omega^Tx+\omega_b=\omega^Tx+b
f(xi)=ω′Tx′=ωTx+ωb=ωTx+b也就是
f
(
x
i
)
=
x
i
T
(
X
T
X
)
−
1
X
T
y
f(x_i)=x_i^T(X^TX)^{-1}X^Ty
f(xi)=xiT(XTX)−1XTy
多元最小二乘法也是用与一元线性回归
最小二乘法的代码实现
def LeastSquareMethod(X, Y):
"""
最小二乘法
:param X: 未进行扩展的X矩阵
:param Y: X矩阵相对应的结果集矩阵
:return X_b: 进行扩展处理后的X矩阵
:return omega: 使用最小二乘法求得的w
"""
# 对X矩阵进行扩展
X_b = np.c_[np.ones((len(X), 1)), X]
'''
np.linalg.inv用来求矩阵的逆矩阵
dot表示矩阵祥恒
T表示矩阵的转置
'''
omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
return X_b, omega
实例
import numpy as np
import matplotlib.pyplot as plt
def LeastSquareMethod(X, Y):
"""
最小二乘法
:param X: 未进行扩展的X矩阵
:param Y: X矩阵相对应的结果集矩阵
:return X_b: 进行扩展处理后的X矩阵
:return omega: 使用最小二乘法求得的w
"""
# 对X矩阵进行扩展
X_b = np.c_[np.ones((len(X), 1)), X]
'''
np.linalg.inv用来求矩阵的逆矩阵
dot表示矩阵祥恒
T表示矩阵的转置
'''
omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
return X_b, omega
if __name__ == '__main__':
X = np.random.rand(100, 1)
Y = 4 + 3 * X + np.random.rand(100, 1)
X_b, omega = LeastSquareMethod(X, Y)
Y2 = X_b.dot(omega)
plt.plot(X, Y, 'o')
plt.plot(X, Y2, 'r')
plt.show()
得到的图像为