【机器学习算法】基于最小二乘损失(MSE)的多元线性回归解析解推导

推导多元线性回归损失函数的解析解

基于上一节的博客我们基于概率统计中最大似然估计的角度推导了多元线性回归的损失函数,但没有给出具体求解该函数的方式,在本节中我们将再次硬核一波,利用数学公式推得该损失函数的解析解形式。(至于为什么是解析解,这是因为多元线性回归其数值解基于样本的不同而不同,我们只能求出解的函数表达式,最后再通过计算机求出精确解)

推导过程详解

线性回归损失函数:
l o s s = ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 loss= \sum_{i=1}^{m}\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2} loss=i=1m(y(i)θTx(i))2

一元线性回归解析解

如果yi,xi,θ均为一元变量,就是一元线性回归。我们先来探讨下一元线性回归的解析解形式,为了区分,这里把θ换成w,其中的偏置项b也单独分离出来:
请添加图片描述
可以看到,一元线性回归的解析解其实并不那么直观,如果是多元线性回归,只要把yi,xi换成向量,θ换成矩阵即可。

多元线性回归解析解

由于我们在求取argmax(theta)loss时会用到求导,并且任何常数项系数不会影响theta的最终取值。所以这里我们使用一个小trick,在函数前乘上一个常数1/2,方便直接约去平方项求导产生的常数2:
l o s s = 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 loss= \frac{1}{2} \sum_{i=1}^{m}\left(y^{(i)}-\theta^{T} x^{(i)}\right)^{2} loss=21i=1m(y(i)θTx(i))2

转化为矩阵运算的简洁形式:

l o s s = 1 2 ( θ T X − y ) T ( θ T X − y ) = 1 2 ( ( X θ ) T − y T ) ( X θ − y ) = 1 2 ( θ T X T − y T ) ( X θ − y ) = 1 2 ( θ T X T X θ − θ T X T y − y T X θ + y T y ) \begin{aligned} &loss=\frac{1}{2}(\theta^{T}X-y)^{T}(\theta^{T}X-y) \\ &=\frac{1}{2}\left((X \theta)^{T}-y^{T}\right)(X \theta-y) \\ &=\frac{1}{2}\left(\theta^{T} X^{T}-y^{T}\right)(X \theta-y) \\ &=\frac{1}{2}\left(\theta^{T} X^{T} X \theta-\theta^{T} X^{T} y-y^{T} X \theta+y^{T} y\right) \end{aligned} loss=21(θTXy)T(θTXy)=21((Xθ)TyT)(Xθy)=21(θTXTyT)(Xθy)=21(θTXTXθθTXTyyTXθ+yTy)
这里需要注意一点就是:
θ T X 和 X θ \begin{aligned} \theta^{T}X 和 X \theta \end{aligned} θTXXθ
上述的两个形式都可以原来描述多元线性回归表达式,只不过需要注意的一点就是左边的X中的每一条样本是以列向量的形式存在的,一般用于描述在样本只有一条的情况下,而右边的X中的每条样本是以行向量的形式存在的,在X包含多条样本的时候,我们比较常使用第二种表示形式:

请添加图片描述

多元线性函数同一元线性函数一样,函数的最优解一定对应于函数之中的一个极值点,在一元线性函数中,求解函数的极值点就是判断这个函数的一阶导是否为0,扩展到多元函数上,即对应这个函数的梯度为0:

首先给出矩阵常用的求导公式
∂ θ T A θ ∂ θ = 2 A θ ∂ θ T A ∂ θ = A ∂ A θ ∂ θ = A T \begin{aligned} &\frac{\partial \theta^{T} A \theta}{\partial \theta}=2 A \theta \\ &\frac{\partial \theta^{T} A}{\partial \theta}=A \\ &\frac{\partial A \theta}{\partial \theta}=A^{T} \end{aligned} θθTAθ=2AθθθTA=AθAθ=AT
因此有
l o s s ′ ( θ ) = 1 2 [ ( θ T X T X θ ) ′ − ( θ T X T y ) ′ − ( y T X θ ) ′ + ( y T y ) ′ ] = 1 2 [ 2 X T X θ − X T y − ( y T X ) T ] = 1 2 [ 2 X T X θ − 2 X T y ] = X T X θ − X T y = X T ( X θ − y ) \begin{aligned} loss^{\prime}(\theta) &=\frac{1}{2}\left[\left(\theta^{T} X^{T} X \theta\right)^{\prime}-\left(\theta^{T} X^{T} y\right)^{\prime}-\left(y^{T} X \theta\right)^{\prime}+\left(y^{T} y\right)^{\prime}\right] \\ &=\frac{1}{2}\left[2 X^{T} X \theta-X^{T} y-\left(y^{T} X\right)^{T}\right] \\ &=\frac{1}{2}\left[2 X^{T} X \theta-2 X^{T} y\right] \\ &=X^{T} X \theta-X^{T} y\\ &=X^{T}(X \theta-y) \end{aligned} loss(θ)=21[(θTXTXθ)(θTXTy)(yTXθ)+(yTy)]=21[2XTXθXTy(yTX)T]=21[2XTXθ2XTy]=XTXθXTy=XT(Xθy)
根据极值点的导数为0,因此:
X T X θ − X T y = 0 θ = ( X T X ) − 1 X T y X^{T} X \theta-X^{T} y =0 \\ \theta=\left(X^{T} X\right)^{-1} X^{T} y XTXθXTy=0θ=(XTX)1XTy
最终我们便得到当损失函数取得最小值时theta的解析解形式。大功告成,只需要将原始数据中的输入x与标签y作为解析解中的参数,求得的theta一定能使loss达到最小,,吗

这时候可能就有人产生疑惑了,不对,你这有问题呀,我们所求得的theta只能代表loss函数取得极值点的值,极值点也有可能是是极大值点呀,即使是极小值点,也不一定是全局最优的那个极小值点呀,这样一来,你这个推导的前提就已经靠不住脚了。

是的。。。没错,这位同学说得对呀,我们单凭一阶导为0的确不能判断一个函数在该点具有极小值,更不能判断函数在该点具有最小值。

凸函数与最优化

在一元函数中,我们知道,函数的极大值或极小值点可以通过二阶导判断,极大值点处的二阶导大于0,极小值点处的二阶导小于0,对于多元函数,情况稍微比较复杂,不过判别方法也是类似的。

在多元函数中,函数的二阶导可以通过**黑塞矩阵(Hessian Matrix)**表示。黑塞矩阵是有目标函数某点处的二阶偏导所构成的对称矩阵,具体形式如下:

H ( f ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] = ( ∂ 2 f ∂ x i ∂ x j ) H(f)=\left[\begin{array}{cccc} \frac{\partial^{2} f}{\partial x_{1}^{2}} & \frac{\partial^{2} f}{\partial x_{1} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{1} \partial x_{n}} \\ \frac{\partial^{2} f}{\partial x_{2} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{2}^{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{2} \partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2} f}{\partial x_{n} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{n} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{n}^{2}} \end{array}\right] =\left(\frac{\partial^{2} f}{\partial x_{i} \partial x_{j}}\right) H(f)=x122fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fxn22f=(xixj2f)
黑塞矩阵不仅能用来判断函数的极值点类型,还能用来判断函数的凹凸性,而函数的凹凸性对于求解像多元函数回归这样的最优化问题是十分必要的。

请添加图片描述

直观理解

凸函数:(若函数有极值,则是极小值,且是全局最小值)

非凸函数:(函数的极值有多个或有鞍点)

在机器学习中,若一个优化问题的损失函数是凸函数,则说明该函数的极值点一定是极小值点且一定是全局最优解,这样一来,我们通过解析解或将来使用梯度下降法迭代优化收敛得到的值,就一定会是全局最优解。

而判断函数凹凸性的一个方法就是看这个函数的黑塞矩阵是否是半正定的。

对称矩阵正负定的定义:

正定 <=>对于实对称矩阵M,任意非0实系数向量x,有xᵀMx>0

半正定<=>对于实对称矩阵M,任意非0实系数向量x,有xᵀMx≥0

负定 <=>对于实对称矩阵M,任意非0实系数向量x,有xᵀMx<0

半负定<=>对于实对称矩阵M,任意非0实系数向量x,有xᵀMx≤0

半正定矩阵的性质:

1.行列式≥0

2.A的特征值均≥0

请添加图片描述

直观理解

一个函数的黑塞矩阵如果是正定的,那么它的形状大致如图A

一个函数的黑塞矩阵如果是负定的,那么它的形状大致如图C

一个函数的黑塞矩阵如果是不定的,那么它的形状大致如图B

再回到多元线性回归损失函数上,我们求出了损失函数的一阶导形式:
l o s s ′ ( θ ) = X T X θ − X T y \begin{aligned} loss^{\prime}(\theta) &=X^{T} X \theta-X^{T} y \end{aligned} loss(θ)=XTXθXTy
而函数的二阶导形式就是在一阶导的基础上对theta变量再求导:
H e s s ( l o s s ) = l o s s ′ ′ ( θ ) = X T X Hess(loss)=\begin{aligned} loss^{\prime\prime}(\theta) &=X^{T} X \end{aligned} Hess(loss)=loss(θ)=XTX
假设X中只有一条样本,那么(n,1)·(1,n),最终就是一个(n,n)的实对称矩阵,该矩阵就是多元线性回归损失函数的hessian矩阵:

请添加图片描述

可以看到,损失函数的hessian矩阵是一个对称矩阵,且可以很容易证明该对称阵是半正定的:

请添加图片描述

根据对称矩阵正负定的定义,右边的形式就相当于两个向量做点积的平方,这不一定大于等于0嘛。

当然,在更多的情况下,就比如深度学习中,对于损失函数的优化更多是一种非凸优化,非凸优化的缺陷在于,即使迭代的次数足够多,也有很大的概率陷入局部最优解,在这种情况下,模型不再执着于找到全局最优解,而更多侧重于对模型本身的优化或者对损失函数的优化,不强调最终结果达到最优,只要模型堪用就行

代码实战:波士顿房价预测

利用上述求得的解析解求解波士顿房价预测问题:

利用python sklearn机器学习库引入波士顿房价数据集:

import numpy as np
from sklearn.datasets import load_boston

X, y = load_boston(return_X_y=True)
print(X.shape,y.shape)

(506, 13) (506,)

可以看到该数据集包括两个部分,一个是输入X,另一个是输出y,总共包括506条数据。每一个X是一个含有13个参数的13维向量,表示能够决定房价的各种因素,y是一个数值,表示房价。

我们需要做的就是预测出参数θ,使得θᵀX输出的值和标签y尽可能的接近,在这里我们就可以通过将输入X带入我们推出的解析解中,一步得到数值解:

不过值得注意的是,我们推得的解析解形式是基于将偏置b合并到矩阵θ中去,因此同时得在X的第一列加一个常数1,最终相乘后就可表示偏置项b

m, n = X.shape[0], X.shape[1]
X = np.concatenate((np.ones((m, 1)),X), axis=1)
print(X.shape,y.shape)
print(X)

(506, 14) (506,)
[[1.0000e+00 6.3200e-03 1.8000e+01 … 1.5300e+01 3.9690e+02 4.9800e+00]
[1.0000e+00 2.7310e-02 0.0000e+00 … 1.7800e+01 3.9690e+02 9.1400e+00]
[1.0000e+00 2.7290e-02 0.0000e+00 … 1.7800e+01 3.9283e+02 4.0300e+00]

[1.0000e+00 6.0760e-02 0.0000e+00 … 2.1000e+01 3.9690e+02 5.6400e+00]
[1.0000e+00 1.0959e-01 0.0000e+00 … 2.1000e+01 3.9345e+02 6.4800e+00]
[1.0000e+00 4.7410e-02 0.0000e+00 … 2.1000e+01 3.9690e+02 7.8800e+00]]

带入解析解求得结果:

W = np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)), X.T), y)
pred = np.dot(X, W)
print(np.mean(np.square(pred-y)))

21.894831181729206

最终的损失值大约在21左右,而这也是线性模型能够达到的最优解。

猜你喜欢

转载自blog.csdn.net/SESESssss/article/details/121387284