写在前面的话:由于在编程实践层面上更倾向于使⽤矩阵/向量而不是方程组的形式进⾏计算,因此包括最小二乘法(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[\begin{matrix} 2 \\ 1\end{matrix}\right] ∂x∂f(x)=[21],其中 x x x为向量变元。
至此,我们就完成了向量求导的基本过程。核心在于我们是依据向量变元中的变量排列顺序,依次填写了对应变量的偏导函数计算结果。不过,更进⼀步的来看,既然⽅程组需要改写成向量/矩阵形式,那么原始函数⽅程其实也同样需要改写成向量/矩阵形式。因此,原⽅程我们可以改写成: 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[\begin{matrix}\dfrac{\partial(a_1x_1+a_2x_2+\cdots+a_nx_n)}{\partial x_1}\\ \\ \dot\\ \\ \dot\\ \\ \dot\\ \\\dfrac{\partial(a_1x_1+a_2x_2+\cdots+a_nx_n)}{\partial x_n} \end{matrix} \right] ⎣ ⎡∂x1∂(a1x1+a2x2+⋯+anxn)˙˙˙∂xn∂(a1x1+a2x2+⋯+anxn)⎦ ⎤ = [ a 1 a 2 ⋮ a n ] \left[\begin{matrix}a_1\\ a_2\\ \vdots\\ a_n \end{matrix} \right] ⎣ ⎡a1a2⋮an⎦ ⎤ = A A A
(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[\begin{matrix} \dfrac{\partial (x_1^2+x_2^2+\cdots x_n^2)}{\partial x_1}\\\dfrac{\partial (x_1^2+x_2^2+\cdots x_n^2)}{\partial x_2}\\ \vdots \\ \dfrac{\partial (x_1^2+x_2^2+\cdots x_n^2)}{\partial x_n} \end{matrix} \right] ⎣ ⎡∂x1∂(x12+x22+⋯xn2)∂x2∂(x12+x22+⋯xn2)⋮∂xn∂(x12+x22+⋯xn2)⎦ ⎤ = [ 2 x 1 2 x 2 ⋮ 2 x n ] \left[\begin{matrix}2x_1\\ 2x_2\\ \vdots \\2x_n \end{matrix}\right] ⎣ ⎡2x12x2⋮2xn⎦ ⎤ = 2 [ x 1 , x 2 , ⋯ , x n ] T 2[x_1,x_2,\cdots, x_n]^T 2[x1,x2,⋯,xn]T = 2 x 2x 2x
此处 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[\begin{matrix}a_{11} & a_{12}& \cdots & a_{1n}\\ a_{21} & a_{22} &\cdots & a_{2n}\\ \vdots& \vdots& \ddots &\vdots\\ a_{n1} & a_{n2} &\cdots & a_{nn} \end{matrix} \right] ⎣ ⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎦ ⎤ ⋅ \cdot ⋅ [ x 1 , x 2 , ⋯ , x n ] T [x_1,x_2,\cdots,x_n]^T [x1,x2,⋯,xn]T
= [ 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[\begin{matrix}x_1\\ x_2\\ \vdots\\ x_n \end{matrix} \right] ⎣ ⎡x1x2⋮xn⎦ ⎤
= 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[\begin{matrix}\dfrac {\partial k(x)}{\partial x_1}\\ \dfrac {\partial k(x)}{\partial x_2}\\ \vdots\\ \dfrac {\partial k(x)}{\partial x_n} \end{matrix} \right] ⎣ ⎡∂x1∂k(x)∂x2∂k(x)⋮∂xn∂k(x)⎦ ⎤ = [ ( x 1 a 11 + x 2 a 21 + ⋯ + x n a n 1 ) + ( x 1 a 11 + x 2 a 12 + ⋯ + x n a 1 n ) ( x 1 a 12 + x 2 a 22 + ⋯ + x n a n 2 ) + ( x 1 a 21 + x 2 a 22 + ⋯ + x n a 2 n ) ˙ ˙ ( x 1 a 1 n + x 2 a 2 n + ⋯ + x n a n n ) + ( x 1 a n 1 + x 2 a n 2 + ⋯ + x n a n n ) ˙ ] \left[\begin{matrix}(x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1})+(x_1a_{11} + x_2a_{12}+\cdots + x_na_{1n})\\ (x_1a_{12}+x_2a_{22}+\cdots+x_na_{n2})+(x_1a_{21} + x_2a_{22}+\cdots + x_na_{2n})\\ \\ \dot\\ \\ \dot\\ \\ \dot {(x_1a_{1n}+x_2a_{2n}+\cdots+x_na_{nn})+(x_1a_{n1} + x_2a_{n2}+\cdots + x_na_{nn})} \end{matrix} \right] ⎣ ⎡(x1a11+x2a21+⋯+xnan1)+(x1a11+x2a12+⋯+xna1n)(x1a12+x2a22+⋯+xnan2)+(x1a21+x2a22+⋯+xna2n)˙˙(x1a1n+x2a2n+⋯+xnann)+(x1an1+x2an2+⋯+xnann)˙⎦ ⎤
= [ 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[\begin{matrix}x_1a_{11}+x_2a_{21}+\cdots+x_na_{n1}\\ x_1a_{12}+x_2a_{22}+\cdots+x_na_{n2}\\ \\ \dot\\ \\ \dot\\ \\ \dot\\ \\ x_1a_{1n}+x_2a_{2n}+\cdots+x_na_{nn}\end{matrix} \right] ⎣ ⎡x1a11+x2a21+⋯+xnan1x1a12+x2a22+⋯+xnan2˙˙˙x1a1n+x2a2n+⋯+xnann⎦ ⎤ + + + [ x 1 a 11 + x 2 a 12 + ⋯ + x n a 1 n x 1 a 21 + x 2 a 22 + ⋯ + x n a 2 n ˙ ˙ ˙ x 1 a n 1 + x 2 a n 2 + ⋯ + x n a n n ] \left[\begin{matrix}x_1a_{11}+x_2a_{12}+\cdots+x_na_{1n}\\ x_1a_{21}+x_2a_{22}+\cdots+x_na_{2n}\\ \\ \dot\\ \\ \dot\\ \\ \dot\\ \\ x_1a_{n1}+x_2a_{n2}+\cdots+x_na_{nn}\end{matrix} \right] ⎣ ⎡x1a11+x2a12+⋯+xna1nx1a21+x2a22+⋯+xna2n˙˙˙x1an1+x2an2+⋯+xnann⎦ ⎤
= [ a 11 a 21 … a n 1 a 12 a 22 ⋯ a n 2 ⋮ ⋮ ⋱ ⋮ a 1 n a 2 n ⋯ a n n ] \left[\begin{matrix}a_{11} & a_{21} &\dots & a_{n1}\\ a_{12} & a_{22} &\cdots & a_{n2}\\ \vdots & \vdots &\ddots &\vdots\\ a_{1n} & a_{2n} &\cdots & a_{nn}\\\end{matrix}\right] ⎣ ⎡a11a12⋮a1na21a22⋮a2n…⋯⋱⋯an1an2⋮ann⎦ ⎤ [ x 1 x 2 ⋮ x n ] \left[\begin{matrix}x_1\\ x_2\\ \vdots \\ x_n \end{matrix} \right] ⎣ ⎡x1x2⋮xn⎦ ⎤ + [ a 11 a 12 … a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] \left[\begin{matrix}a_{11} & a_{12} &\dots & a_{1n}\\ a_{21} & a_{22} &\cdots & a_{2n}\\ \vdots & \vdots &\ddots &\vdots\\ a_{n1} & a_{n2} &\cdots & a_{nn}\\\end{matrix}\right] ⎣ ⎡a11a21⋮an1a12a22⋮an2…⋯⋱⋯a1na2n⋮ann⎦ ⎤ [ x 1 x 2 ⋮ x n ] \left[\begin{matrix}x_1\\ x_2\\ \vdots \\ x_n \end{matrix} \right] ⎣ ⎡x1x2⋮xn⎦ ⎤ = A T x + A x A^Tx+Ax ATx+Ax
有了上述内容铺垫之后,接下来,我们从数学⻆度讨论最⼩⼆乘法的基本理论,并尝试简单实现最⼩⼆乘法求解损失函数的⼀般过程。
首先,假设多元线性⽅程有如下形式: 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[\begin{matrix}w_1x_1^{(1)}+w_2x_2^{(1)}+\cdots+w_dx_d^{(1)}+b\\ w_1x_1^{(2)}+w_2x_2^{(2)}+\cdots+w_dx_d^{(2)}+b\\ \\ \dot\\ \\ \\ \dot\\ \\ \\ \dot\\ \\ w_1x_1^{(m)}+w_2x_2^{(m)}+\cdots+w_dx_d^{(m)}+b \end{matrix} \right] ⎣ ⎡w1x1(1)+w2x2(1)+⋯+wdxd(1)+bw1x1(2)+w2x2(2)+⋯+wdxd(2)+b˙˙˙w1x1(m)+w2x2(m)+⋯+wdxd(m)+b⎦ ⎤ = [ y ^ 1 y ^ 2 ⋮ y ^ m ] \left[\begin{matrix}\hat y_1\\ \hat y_2\\ \vdots\\ \hat y_m \end{matrix} \right] ⎣ ⎡y^1y^2⋮y^m⎦ ⎤
然后考虑将上述方程组进行改写,可以令:
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[\begin{matrix}x_1^{(1)} & x_2^{(1)}\cdots x_d^{(1)} & 1\\ x_1^{(2)} & x_2^{(2)}\cdots x_d^{(2)} & 1\\ \vdots & \vdots \ddots & 1\\ x_1^{(m)} & x_2^{(m)}\cdots x_d^{(m)} & 1 \end{matrix} \right] ⎣ ⎡x1(1)x1(2)⋮x1(m)x2(1)⋯xd(1)x2(2)⋯xd(2)⋮⋱x2(m)⋯xd(m)1111⎦ ⎤, y = [ y 1 y 2 ⋮ y m ] y=\left[\begin{matrix}y_1\\ y_2\\ \vdots \\y_m \end{matrix} \right] y=⎣ ⎡y1y2⋮ym⎦ ⎤, y ^ = [ y ^ 1 y ^ 2 ⋮ y ^ m ] \hat y=\left[\begin{matrix}\hat y_1\\ \hat y_2\\ \vdots \\\hat y_m \end{matrix} \right] y^=⎣ ⎡y^1y^2⋮y^m⎦ ⎤
- 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[\begin{matrix}1\\ -1 \end{matrix} \right] a⋅aT=[1,−1]⋅[1−1] = 2 2 2,其开平方后为 2 \sqrt{2} 2,也就等于2-范数的计算结果。
在确定损失函数的矩阵表示形式之后,接下来即可利⽤最小二乘法进行求解。基本求解思路:先求导函数、再令导函数取值为零,进⽽解出参数取值。只不过此时求解的是矩阵⽅程。
对 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[\begin{matrix}1 & 1\\ 3 & 1 \end{matrix} \right] X^=[1311],标签数组 y = [ 2 4 ] y=\left[\begin{matrix}2\\ 4 \end{matrix} \right] y=[24],参数向量 w ^ = [ w b ] \hat w=\left[\begin{matrix}w \\ b \end{matrix} \right] w^=[wb]
求解公式为 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[\begin{matrix}1 & 1\\ 3 & 1 \end{matrix} \right]^T\left[\begin{matrix}1 & 1\\ 3 & 1 \end{matrix} \right])^{-1}\left[\begin{matrix}1 & 1\\ 3 & 1 \end{matrix} \right]^T\left[\begin{matrix}2\\ 4 \end{matrix} \right] ([1311]T[1311])−1[1311]T[24]
上述这个小栗子的代码实现过程:
'''
输出结果:
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