米华 發表於 2025-9-22 10:19:00

彩笔运维勇闯机器学习--lasso回归

<h2 id="前言">前言</h2>
<p>彩笔运维勇闯机器学习,今天我们来讨论一下lasso回归,本期又是一起数学推理过程展示</p>
<h2 id="坐标下降法">坐标下降法</h2>
<p>目标找到一组参数,使目标函数值最小。比如<span class="math inline">\(f(x,y)=3x^2+5xy+10y^2\)</span>,要找到<span class="math inline">\(x,y\)</span>使得<span class="math inline">\(f(x,y)\)</span>取值最小</p>
<p></p><div class="math display">\[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)})
\]</div><p></p><p>每次固定<span class="math inline">\(x_j\)</span>之外的所有变量,对<span class="math inline">\(x_j\)</span>进行最小化,然后不断的迭代<span class="math inline">\(x_j\)</span></p>
<h4 id="推导过程">推导过程</h4>
<p>我们就以上述提到的函数来推导一下,加深对这个过程的理解$$f(x,y)=3x<sup>2+5xy+10y</sup>2$$</p>
<p>1)首先先寻找一个点,<span class="math inline">\((1,1)\)</span>,计算此时的函数值</p>
<p></p><div class="math display">\[f(1,1)=3x^2+5xy+10y^2=18
\]</div><p></p><p>2)分别对x,y求偏导</p>
<p>对x求偏导,并且令其导数为0:</p>
<p></p><div class="math display">\[\frac {\partial f}{\partial x}=6x+5y=0,x=-\frac{5}{6}y
\]</div><p></p><p>同理对y求偏导</p>
<p></p><div class="math display">\[\frac {\partial f}{\partial y}=5x+20y=0,y=-\frac{1}{4}x
\]</div><p></p><p>3)开始迭代,第一轮</p>
<p>调整x,固定y</p>
<p></p><div class="math display">\[x=-\frac{5}{6}y=-\frac{5}{6}·1 = -\frac{5}{6}
\]</div><p></p>


<p>调整y,固定x</p>
<p></p><div class="math display">\[y=-\frac{1}{4}x=-\frac{1}{4}·-\frac{5}{6}=\frac{5}{24}
\]</div><p></p><p>此时函数值为:</p>
<p></p><div class="math display">\[f(-\frac{5}{6},\frac{5}{24})=3x^2+5xy+10y^2 \approx 2.3438
\]</div><p></p><p>第一轮结束:</p>
<ul>
<li>函数最小值<span class="math inline">\(f(x,y)=2.3438\)</span></li>
<li><span class="math inline">\(|Δx|=|-\frac{5}{6}-1| \approx 1.8333\)</span></li>
<li><span class="math inline">\(|Δy|=|\frac{5}{24}-1| \approx 0.7917\)</span></li>
</ul>
<p>4)第二轮</p>
<p>重复第一轮的操作</p>
<p>调整x,固定y</p>
<p></p><div class="math display">\[x=-\frac{5}{6}y=-\frac{5}{6}·\frac{5}{24} = -\frac{25}{144}
\]</div><p></p><p>此时函数值为:</p>
<p></p><div class="math display">\[f(-\frac{25}{144},\frac{5}{24})=3x^2+5xy+10y^2 \approx 0.4883
\]</div><p></p><p>调整y,固定x</p>
<p></p><div class="math display">\[y=-\frac{1}{4}x=-\frac{1}{4}·-\frac{25}{144}=\frac{25}{576}
\]</div><p></p><p>此时函数值为:</p>
<p></p><div class="math display">\[f(-\frac{25}{144},\frac{25}{576})=3x^2+5xy+10y^2 \approx 0.1221
\]</div><p></p><p>第二轮结束:</p>
<ul>
<li>函数最小值<span class="math inline">\(f(x,y)=0.1221\)</span></li>
<li><span class="math inline">\(|Δx|=|-\frac{25}{6}-(-\frac{5}{6})| \approx 0.6597\)</span></li>
<li><span class="math inline">\(|Δy|=|\frac{25}{576}-\frac{5}{24}| \approx 0.1649\)</span></li>
</ul>
<p>5)不断的迭代,直至收敛</p>
<p>随着迭代次数的不断增加,<span class="math inline">\(|Δx|\)</span>、<span class="math inline">\(Δy\)</span>、<span class="math inline">\(f(x,y)\)</span>都在不断减小</p>
<p>当<span class="math inline">\(|Δx|\)</span>、<span class="math inline">\(Δy\)</span>均小于<span class="math inline">\(10^{-4}\)</span>,可以认为函数收敛</p>
<h4 id="凸函数">凸函数</h4>
<p>通过上述的过程模拟,可以找到函数最小值时x,y分别是多少</p>
<p>对于函数<span class="math inline">\(f(x,y)=3x^2+5xy+10y^2\)</span>,可以直接计算偏导数为0,从而求出最小值</p>
<p></p><div class="math display">\[\frac {\partial f}{\partial x}=6x+5y=0,x=-\frac{5}{6}y
\]</div><p></p><p></p><div class="math display">\[\frac {\partial f}{\partial y}=5x+20y=0,y=-\frac{1}{4}x
\]</div><p></p><p>解方程组:</p>
<p></p><div class="math display">\[\begin{cases}
x=-\frac{5}{6}y \\
y=-\frac{1}{4}x
\end{cases}
\]</div><p></p><p></p><div class="math display">\[\begin{cases}
x=0 \\
y=0
\end{cases}
\]</div><p></p><p>该函数最小值是<span class="math inline">\(f(x,y)=0\)</span>,且<span class="math inline">\(x=0,y=0\)</span></p>
<p>直接用偏导数可以计算出函数最小值,有前提条件,那就是该函数是凸函数。凸函数的定义:在函数上任意两点连接的线段总是在函数图上方或者重合</p>
<p><img alt="watermarked-lasso_1" loading="lazy" src="https://img2024.cnblogs.com/blog/1416773/202509/1416773-20250922100336626-2089252845.png" class="lazyload"></p>
<h4 id="局部最优解与全局最优解">局部最优解与全局最优解</h4>
<p>如果函数不是凸函数,而是类似于这种,在某一个定义域内是凸函数</p>
<p><img alt="watermarked-lasso_2" loading="lazy" src="https://img2024.cnblogs.com/blog/1416773/202509/1416773-20250922100345885-1094284716.png" class="lazyload"></p>
<p>使用坐标下降法的时候,选择的初始值如果在<span class="math inline">\((x1,x2)\)</span>之间,那找到的最小值就是局部最小,而非全局最小。之前介绍的梯度下降法也有同样的问题</p>
<p>那要怎么解决这个问题呢?不好意思,我也不会,还没学习到,所以暂时略过,后面再说 -_- !</p>
<h2 id="lasso回归">lasso回归</h2>
<p>介绍完坐标下降法之后,最后来到了本文的主题,lasso回归,为什么lasso回归能够降低无用参数的影响?lasso回归就是添加了一个参数的绝对值之和作为惩罚项,用线性回归为例,线性回归的损失函数常用MSE</p>
<p></p><div class="math display">\[\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
\]</div><p></p><p>lasso的数学表达:</p>
<p></p><div class="math display">\[\mathcal{L} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j|
\]</div><p></p><p>我们通过一个例子,来说明lasso回归的工作流程。有一个数学模型:2个特征分别为<span class="math inline">\(x_1\)</span>、<span class="math inline">\(x_2\)</span>,分别使用不带lasso惩罚项与带lasso惩罚项来进行推导</p>
<table>
<thead>
<tr>
<th>样本</th>
<th><span class="math inline">\(β_1\)</span></th>
<th><span class="math inline">\(β_2\)</span></th>
<th>y</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>2</td>
<td>4.5</td>
</tr>
</tbody>
</table>
<h4 id="最小二乘法">最小二乘法</h4>
<p>不带lasso惩罚项,就直接用最小二乘法求解,在之前的小结中曾经推倒过多元回归中最小二乘法的计算公式:</p>
<p></p><div class="math display">\[β=(X^TX)^{-1}X^Ty_i
\]</div><p></p><p>首先特征矩阵<span class="math inline">\(X\)</span>:<br>
$ X=<br>
\begin{pmatrix}<br>
1 &amp; 1 \<br>
2 &amp; 1 \<br>
3 &amp; 2<br>
\end{pmatrix}<br>
$, <span class="math inline">\(X\)</span>的转置<br>
$ X^T=<br>
\begin{pmatrix}<br>
1 &amp; 2 &amp; 3 \<br>
1 &amp; 1 &amp; 2 \<br>
\end{pmatrix}<br>
$</p>
<p>矩阵乘法,<span class="math inline">\(X^T·X=
\begin{pmatrix}
1 &amp; 2 &amp; 3 \\
1 &amp; 1 &amp; 2
\end{pmatrix}
\begin{pmatrix}
1 &amp; 1 \\
2 &amp; 1 \\
3 &amp; 2
\end{pmatrix} =
\begin{pmatrix}
14 &amp; 9 \\
9 &amp; 6
\end{pmatrix}
\)</span></p>
<p>矩阵求逆常用初等变换法以及伴随矩阵法,对于上述演示数据,笨办法我直接用伴随矩阵求出来,但是都ai时代了,我决定使用chatgpt法(机智如我-_-) :<span class="math inline">\((X^TX)^{-1} =
\begin{pmatrix}
2 &amp; -3 \\
-3 &amp; \frac{14}{3}
\end{pmatrix}
\)</span></p>
<p>根据矩阵结合律,我先算一下后面:<span class="math inline">\(X^T·y_i =
\begin{pmatrix}
1 &amp; 2 &amp; 3 \\
1 &amp; 1 &amp; 2
\end{pmatrix}
\begin{pmatrix}
2 \\
3 \\
4.5
\end{pmatrix} =
\begin{pmatrix}
21.5 \\
14
\end{pmatrix}
\)</span></p>
<p>最终计算出系数 <span class="math inline">\(\beta =(X^TX)^{-1}X^Ty_i =
\begin{pmatrix}
2 &amp; -3 \\
-3 &amp; \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}
\)</span></p>
<p>最终,通过最小二乘法,拟合函数为</p>
<p></p><div class="math display">\[y = x_1+0.8333x_2
\]</div><p></p><h4 id="带lasso惩罚项">带lasso惩罚项</h4>
<p>为了计算方便,先将公式简化,把n去掉,因为同时缩放n倍,对于结果比对没有影响</p>
<p></p><div class="math display">\[\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|
\]</div><p></p><p>lasso有一个超参数<span class="math inline">\(\lambda\)</span>,我们先设置一下<span class="math inline">\(\lambda = 2\)</span>,用坐标下降法:</p>
<p>1)首先寻找一个点<span class="math inline">\(\beta=(0,0)\)</span>,计算出函数值</p>
<p></p><div class="math display">\[\begin{aligned}
\mathcal{L} &amp;= \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j| \\
&amp;= ((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|)) \\
&amp;= 4+9+20.25 = 33.25
\end{aligned}
\]</div><p></p><p>2)先分别求偏导</p>
<p></p><div class="math display">\[\begin{aligned}
\frac {\partial f}{\partial \beta_1} &amp;= ((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|))' \\
&amp;= 28\beta_1+18\beta_2-43 + (\lambda\sum_{j=1}^{p}|\beta|)'
\end{aligned}
\]</div><p></p><p>这里的惩罚项并没有进行导数计算,原因一会再说,先记为<span class="math inline">\(f_{absolute}'=(\lambda\sum_{j=1}^{p}|\beta|)'\)</span></p>
<p>所以最终对<span class="math inline">\(\beta_1\)</span>求偏导:</p>
<p></p><div class="math display">\[\frac {\partial f}{\partial \beta_1} = 28\beta_1+18\beta_2-43 + f_{absolute}'
\]</div><p></p><p>同理对<span class="math inline">\(\beta_2\)</span>求偏导:</p>
<p></p><div class="math display">\[\frac {\partial f}{\partial \beta_2} = 18\beta_1+12\beta_2-28 + f_{absolute}'
\]</div><p></p><p>由于绝对值在0处不可导,所以绝对值的导数需要分段来研究</p>
<p></p><div class="math display">\[\frac{\partial f_{absolute}}{\beta_i} = \lambda(|\beta_i|)' =
\left\{
\begin{array}{ll}
\lambda·\beta_i \qquad   ,\beta_i&gt;0 \\
0 \qquad      ,\beta_i=0 \\
-\lambda·\beta_i \qquad ,\beta_i&lt;0
\end{array}
\right.
\]</div><p></p><p>3)第一次迭代,<span class="math inline">\(\beta=(0,0)\)</span>,更新<span class="math inline">\(\beta_1\)</span>,固定<span class="math inline">\(\beta_2=0\)</span></p>
<p></p><div class="math display">\[\begin{aligned}
\frac {\partial f}{\partial \beta_1} &amp;= 28\beta_1+18\beta_2-43 + f_{absolute}' = 28\beta_1 - 43 + \lambda(|\beta_i|)' \\
&amp;= \left\{
\begin{array}{ll}
28\beta_1-43+2 \qquad    ,\beta_1&gt;0 \\
28\beta_1-43 \qquad   ,\beta_1=0 \\
28\beta_1-43-2 \qquad    ,\beta_1&lt;0
\end{array}
\right.
\end{aligned}
\]</div><p></p><p>令偏导数为0</p>
<p></p><div class="math display">\[\begin{aligned}
\beta_1 =
\left\{
\begin{array}{ll}
\frac{41}{28} \approx 1.464 \qquad       ,\beta_1&gt;0 \\
\frac{43}{28} \qquad    ,\beta_1=0 \\
\frac{45}{28} \approx 1.607\qquad      ,\beta_1&lt;0
\end{array}
\right.
\end{aligned}
\]</div><p></p><p>由于<span class="math inline">\(\beta_1&lt;=0\)</span>与计算结果矛盾,所以<span class="math inline">\(\beta_1=1.464\)</span></p>
<p>4)第一次迭代,固定<span class="math inline">\(\beta_1=1.464\)</span>,更新<span class="math inline">\(\beta_2\)</span></p>
<p></p><div class="math display">\[\begin{aligned}
\frac {\partial f}{\partial \beta_2} &amp;= 18\beta_1+12\beta_2-28 + f_{absolute} = 12\beta_2-28 + \lambda(|\beta_i|)' \\
&amp;= \left\{
\begin{array}{ll}
26.352+12\beta_2-28+2 \qquad   ,\beta_2&gt;0 \\
26.352+12\beta_2-28 \qquad      ,\beta_2=0 \\
26.352+12\beta_2-28-2 \qquad   ,\beta_2&lt;0
\end{array}
\right.
\end{aligned}
\]</div><p></p><p>令偏导数为0</p>
<p></p><div class="math display">\[\begin{aligned}
\beta_2 =
\left\{
\begin{array}{ll}
\frac{-0.352}{12} \approx -0.0293 \qquad         ,\beta_2&gt;0 \\
\frac{1.648}{12} \approx 0.1373 \qquad,\beta_2=0 \\
\frac{3.648}{12} = 0.304 \qquad,\beta_2&lt;0
\end{array}
\right.
\end{aligned}
\]</div><p></p><p>这个。。。。怎么全是矛盾的??计算出来的<span class="math inline">\(\beta_2\)</span>都不对,那<span class="math inline">\(\beta_2\)</span>到底取值是什么,这里要用次梯度来解决这个问题,一会再详细讨论,这里只需要知道,<span class="math inline">\(\beta_2\)</span>取值在[-0.0293, 0.304]之间,而最优解就是0</p>
<p>5)计算函数值</p>
<p></p><div class="math display">\[\begin{aligned}
\mathcal{L}(1.464, 0) &amp;= \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |β_j| \\
&amp;= ((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|)) \\
&amp;\approx 0.2872+0.0582+0.2446+2.928 = 3.518
\end{aligned}
\]</div><p></p><p>6)第一轮小结</p>
<ul>
<li>函数最小值<span class="math inline">\(\mathcal{L}(x,y)=3.518\)</span>,从33.25下降而来</li>
<li><span class="math inline">\(|Δ\beta_1|=|0-1.464| \approx 1.464\)</span></li>
<li><span class="math inline">\(|Δ\beta_2|=|0-0| = 0\)</span></li>
</ul>
<p>第一次迭代就已经把<span class="math inline">\(\beta_2\)</span>给家人们打下来了,<span class="math inline">\(\beta_2\)</span>对于寻找函数最小值,已经没有意义了,换句话来说,该特征对于提升模型性能意义不大</p>
<p>但是依然需要继续寻找最合适的<span class="math inline">\(\beta_1\)</span>,直至收敛,所以还需要继续迭代下去,下面就不演示了</p>
<p>继续迭代。。。。最终经过lasso回归的拟合函数应该是这样的:</p>
<p></p><div class="math display">\[y=\beta_1x_1
\]</div><p></p><p>可以看到,lasso回归有可能把一些特征的系数压缩成0了,从而去掉该特征对于目标函数的影响,从而降低该特征的影响,提高了模型了泛化能力</p>
<h4 id="次梯度">次梯度</h4>
<p>在刚才的推导中,遇到了这个问题,<span class="math inline">\(
\begin{aligned}
\beta_2 =
\left\{
\begin{array}{ll}
\frac{-0.352}{12} \approx -0.0293 \qquad         ,\beta_2&gt;0 \\
\frac{1.648}{12} \approx 0.1373 \qquad,\beta_2=0 \\
\frac{3.648}{12} = 0.304 \qquad,\beta_2&lt;0
\end{array}
\right.
\end{aligned}
\)</span>,<span class="math inline">\(\beta_2\)</span>与所有的结果都是矛盾的,之所以会出现这种情况,是由于对绝对值求导数导致的。我们都知道,绝对值在0的时候是不可导的</p>
<p>当<span class="math inline">\(\beta=0\)</span>的时候,需要使用次梯度的概念,什么是次梯度,我这里也不班门弄斧的搬概念了,大家有兴趣自己去google一下</p>
<p>这里只需要记住次梯度是一个集合,它的范围就是,若<span class="math inline">\(
\begin{aligned}
\beta_2 =
\left\{
\begin{array}{ll}
\ a \qquad       ,\beta_2&gt;0 \\
\ b \qquad       ,\beta_2&lt;0
\end{array}
\right.
\end{aligned}
\)</span>,那<span class="math inline">\(\beta=0\)</span>的次梯度是<span class="math inline">\(\)</span>之间</p>
<p>更直接一点,如果我们在次梯度集合中,找到为0的选项,那就意味着找到了函数的最小值点</p>
<p>这也说明了,lasso回归不能直接用导数为0的方法来找最优解,需要用到坐标下降法的原因</p>
<h2 id="小结">小结</h2>
<p>笔者写这篇文章的时候真是头皮发麻,“凸函数”、“最优解”等名词让我回想起学生时代被高数、微积分支配的恐惧,如今再次面对,竟然能够坦然处之,甚至觉得莫名亲切,进而会心一笑。被动接受与主动求索,还真是不一样</p>
<h2 id="联系我">联系我</h2>
<ul>
<li>联系我,做深入的交流<br>
<img alt="" width="500" height="200" loading="lazy" src="https://img2024.cnblogs.com/blog/1416773/202411/1416773-20241121135740959-1907948957.png#" class="lazyload"></li>
</ul>
<hr>
<p>至此,本文结束<br>
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:it排球君,转载请注明原文链接:https://www.cnblogs.com/MrVolleyball/p/19104632</p>
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/MrVolleyball/p/19104632
頁: [1]
查看完整版本: 彩笔运维勇闯机器学习--lasso回归