写在前面的话:由于在编程实践层面上更倾向于使⽤矩阵/向量而不是方程组的形式进⾏计算,因此包括最小二乘法(Least Square Method)在内的⼀系列优化⽅法和算法的理论讲解,我们也将采⽤矩阵/向量作为基本数据结构进行概念讲解和数学公式推导。在正式讲解LSM的数学原理之前,我们需要先补充一些关于向量求导的相关芝士。
首先我们来看相对简单的向量求导方法,假设现有一个二元函数
f
(
x
1
,
x
2
)
=
2
x
1
+
x
2
f(x_1,x_2)=2x_1+x_2
f(x1,x2)=2x1+x2,对该函数中的两个变量
x
1
,
x
2
x_1,x_2
x1,x2依次求偏导,可得:
∂
f
∂
x
1
=
2
\dfrac {\partial f}{\partial x_1}=2
∂x1∂f=2,
∂
f
∂
x
2
=
1
\dfrac {\partial f}{\partial x_2}=1
∂x2∂f=1。现在考虑将上述求偏导的函数组改写为矩阵形式,我们可以将函数中的两个变量依次排列,组成一个向量变元(即一个由多个变量所组成的向量),即
x
=
[
x
1
,
x
2
]
T
x=[x_1,x_2]^T
x=[x1,x2]T。此时,如果我们按照向量变元内部的变量排列顺序,依次在每个变量位置填上该变量对应的偏导函数,则就构成了对于函数
f
f
f进行向量变元
x
x
x的向量求导的结果,即:
∂
f
(
x
)
∂
x
=
[
2
1
]
\dfrac {\partial f(x)}{\partial x}=\left[
至此,我们就完成了向量求导的基本过程。核心在于我们是依据向量变元中的变量排列顺序,依次填写了对应变量的偏导函数计算结果。不过,更进⼀步的来看,既然⽅程组需要改写成向量/矩阵形式,那么原始函数⽅程其实也同样需要改写成向量/矩阵形式。因此,原⽅程我们可以改写成: f ( x ) = A T ⋅ x f(x)=A^T\cdot x f(x)=AT⋅x,其中 A = [ 2 , 1 ] T A=[2,1]^T A=[2,1]T, x = [ x 1 , x 2 ] T x=[x_1,x_2]^T x=[x1,x2]T,原方程为 y = 2 x 1 + x 2 y=2x_1+x_2 y=2x1+x2。结合函数求偏导结果,易知 ∂ f ( x ) ∂ x \dfrac {\partial f(x)}{\partial x} ∂x∂f(x)的最终结果就是 A A A,即 ∂ f ( x ) ∂ x \dfrac {\partial f(x)}{\partial x} ∂x∂f(x) = ∂ ( A T ⋅ x ) ∂ x \dfrac {\partial (A^T\cdot x)}{\partial x} ∂x∂(AT⋅x) = A A A,其中 x x x为向量变元, A A A是列向量。当然,该结论也能推导⾄⼀般的情况,相关证见下述。
很多时候我们并不区分所谓向量⽅程和矩阵⽅程,⼀般所有⾃变量为向量或矩阵的⽅程,我们会统⼀称其为矩阵⽅程。包含向量或者矩阵的表达式,我们也会统⼀称其为矩阵表达式。
设 f ( x ) f(x) f(x)是一个关于 x x x的函数,其中 x x x为向量变元,并且 x = [ x 1 , x 2 , ⋯ , x n ] T x=[x_1,x_2,\cdots,x_n]^T x=[x1,x2,⋯,xn]T,则 ∂ f ∂ x \dfrac {\partial f}{\partial x} ∂x∂f = [ ∂ f ∂ x 1 , ∂ f ∂ x 2 , ⋯ , ∂ f ∂ x n ] T [\dfrac {\partial f}{\partial x_1},\dfrac {\partial f}{\partial x_2},\cdots,\dfrac {\partial f}{\partial x}_n]^T [∂x1∂f,∂x2∂f,⋯,∂x∂fn]T,而该表达式也被称为向量求导的梯度向量形式。通过解得函数的梯度向量求解向量导数的方法,也被称为定义法求解。
多元函数是一定能够求得梯度向量的,但是梯度向量或者说向量求导结果,能否由⼀些已经定义的向量解决表示,如 A A A就是 f ( x ) f(x) f(x)的向量求导结果,则不一定。
参考博客:求导定义与求导布局、矩阵向量求导之定义法、矩阵向量求导之微分法、矩阵向量求导链式法则
常见的向量求导公式如下图所示:

记 x = [ x 1 , x 2 , ⋯ , x n ] T x=[x_1,x_2,\cdots,x_n]^T x=[x1,x2,⋯,xn]T。下面利用向量求导的定义法推导一些公式:
(1)证明: ∂ a ∂ x = 0 \dfrac {\partial a}{\partial x}=0 ∂x∂a=0,这里 a a a是常数
∂ a ∂ x \dfrac {\partial a}{\partial x} ∂x∂a = [ ∂ a ∂ x 1 , ∂ a ∂ x 2 , ⋯ , ∂ a ∂ x n ] T [\dfrac {\partial a}{\partial x_1},\dfrac {\partial a}{\partial x_2},\cdots,\dfrac {\partial a}{\partial x_n}]^T [∂x1∂a,∂x2∂a,⋯,∂xn∂a]T = [ 0 , 0 , ⋯ , 0 ] T [0,0,\cdots,0]^T [0,0,⋯,0]T
(2)证明: ∂ ( x T ⋅ A ) ∂ x \dfrac {\partial (x^T\cdot A)}{\partial x} ∂x∂(xT⋅A) = ∂ ( A T ⋅ x ) ∂ x \dfrac {\partial (A^T\cdot x)}{\partial x} ∂x∂(AT⋅x) = A A A
此时
A
A
A为拥有
n
n
n个分量的常数向量,设
A
=
[
a
1
,
a
2
,
⋯
,
a
n
]
T
A=[a_1,a_2,\cdots,a_n]^T
A=[a1,a2,⋯,an]T,则有
∂
(
x
T
⋅
A
)
∂
x
\dfrac {\partial (x^T\cdot A)}{\partial x}
∂x∂(xT⋅A) =
∂
(
A
T
⋅
x
)
∂
x
\dfrac {\partial (A^T\cdot x)}{\partial x}
∂x∂(AT⋅x) =
∂
(
a
1
x
1
+
a
2
x
2
+
⋯
+
a
n
x
n
)
∂
x
\dfrac {\partial (a_1x_1+a_2x_2+\cdots +a_nx_n)}{\partial x}
∂x∂(a1x1+a2x2+⋯+anxn) =
[
∂
(
a
1
x
1
+
a
2
x
2
+
⋯
+
a
n
x
n
)
∂
x
1
˙
˙
˙
∂
(
a
1
x
1
+
a
2
x
2
+
⋯
+
a
n
x
n
)
∂
x
n
]
\left[
(3)证明: ∂ ( x T ⋅ x ) ∂ x \dfrac {\partial (x^T\cdot x)}{\partial x} ∂x∂(xT⋅x) = 2 x 2x 2x
∂
(
x
T
⋅
x
)
∂
x
\dfrac {\partial (x^T\cdot x)}{\partial x}
∂x∂(xT⋅x) =
∂
(
x
1
2
+
x
2
2
+
⋯
x
n
2
)
∂
x
\dfrac {\partial (x_1^2+x_2^2+\cdots x_n^2)}{\partial x}
∂x∂(x12+x22+⋯xn2) =
[
∂
(
x
1
2
+
x
2
2
+
⋯
x
n
2
)
∂
x
1
∂
(
x
1
2
+
x
2
2
+
⋯
x
n
2
)
∂
x
2
⋮
∂
(
x
1
2
+
x
2
2
+
⋯
x
n
2
)
∂
x
n
]
\left[
此处 x T x x^Tx xTx也称为向量的交叉乘积(crossprod),在线代中称为向量的内积。
(4)证明: ∂ ( x T A x ) ∂ x \dfrac {\partial (x^TAx)}{\partial x} ∂x∂(xTAx) = A x + A T x Ax+A^Tx Ax+ATx
其中
A
A
A是一个
n
×
n
n\times n
n×n的矩阵,首先
x
T
A
x
x^TAx
xTAx =
[
x
1
,
x
2
,
⋯
,
x
n
]
[x_1,x_2,\cdots, x_n]
[x1,x2,⋯,xn]
⋅
\cdot
⋅
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
n
]
\left[
=
[
x
1
a
11
+
x
2
a
21
+
⋯
+
x
n
a
n
1
,
⋯
,
x
1
a
1
n
+
x
2
a
2
n
+
⋯
+
x
n
a
n
n
]
[x_1a_{11}+x_2a_{21} + \cdots + x_na_{n1}, \cdots, x_1a_{1n}+x_2a_{2n} + \cdots + x_na_{nn}]
[x1a11+x2a21+⋯+xnan1,⋯,x1a1n+x2a2n+⋯+xnann]
⋅
\cdot
⋅
[
x
1
x
2
⋮
x
n
]
\left[
= x 1 ( x 1 a 11 + x 2 a 21 + ⋯ + x n a n 1 ) + ⋯ + x n ( x 1 a 1 n + x 2 a 2 n + ⋯ + x n a n n ) x_1(x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1}) + \cdots + x_n(x_1a_{1n}+x_2a_{2n}+\cdots+x_na_{nn}) x1(x1a11+x2a21+⋯+xnan1)+⋯+xn(x1a1n+x2a2n+⋯+xnann)
令 k ( x ) k(x) k(x) = x 1 ( x 1 a 11 + x 2 a 21 + ⋯ + x n a n 1 ) + ⋯ + x n ( x 1 a 1 n + x 2 a 2 n + ⋯ + x n a n n ) x_1(x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1}) +\cdots + x_n(x_1a_{1n}+x_2a_{2n}+\cdots+x_na_{nn}) x1(x1a11+x2a21+⋯+xnan1)+⋯+xn(x1a1n+x2a2n+⋯+xnann)
则有 ∂ k ( x ) ∂ x 1 \dfrac {\partial k(x)}{\partial x_1} ∂x1∂k(x) = ( x 1 a 11 + x 2 a 21 + ⋯ + x n a n 1 ) + x 1 a 11 (x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1})+x_1a_{11} (x1a11+x2a21+⋯+xnan1)+x1a11 + x 2 a 12 x_2a_{12} x2a12 + ⋯ \cdots ⋯ + x n a 1 n x_na_{1n} xna1n
= ( x 1 a 11 + x 2 a 21 + ⋯ + x n a n 1 ) (x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1}) (x1a11+x2a21+⋯+xnan1) + + + ( x 1 a 11 + x 2 a 12 + ⋯ + x n a 1 n ) (x_1a_{11} + x_2a_{12}+\cdots + x_na_{1n}) (x1a11+x2a12+⋯+xna1n)
同理可知
∂
k
(
x
)
∂
x
\dfrac {\partial k(x)}{\partial x}
∂x∂k(x) =
[
∂
k
(
x
)
∂
x
1
∂
k
(
x
)
∂
x
2
⋮
∂
k
(
x
)
∂
x
n
]
\left[
=
[
x
1
a
11
+
x
2
a
21
+
⋯
+
x
n
a
n
1
x
1
a
12
+
x
2
a
22
+
⋯
+
x
n
a
n
2
˙
˙
˙
x
1
a
1
n
+
x
2
a
2
n
+
⋯
+
x
n
a
n
n
]
\left[
=
[
a
11
a
21
…
a
n
1
a
12
a
22
⋯
a
n
2
⋮
⋮
⋱
⋮
a
1
n
a
2
n
⋯
a
n
n
]
\left[
有了上述内容铺垫之后,接下来,我们从数学⻆度讨论最⼩⼆乘法的基本理论,并尝试简单实现最⼩⼆乘法求解损失函数的⼀般过程。
首先,假设多元线性⽅程有如下形式: f ( x ) = w 1 x 1 + w 2 x 2 + ⋯ + w n x n + b f(x)=w_1x_1+w_2x_2+\cdots+w_nx_n+b f(x)=w1x1+w2x2+⋯+wnxn+b
令 w = [ w 1 , w 2 , ⋯ , w n ] T w=[w_1,w_2,\cdots,w_n]^T w=[w1,w2,⋯,wn]T, x = [ x 1 , x 2 , ⋯ , x n ] T x=[x_1,x_2,\cdots,x_n]^T x=[x1,x2,⋯,xn]T,则上式可以改写为 f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b
在机器学习领域,我们将线性回归⾃变量系数命名为 w w w,其实是weight的简写,意为⾃变量的权重。
假设现在总共有 m m m条观测值, x ( i ) = [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}=[x_1^{(i)},x_2^{(i)},\cdots,x_d^{(i)}] x(i)=[x1(i),x2(i),⋯,xd(i)],则带入模型可构成 m m m个方程:
[
w
1
x
1
(
1
)
+
w
2
x
2
(
1
)
+
⋯
+
w
d
x
d
(
1
)
+
b
w
1
x
1
(
2
)
+
w
2
x
2
(
2
)
+
⋯
+
w
d
x
d
(
2
)
+
b
˙
˙
˙
w
1
x
1
(
m
)
+
w
2
x
2
(
m
)
+
⋯
+
w
d
x
d
(
m
)
+
b
]
\left[
然后考虑将上述方程组进行改写,可以令:
w ^ = [ w 1 , w 2 , ⋯ , w d , b ] T \hat w=[w_1,w_2,\cdots,w_d,b]^T w^=[w1,w2,⋯,wd,b]T, x ^ = [ x 1 , x 2 , ⋯ , x d , 1 ] T \hat x=[x_1,x_2,\cdots,x_d,1]^T x^=[x1,x2,⋯,xd,1]T
X
^
\hat X
X^ =
[
x
1
(
1
)
x
2
(
1
)
⋯
x
d
(
1
)
1
x
1
(
2
)
x
2
(
2
)
⋯
x
d
(
2
)
1
⋮
⋮
⋱
1
x
1
(
m
)
x
2
(
m
)
⋯
x
d
(
m
)
1
]
\left[
- w ^ \hat w w^:⽅程系数所组成的向量,并且我们将⾃变量系数和截距 b b b放到了⼀个向量
- x ^ \hat x x^:⽅程⾃变量与常数 1 1 1所共同组成的向量
- X ^ \hat X X^:样本数据特征构成的矩阵,并在最后⼀列添加⼀个全为 1 1 1的列
- y y y:样本数据标签所构成的列向量
- y ^ \hat y y^:预测值的列向量
因此,上述构成的 m m m个方程可以表示为: X ^ ⋅ w ^ = y ^ \hat X\cdot \hat w = \hat y X^⋅w^=y^
3.模型进一步改写
在改写了 x ^ \hat x x^和 w ^ \hat w w^之后,线性模型 f ( x ) = w 1 x 1 + w 2 x 2 + ⋯ + w d x d + b f(x)=w_1x_1+w_2x_2+\cdots+w_dx_d+b f(x)=w1x1+w2x2+⋯+wdxd+b可以改写为: f ( x ^ ) = w ^ T ⋅ x ^ f(\hat x)=\hat w^T\cdot \hat x f(x^)=w^T⋅x^
对于回归类问题,最重要的模型评估指标就是SSE——残差平方和,指的是模型预测值 y ^ \hat y y^和真实值 y y y之间的差值的平方和,计算结果表示预测值和真实值之间的差距,结果越小表示二者差距越小,模型效果越好。SSE基本计算公式为: S S E = ∑ i = 1 n ( y ^ i − y i ) 2 SSE=\sum \limits _{i=1} ^n (\hat y_i-y_i)^2 SSE=i=1∑n(y^i−yi)2
在⽅程组的矩阵表示基础上,我们可以用SSE作为损失函数基本计算流程构建关于 w ^ \hat w w^的损失函数:
S S E L o s s ( w ^ ) = ∣ ∣ y − X ^ w ^ ∣ ∣ 2 2 = ( y − X ^ w ^ ) T ( y − X ^ w ^ ) SSELoss(\hat w)=||y-\hat X\hat w||_2^2=(y-\hat X\hat w)^T(y-\hat X\hat w) SSELoss(w^)=∣∣y−X^w^∣∣22=(y−X^w^)T(y−X^w^)
向量的2-范数计算公式:
上式中, ∣ ∣ y − X ^ w ^ ∣ ∣ 2 ||y-\hat X\hat w||_2 ∣∣y−X^w^∣∣2为向量的2-范数的计算表达式。向量的2-范数计算过程为各分量求平方和再进行开平方。例如 a = [ 1 , − 1 ] a=[1,-1] a=[1,−1],则 ∣ ∣ a ∣ ∣ 2 = 1 2 + ( − 1 ) 2 = 2 ||a||_2=\sqrt{1^2+(-1)^2}=\sqrt {2} ∣∣a∣∣2=12+(−1)2=2
2-范数计算转化为内积运算:
向量的2-范数计算结果其实就是向量内积计算结果后开平⽅。例如 a = [ 1 , − 1 ] a=[1,-1] a=[1,−1],则 a a a的内积为 a ⋅ a T = [ 1 , − 1 ] ⋅ [ 1 − 1 ] a\cdot a^T=[1,-1]\cdot \left[
\right] a⋅aT=[1,−1]⋅[1−1] = 2 2 2,其开平方后为 2 \sqrt{2} 2,也就等于2-范数的计算结果。" role="presentation"> 1 − 1
在确定损失函数的矩阵表示形式之后,接下来即可利⽤最小二乘法进行求解。基本求解思路:先求导函数、再令导函数取值为零,进⽽解出参数取值。只不过此时求解的是矩阵⽅程。
对 S S E L o s s ( w ^ ) SSELoss(\hat w) SSELoss(w^)求导并令其等于 0 0 0,则 0 0 0 = S S E L o s s ( w ^ ) ∂ w ^ \dfrac {SSELoss(\hat w)}{\partial \hat w} ∂w^SSELoss(w^) = ∂ ∣ ∣ y − X ^ w ^ ∣ ∣ 2 2 ∂ w ^ \dfrac {\partial ||y-\hat X\hat w||_2^{2}}{\partial \hat w} ∂w^∂∣∣y−X^w^∣∣22 = ∂ [ ( y − X ^ w ^ ) T ( y − X ^ w ^ ) ] ∂ w ^ \dfrac {\partial [(y-\hat X\hat w)^T(y-\hat X\hat w)]}{\partial \hat w} ∂w^∂[(y−X^w^)T(y−X^w^)] = ∂ [ ( y T − w ^ T X ^ T ) ( y − X ^ w ^ ) ] ∂ w ^ \dfrac {\partial[(y^T-\hat w^T\hat X^T)(y-\hat X\hat w)]}{\partial \hat w} ∂w^∂[(yT−w^TX^T)(y−X^w^)] = ∂ ( y T y − y T X ^ w ^ − w ^ T X ^ T y + w ^ T X ^ T X ^ w ^ ) ∂ w ^ \dfrac {\partial(y^Ty-y^T\hat X\hat w-\hat w^T\hat X^Ty+\hat w^T\hat X^T\hat X\hat w)}{\partial \hat w} ∂w^∂(yTy−yTX^w^−w^TX^Ty+w^TX^TX^w^) = 0 − ( y T X ^ ) T − X ^ T y + X ^ T X ^ w ^ + ( X ^ T X ^ ) T w ^ 0 - (y^T\hat{X})^T-\hat{X}^Ty+\hat X^T\hat X\hat w + (\hat X^T\hat X)^T\hat w 0−(yTX^)T−X^Ty+X^TX^w^+(X^TX^)Tw^ = 2 ( X ^ T X ^ W ^ − X ^ T y ) 2(\hat X^T\hat X\hat W - \hat X^Ty) 2(X^TX^W^−X^Ty)
因此有: X ^ T X ^ w ^ − X ^ T y = 0 \hat X^T\hat X\hat w-\hat X^Ty = 0 X^TX^w^−X^Ty=0, 即 X ^ T X ^ w ^ = X ^ T y \hat X^T\hat X\hat w=\hat X^Ty X^TX^w^=X^Ty
要使得此式有解,等价于 X ^ T X ^ \hat X^T\hat X X^TX^可逆,则解得 w ^ \hat w w^ = ( X ^ T X ^ ) − 1 X ^ T y (\hat X^T\hat X)^{-1}\hat X^Ty (X^TX^)−1X^Ty
简单尝试利⽤上述推导公式求解简单线性回归参数。原始数据如下:
| Whole weight | Rings |
|---|---|
| 1 | 2 |
| 3 | 4 |
因此利⽤矩阵表达式,可进行如下形式的改写:
特征矩阵
X
^
=
[
1
1
3
1
]
\hat X=\left[
求解公式为
w
^
\hat w
w^ =
(
X
^
T
X
^
)
−
1
X
^
T
y
(\hat X^T\hat X)^{-1}\hat X^Ty
(X^TX^)−1X^Ty =
(
[
1
1
3
1
]
T
[
1
1
3
1
]
)
−
1
[
1
1
3
1
]
T
[
2
4
]
(\left[
上述这个小栗子的代码实现过程:
'''
输出结果:
array([[1.],
[1.]])
'''
import numpy as np
X = np.array([[1, 1], [3, 1]])
y = np.array([2,4]).reshape(2, 1)
np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
即解得 w = 1 , b = 1 w=1,b=1 w=1,b=1,即模型方程为 y = x + 1 y=x+1 y=x+1。⾄此,我们即完成了最⼩⼆乘法的推导以及简单实现。
补充
简单线性回归中的"线性"与"回归"的形象理解:
简单线性回归的⼏何意义,就是希望找到⼀条直线,尽可能的接近样本点。或者说,我们是通过⼀条直线去捕捉平面当中的点。当然,大多数情况下我们都⽆法对平⾯中的点进行完全的捕捉,而直线和点之间的差值,实际上就是SSE。而线性回归中"回归"的含义,则是:如果模型真实有效,则新数据也会像朝向这条直线"回归"⼀样,最终分布在这条直线附近。这就是简单线性回归中的"线性"和"回归"的形象理解。
从上面可以看出,最小二乘法适用简洁高效,比梯度下降这样的迭代法似乎方便很多。但是最小二乘法也存在局限性。
(1)最小二乘法需要计算 X T X X^TX XTX的逆矩阵,有可能它的逆矩阵不存在,这样就没有办法直接用最小二乘法了,此时梯度下降法仍然可以使用。当然,我们可以通过对样本数据进行整理,去掉冗余特征。让 X T X X^TX XTX的行列式不为 0 0 0,然后继续使用最小二乘法。
(2)当样本特征 n n n非常大时,计算 X T X X^TX XTX的逆矩阵是一个非常耗时的工作( n × n n\times n n×n的矩阵求逆),甚至不可行。此时以梯度下降为代表的迭代法仍然可以使用。那这个 n n n到底多大就不适合最小二乘法呢?如果你没有很多的分布式大数据计算资源,建议超过 10000 10000 10000个特征就用迭代法吧。或者通过主成分分析降低特征的维度后再用最小二乘法。
(3)如果拟合函数不是线性的,这时无法使用最小二乘法,需要通过一些技巧转化为线性才能使用,此时梯度下降仍然可以用。
(4)讲一些特殊情况。设样本量为
m
m
m,特征数为
n
n
n。当
m
<
n
m