什么是普通最小二乘法
普通最小二乘法(Ordinary Least Squares,OLS),是一种线性最小二乘法,用于估计线性回归模型中的未知参数。
通俗解释:
最小,即最小化;
二乘,即真实的观测的因变量的值与预测的因变量的值的差的平方和,
∑
(
真实因变量
−
预测因变量
)
2
\sum (真实因变量-预测因变量)^2
∑(真实因变量−预测因变量)2
直观上来看,就是要使得 「集合中每个数据点和回归曲面上对应预测的点的距离的平方的和」 达到最小,这样模型对数据才拟合得最好。
如下图所示,其中
A
,
B
,
C
,
D
,
E
,
F
{A,B,C,D,E,F}
A,B,C,D,E,F 为数据点,要最小化的就是 「红色线段的长度的平方的和」
如何推导OLS
一般标记:
- m m m 代表训练集中实例的数量
- x x x 代表特征/输入变量
- y y y 代表目标变量/输出变量
- ( x , y ) (x,y) (x,y) 代表训练集中的实例
- ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)) 代表第i 个观察实例
线性回归的一般形式:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
hθ(x)=θ0+θ1x1+θ2x2+...+θnxn
令
θ
=
[
θ
0
,
θ
1
]
\theta=[\theta_0,\theta_1]
θ=[θ0,θ1],
h
θ
(
x
)
=
θ
T
X
h_{\theta} \left( x \right)={\theta^{T}}X
hθ(x)=θTX,需要极小化的代价函数是:
J
(
θ
0
,
θ
1
.
.
.
θ
n
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
=
1
2
(
X
θ
−
y
)
T
(
X
θ
−
y
)
J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}\\ = \frac{1}{2}({X\theta} -{y})^T({X\theta} - {y})
J(θ0,θ1...θn)=2m1i=1∑m(hθ(x(i))−y(i))2=21(Xθ−y)T(Xθ−y)
正规方程
θ = ( X T X ) − 1 X T Y {\theta} = ({X^{T}X})^{-1}{X^{T}Y} θ=(XTX)−1XTY
推导过程:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {h_{\theta}}\left( {x^{(i)}} \right)-{y^{(i)}} \right)}^{2}}}
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:
h
θ
(
x
)
=
θ
T
X
=
θ
0
x
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
{h_{\theta}}\left( x \right)={\theta^{T}}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}
hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
将向量表达形式转为矩阵表达形式,则有 J ( θ ) = 1 2 ( X θ − y ) 2 J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{2}} J(θ)=21(Xθ−y)2 ,
其中 X X X为 m m m行 n n n列的矩阵( m m m为样本个数, n n n为特征个数), θ \theta θ为 n n n行1列的矩阵, y y y为 m m m行1列的矩阵,对 J ( θ ) J(\theta ) J(θ)进行如下变换
J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta )=\frac{1}{2}{{\left( X\theta -y\right)}^{T}}\left( X\theta -y \right) J(θ)=21(Xθ−y)T(Xθ−y)
= 1 2 ( θ T X T − y T ) ( X θ − y ) =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}-{{y}^{T}} \right)\left(X\theta -y \right) =21(θTXT−yT)(Xθ−y)
= 1 2 ( θ T X T X θ − θ T X T y − y T X θ − y T y ) =\frac{1}{2}\left( {{\theta }^{T}}{{X}^{T}}X\theta -{{\theta}^{T}}{{X}^{T}}y-{{y}^{T}}X\theta -{{y}^{T}}y \right) =21(θTXTXθ−θTXTy−yTXθ−yTy)
接下来对 J ( θ ) J(\theta ) J(θ)偏导,需要用到以下几个矩阵的求导法则:
d A B d B = A T \frac{dAB}{dB}={{A}^{T}} dBdAB=AT
d X T A X d X = 2 A X \frac{d{{X}^{T}}AX}{dX}=2AX dXdXTAX=2AX
所以有:
∂ J ( θ ) ∂ θ = 1 2 ( 2 X T X θ − X T y − ( y T X ) T − 0 ) \frac{\partial J\left( \theta \right)}{\partial \theta }=\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{}({{y}^{T}}X )^{T}-0 \right) ∂θ∂J(θ)=21(2XTXθ−XTy−(yTX)T−0)
= 1 2 ( 2 X T X θ − X T y − X T y − 0 ) =\frac{1}{2}\left(2{{X}^{T}}X\theta -{{X}^{T}}y -{{X}^{T}}y -0 \right) =21(2XTXθ−XTy−XTy−0)
= X T X θ − X T y ={{X}^{T}}X\theta -{{X}^{T}}y =XTXθ−XTy
令 ∂ J ( θ ) ∂ θ = 0 \frac{\partial J\left( \theta \right)}{\partial \theta }=0 ∂θ∂J(θ)=0,
则有 θ = ( X T X ) − 1 X T y \theta ={{\left( {X^{T}}X \right)}^{-1}}{X^{T}}y θ=(XTX)−1XTy
梯度下降法
1、 批量梯度下降
一般形式:
θ j = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 , . . . , θ m ) = θ j − α ∂ ∂ θ j 1 2 m ∑ i = 1 m ( h θ ( X ( i ) ) − y ( i ) ) 2 = θ j − α 1 m ∑ i = 1 m ( ( h θ ( X ( i ) ) − y ( i ) ) ⋅ X j ( i ) ) \theta_j\\=\theta_j-\alpha\frac \partial {\partial \theta_j}J(\theta_0,\theta_1,...,\theta_m)\\ =\theta_j-\alpha\frac \partial {\partial\theta_j}\frac 1 {2m} \sum_{i=1}^m(h_{\theta}(X^{(i)})-y^{(i)})^2 \\ =\theta_j-\alpha\frac 1 m \sum_{i=1}^m((h_{\theta}(X^{(i)})-y^{(i)})·X_j^{(i)}) θj=θj−α∂θj∂J(θ0,θ1,...,θm)=θj−α∂θj∂2m1∑i=1m(hθ(X(i))−y(i))2=θj−αm1∑i=1m((hθ(X(i))−y(i))⋅Xj(i))
当n>=1时,
θ
0
:
=
θ
0
−
a
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
{{\theta }_{0}}:={{\theta }_{0}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{0}^{(i)}
θ0:=θ0−am1i=1∑m(hθ(x(i))−y(i))x0(i)
θ 1 : = θ 1 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) {{\theta }_{1}}:={{\theta }_{1}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{1}^{(i)} θ1:=θ1−am1i=1∑m(hθ(x(i))−y(i))x1(i)
θ 2 : = θ 2 − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) {{\theta }_{2}}:={{\theta }_{2}}-a\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{2}^{(i)} θ2:=θ2−am1i=1∑m(hθ(x(i))−y(i))x2(i)
矩阵形式:
θ
=
θ
−
1
m
α
X
T
(
X
θ
−
Y
)
\theta= \theta -\frac 1 m \alpha{X}^T({X\theta} -{Y})
θ=θ−m1αXT(Xθ−Y)其中
α
\alpha
α为步长。
2、随机梯度下降
θ
=
θ
−
α
X
i
T
(
X
i
θ
−
Y
i
)
\theta=\theta- \alpha X_i^T(X_i\theta-Y_i)
θ=θ−αXiT(Xiθ−Yi)
3、 小批量梯度下降
θ = θ − 1 M α X M T ( X M θ − Y M ) \theta=\theta-\frac 1 M \alpha X_M^T(X_M\theta-Y_M) θ=θ−M1αXMT(XMθ−YM)
其中
M
M
M为batch_size
,
X
M
X_M
XM表示
M
M
M条数据,
Y
M
Y_M
YM为
X
M
X_M
XM对应的
y
y
y的值。
Python实现
下述代码详细的实现了矩阵计算方法、梯度下降法、批量梯度下降法、随机梯度下降法四种方法:
https://github.com/xiligey/npml/blob/master/npml/linear_model/ordinary_least_squares.py
运行测试代码结果如下:
https://github.com/xiligey/npml/blob/master/test/test_ordinary_least_squares.py
矩阵法系数:[[3.20321268] [2.18418495]]
批量梯度下降法系数:[[3.20321268] [2.18418495]]
小批量梯度下降法系数:[[3.28291653] [2.20456595]]
随机梯度下降法系数:[[3.28802332] [1.99288205]]
sklearn的线性回归系数:(array([[2.18418495]]), array([3.20321268]))
可以看出,小批量和随机梯度下降法存在一定的随机性,损失在迭代过程中存在波动。矩阵法和批量梯度下降法的结果与sklearn的结果一致,小批量和随机梯度下降法有小部分误差,在实际生产环境中,保证这点误差属于可容忍范围内的即可。