前言
彩笔运维勇闯机器学习,今天我们来讨论一下lasso回归,本期又是一起数学推理过程展示
坐标下降法
目标找到一组参数,使目标函数值最小。比如\(f(x,y)=3x^2+5xy+10y^2\),要找到\(x,y\)使得\(f(x,y)\)取值最小
\[x_j^{(k+1)} = \arg \min_{x_j} f(x_1^{(k+1)}, \dots, x_{j-1}^{(k+1)}, x_j, x_{j+1}^{(k)}, \dots, x_n^{(k)})\]
每次固定\(x_j\)之外的所有变量,对\(x_j\)进行最小化,然后不断的迭代\(x_j\)
推导过程
我们就以上述提到的函数来推导一下,加深对这个过程的理解$$f(x,y)=3x2+5xy+10y2$$
1)首先先寻找一个点,\((1,1)\),计算此时的函数值
\[f(1,1)=3x^2+5xy+10y^2=18\]
2)分别对x,y求偏导
对x求偏导,并且令其导数为0:
\[\frac {\partial f}{\partial x}=6x+5y=0,x=-\frac{5}{6}y\]
同理对y求偏导
\[\frac {\partial f}{\partial y}=5x+20y=0,y=-\frac{1}{4}x\]
3)开始迭代,第一轮
调整x,固定y
\[x=-\frac{5}{6}y=-\frac{5}{6}·1 = -\frac{5}{6}\]
调整y,固定x
\[y=-\frac{1}{4}x=-\frac{1}{4}·-\frac{5}{6}=\frac{5}{24}\]
此时函数值为:
\[f(-\frac{5}{6},\frac{5}{24})=3x^2+5xy+10y^2 \approx 2.3438\]
第一轮结束:
- 函数最小值\(f(x,y)=2.3438\)
- \(|Δx|=|-\frac{5}{6}-1| \approx 1.8333\)
- \(|Δy|=|\frac{5}{24}-1| \approx 0.7917\)
4)第二轮
重复第一轮的操作
调整x,固定y
\[x=-\frac{5}{6}y=-\frac{5}{6}·\frac{5}{24} = -\frac{25}{144}\]
此时函数值为:
\[f(-\frac{25}{144},\frac{5}{24})=3x^2+5xy+10y^2 \approx 0.4883\]
调整y,固定x
\[y=-\frac{1}{4}x=-\frac{1}{4}·-\frac{25}{144}=\frac{25}{576}\]
此时函数值为:
\[f(-\frac{25}{144},\frac{25}{576})=3x^2+5xy+10y^2 \approx 0.1221\]
第二轮结束:
- 函数最小值\(f(x,y)=0.1221\)
- \(|Δx|=|-\frac{25}{6}-(-\frac{5}{6})| \approx 0.6597\)
- \(|Δy|=|\frac{25}{576}-\frac{5}{24}| \approx 0.1649\)
5)不断的迭代,直至收敛
随着迭代次数的不断增加,\(|Δx|\)、\(Δy\)、\(f(x,y)\)都在不断减小
当\(|Δx|\)、\(Δy\)均小于\(10^{-4}\),可以认为函数收敛
凸函数
通过上述的过程模拟,可以找到函数最小值时x,y分别是多少
对于函数\(f(x,y)=3x^2+5xy+10y^2\),可以直接计算偏导数为0,从而求出最小值
\[\frac {\partial f}{\partial x}=6x+5y=0,x=-\frac{5}{6}y\]
\[\frac {\partial f}{\partial y}=5x+20y=0,y=-\frac{1}{4}x\]
解方程组:
\[\begin{cases}x=-\frac{5}{6}y \\y=-\frac{1}{4}x\end{cases}\]
\[\begin{cases}x=0 \\y=0\end{cases}\]
该函数最小值是\(f(x,y)=0\),且\(x=0,y=0\)
直接用偏导数可以计算出函数最小值,有前提条件,那就是该函数是凸函数。凸函数的定义:在函数上任意两点连接的线段总是在函数图上方或者重合
局部最优解与全局最优解
如果函数不是凸函数,而是类似于这种,在某一个定义域内是凸函数
使用坐标下降法的时候,选择的初始值如果在\((x1,x2)\)之间,那找到的最小值就是局部最小,而非全局最小。之前介绍的梯度下降法也有同样的问题
那要怎么解决这个问题呢?不好意思,我也不会,还没学习到,所以暂时略过,后面再说 -_- !
lasso回归
介绍完坐标下降法之后,最后来到了本文的主题,lasso回归,为什么lasso回归能够降低无用参数的影响?lasso回归就是添加了一个参数的绝对值之和作为惩罚项,用线性回归为例,线性回归的损失函数常用MSE
\[\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2\]
lasso的数学表达:
\[\mathcal{L} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j|\]
我们通过一个例子,来说明lasso回归的工作流程。有一个数学模型:2个特征分别为\(x_1\)、\(x_2\),分别使用不带lasso惩罚项与带lasso惩罚项来进行推导
样本\(β_1\)\(β_2\)y111222123324.5最小二乘法
不带lasso惩罚项,就直接用最小二乘法求解,在之前的小结中曾经推倒过多元回归中最小二乘法的计算公式:
\[β=(X^TX)^{-1}X^Ty_i\]
首先特征矩阵\(X\):
$ X=
\begin{pmatrix}
1 & 1 \
2 & 1 \
3 & 2
\end{pmatrix}
$, \(X\)的转置
$ X^T=
\begin{pmatrix}
1 & 2 & 3 \
1 & 1 & 2 \
\end{pmatrix}
$
矩阵乘法,\(X^T·X=\begin{pmatrix}1 & 2 & 3 \\1 & 1 & 2\end{pmatrix}\begin{pmatrix}1 & 1 \\2 & 1 \\3 & 2\end{pmatrix} =\begin{pmatrix}14 & 9 \\9 & 6\end{pmatrix}\)
矩阵求逆常用初等变换法以及伴随矩阵法,对于上述演示数据,笨办法我直接用伴随矩阵求出来,但是都ai时代了,我决定使用chatgpt法(机智如我-_-) :\((X^TX)^{-1} =\begin{pmatrix}2 & -3 \\-3 & \frac{14}{3}\end{pmatrix}\)
根据矩阵结合律,我先算一下后面:\(X^T·y_i =\begin{pmatrix}1 & 2 & 3 \\1 & 1 & 2\end{pmatrix}\begin{pmatrix}2 \\3 \\4.5\end{pmatrix} =\begin{pmatrix}21.5 \\14\end{pmatrix}\)
最终计算出系数 \(\beta =(X^TX)^{-1}X^Ty_i =\begin{pmatrix}2 & -3 \\-3 & \frac{14}{3}\end{pmatrix}\begin{pmatrix}21.5 \\14\end{pmatrix} =\begin{pmatrix}1 \\\frac{2.5}{3}\end{pmatrix} \approx\begin{pmatrix}1 \\0.8333\end{pmatrix}\)
最终,通过最小二乘法,拟合函数为
\[y = x_1+0.8333x_2\]
带lasso惩罚项
为了计算方便,先将公式简化,把n去掉,因为同时缩放n倍,对于结果比对没有影响
\[\mathcal{L} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j| = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j|\]
lasso有一个超参数\(\lambda\),我们先设置一下\(\lambda = 2\),用坐标下降法:
1)首先寻找一个点\(\beta=(0,0)\),计算出函数值
\[\begin{aligned}\mathcal{L} &= \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j| \\ &= ((2-\beta_1-\beta_2)^2 + (3-2\beta_1-\beta_2)^2 + (4.5-3\beta_1-2\beta_2)^2 + (\lambda\sum_{j=1}^{p}|\beta|)) \\ &= 4+9+20.25 = 33.25\end{aligned}\]
2)先分别求偏导
\[\begin{aligned}\frac {\partial f}{\partial \beta_1} &= ((2-\beta_1-\beta_2)^2 + (3-2\beta_1-\beta_2)^2 + (4.5-3\beta_1-2\beta_2)^2 + (\lambda\sum_{j=1}^{p}|\beta|))' \\ &= 28\beta_1+18\beta_2-43 + (\lambda\sum_{j=1}^{p}|\beta|)'\end{aligned}\]
这里的惩罚项并没有进行导数计算,原因一会再说,先记为\(f_{absolute}'=(\lambda\sum_{j=1}^{p}|\beta|)'\)
所以最终对\(\beta_1\)求偏导:
\[\frac {\partial f}{\partial \beta_1} = 28\beta_1+18\beta_2-43 + f_{absolute}'\]
同理对\(\beta_2\)求偏导:
\[\frac {\partial f}{\partial \beta_2} = 18\beta_1+12\beta_2-28 + f_{absolute}'\]
由于绝对值在0处不可导,所以绝对值的导数需要分段来研究
\[\frac{\partial f_{absolute}}{\beta_i} = \lambda(|\beta_i|)' =\left\{\begin{array}{ll}\lambda·\beta_i \qquad ,\beta_i>0 \\0 \qquad ,\beta_i=0 \\-\lambda·\beta_i \qquad ,\beta_i0 \\28\beta_1-43 \qquad ,\beta_1=0 \\28\beta_1-43-2 \qquad ,\beta_10 \\\frac{43}{28} \qquad ,\beta_1=0 \\\frac{45}{28} \approx 1.607 \qquad ,\beta_1 |