机器学习 Lasso回归算法「建议收藏」

机器学习 Lasso回归算法「建议收藏」Lasso回归算法:坐标轴下降法与最小角回归法小结    前面的文章对线性回归做了一个小结,文章在这:线性回归原理小结。里面对线程回归的正则化也做了一个初步的介绍。提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归。但是对于Lasso回归的解法没有提及,本文是对该文的补充和扩展。以下都用矩阵法表示,如果对于矩阵分析不熟悉,推荐学习张贤达的《矩阵分析与应用》…

大家好,又见面了,我是你们的朋友全栈君。

Lasso回归算法: 坐标轴下降法与最小角回归法小结

    前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结。里面对线程回归的正则化也做了一个初步的介绍。提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归。但是对于Lasso回归的解法没有提及,本文是对该文的补充和扩展。以下都用矩阵法表示,如果对于矩阵分析不熟悉,推荐学习张贤达的《矩阵分析与应用》。

1. 回顾线性回归 

    首先我们简要回归下线性回归的一般形式: 

    hθ(X)=Xθhθ(X)=Xθ

    需要极小化的损失函数是: 

    J(θ)=12(Xθ−Y)T(Xθ−Y)J(θ)=12(Xθ−Y)T(Xθ−Y)

    如果用梯度下降法求解,则每一轮θθ迭代的表达式是: 

    θ=θ−αXT(Xθ−Y)θ=θ−αXT(Xθ−Y)

    其中αα为步长。

    如果用最小二乘法,则θθ的结果是:

    θ=(XTX)−1XTYθ=(XTX)−1XTY

2. 回顾Ridge回归

    由于直接套用线性回归可能产生过拟合,我们需要加入正则化项,如果加入的是L2正则化项,就是Ridge回归,有时也翻译为脊回归。它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和一个调节线性回归项和正则化项权重的系数αα。损失函数表达式如下:

    J(θ)=12(Xθ−Y)T(Xθ−Y)+12α||θ||22J(θ)=12(Xθ−Y)T(Xθ−Y)+12α||θ||22

    其中αα为常数系数,需要进行调优。||θ||2||θ||2为L2范数。

    Ridge回归的解法和一般线性回归大同小异。如果采用梯度下降法,则每一轮θθ迭代的表达式是:

    θ=θ−(βXT(Xθ−Y)+αθ)θ=θ−(βXT(Xθ−Y)+αθ)

    其中ββ为步长。

    如果用最小二乘法,则θθ的结果是:

    θ=(XTX+αE)−1XTYθ=(XTX+αE)−1XTY 

    其中E为单位矩阵。

    Ridge回归在不抛弃任何一个变量的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但这会使得模型的变量特别多,模型解释性差。有没有折中一点的办法呢?即又可以防止过拟合,同时克服Ridge回归

模型变量多的缺点呢?有,这就是下面说的Lasso回归。

3. 初识Lasso回归 

    Lasso回归有时也叫做线性回归的L1正则化,和Ridge回归的主要区别就是在正则化项,Ridge回归用的是L2正则化,而Lasso回归用的是L1正则化。Lasso回归的损失函数表达式如下: 

    J(θ)=12n(Xθ−Y)T(Xθ−Y)+α||θ||1J(θ)=12n(Xθ−Y)T(Xθ−Y)+α||θ||1

    其中n为样本个数,αα为常数系数,需要进行调优。||θ||1||θ||1为L1范数。   

    Lasso回归使得一些系数变小,甚至还是一些绝对值较小的系数直接变为0,因此特别适用于参数数目缩减与参数的选择,因而用来估计稀疏参数的线性模型。

 

    但是Lasso回归有一个很大的问题,导致我们需要把它单独拎出来讲,就是它的损失函数不是连续可导的,由于L1范数用的是绝对值之和,导致损失函数有不可导的点。也就是说,我们的最小二乘法,梯度下降法,牛顿法与拟牛顿法对它统统失效了。那我们怎么才能求有这个L1范数的损失函数极小值呢?

 

    OK,本章主角,两种全新的求极值解法坐标轴下降法(coordinate descent)和最小角回归法( Least Angle Regression, LARS)该隆重出场了。          

4. 用坐标轴下降法求解Lasso回归

    坐标轴下降法顾名思义,是沿着坐标轴的方向去下降,这和梯度下降不同。梯度下降是沿着梯度的负方向下降。不过梯度下降和坐标轴下降的共性就都是迭代法,通过启发式的方式一步步迭代求解函数的最小值。

    坐标轴下降法的数学依据主要是这个结论(此处不做证明):一个可微的凸函数J(θ)J(θ), 其中θθ是nx1的向量,即有n个维度。如果在某一点θ¯¯¯θ¯,使得J(θ)J(θ)在每一个坐标轴θ¯¯¯iθ¯i(i = 1,2,…n)上都是最小值,那么J(θ¯¯¯i)J(θ¯i)就是一个全局的最小值。

    于是我们的优化目标就是在θθ的n个坐标轴上(或者说向量的方向上)对损失函数做迭代的下降,当所有的坐标轴上的θiθi(i = 1,2,…n)都达到收敛时,我们的损失函数最小,此时的θθ即为我们要求的结果。

    下面我们看看具体的算法过程:

    1. 首先,我们把θθ向量随机取一个初值。记为θ(0)θ(0) ,上面的括号里面的数字代表我们迭代的轮数,当前初始轮数为0.

    2. 对于第k轮的迭代。我们从θ(k)1θ1(k)开始,到θ(k)nθn(k)为止,依次求θ(k)iθi(k)。θ(k)iθi(k)的表达式如下:

    θ(k)i∈argminθiJ(θ(k)1,θ(k)2,…θ(k)i−1,θi,θ(k−1)i+1,…,θ(k−1)n)θi(k)∈argmin⏟θiJ(θ1(k),θ2(k),…θi−1(k),θi,θi+1(k−1),…,θn(k−1)) 

    也就是说θ(k)iθi(k)是使J(θ(k)1,θ(k)2,…θ(k)i−1,θi,θ(k−1)i+1,…,θ(k−1)n)J(θ1(k),θ2(k),…θi−1(k),θi,θi+1(k−1),…,θn(k−1))最小化时候的θiθi的值。此时J(θ)J(θ)只有θ(k)iθi(k)是变量,其余均为常量,因此最小值容易通过求导求得。

    如果上面这个式子不好理解,我们具体一点,在第k轮,θθ向量的n个维度的迭代式如下:

    θ(k)1∈argminθ1J(θ1,θ(k−1)2,…,θ(k−1)n)θ1(k)∈argmin⏟θ1J(θ1,θ2(k−1),…,θn(k−1)) 

    θ(k)2∈argminθ2J(θ(k)1,θ2,θ(k−1)3…,θ(k−1)n)θ2(k)∈argmin⏟θ2J(θ1(k),θ2,θ3(k−1)…,θn(k−1)) 

    …

    θ(k)n∈argminθnJ(θ(k)1,θ(k)2,…,θ(k)n−1,θn)θn(k)∈argmin⏟θnJ(θ1(k),θ2(k),…,θn−1(k),θn) 

    3. 检查θ(k)θ(k)向量和θ(k−1)θ(k−1)向量在各个维度上的变化情况,如果在所有维度上变化都足够小,那么θ(k)θ(k)即为最终结果,否则转入2,继续第k+1轮的迭代。

    以上就是坐标轴下降法的求极值过程,可以和梯度下降做一个比较:

    a) 坐标轴下降法在每次迭代中在当前点处沿一个坐标方向进行一维搜索 ,固定其他的坐标方向,找到一个函数的局部极小值。而梯度下降总是沿着梯度的负方向求函数的局部最小值。

    b) 坐标轴下降优化方法是一种非梯度优化算法。在整个过程中依次循环使用不同的坐标方向进行迭代,一个周期的一维搜索迭代过程相当于一个梯度下降的迭代。

    c) 梯度下降是利用目标函数的导数来确定搜索方向的,该梯度方向可能不与任何坐标轴平行。而坐标轴下降法法是利用当前坐标方向进行搜索,不需要求目标函数的导数,只按照某一坐标方向进行搜索最小值。

    d) 两者都是迭代方法,且每一轮迭代,都需要O(mn)的计算量(m为样本数,n为系数向量的维度)

5. 用最小角回归法求解Lasso回归

    第四节介绍了坐标轴下降法求解Lasso回归的方法,此处再介绍另一种常用方法, 最小角回归法(Least Angle Regression, LARS)。

    在介绍最小角回归前,我们先看看两个预备算法,好吧,这个算法真没有那么好讲。

5.1 前向选择(Forward Selection)算法

    第一个预备算法是前向选择(Forward Selection)算法。

    前向选择算法的原理是是一种典型的贪心算法。要解决的问题是对于:

    Y=XθY=Xθ这样的线性关系,如何求解系数向量θθ的问题。其中YY为 mx1的向量,XX为mxn的矩阵,θθ为nx1的向量。m为样本数量,n为特征维度。

    把 矩阵XX看做n个mx1的向量XiXi(i=1,2,…n),在YY的XX变量XiXi(i =1,2,…m)中,选择和目标YY最为接近(余弦距离最大)的一个变量XkXk,用XkXk来逼近YY,得到下式:

    Y¯¯¯¯=XkθkY¯=Xkθk

    其中: θk=<Xk,Y>||Xk||2θk=<Xk,Y>||Xk||2

    即:Y¯¯¯¯Y¯ 是 YY在 XkXk上的投影。那么,可以定义残差(residual):   Yyes=Y−Y¯¯¯¯Yyes=Y−Y¯。由于是投影,所以很容易知道 Yyes和XkYyes和Xk是正交的。再以YyesYyes为新的因变量,去掉XkXk后,剩下的自变量的集合XiXi,i=1,2,3…k−1,k+1,…n}为新的自变量集合,重复刚才投影和残差的操作,直到残差为0,或者所有的自变量都用完了,才停止算法。

机器学习 Lasso回归算法「建议收藏」

    当XX只有2维时,例子如上图,和YY最接近的是X1X1,首先在X1X1上面投影,残差如上图长虚线。此时X1θ1X1θ1模拟了YY,θ1θ1模拟了θθ(仅仅模拟了一个维度)。接着发现最接近的是X2X2,此时用残差接着在X2X2投影,残差如图中短虚线。由于没有其他自变量了,此时X1θ1+X2θ2X1θ1+X2θ2模拟了YY,对应的模拟了两个维度的θθ即为最终结果,此处θθ计算设计较多矩阵运算,这里不讨论。

    此算法对每个变量只需要执行一次操作,效率高,速度快。但也容易看出,当自变量不是正交的时候,由于每次都是在做投影,所有算法只能给出一个局部近似解。因此,这个简单的算法太粗糙,还不能直接用于我们的Lasso回归。

 

5.2 前向梯度(Forward Stagewise)算法

    第二个预备算法是前向梯度(Forward Stagewise)算法。

    前向梯度算法和前向选择算法有类似的地方,也是在YY的XX变量XiXi(i =1,2,…n)中,选择和目标YY最为接近(余弦距离最大)的一个变量XkXk,用XkXk来逼近YY,但是前向梯度算法不是粗暴的用投影,而是每次在最为接近的自变量XtXt的方向移动一小步,然后再看残差YyesYyes和哪个XiXi(i =1,2,…n)最为接近。此时我们也不会把XtXt 去除,因为我们只是前进了一小步,有可能下面最接近的自变量还是XtXt。如此进行下去,直到残差YyesYyes减小到足够小,算法停止。

    机器学习 Lasso回归算法「建议收藏」

    当XX只有2维时,例子如上图,和YY最接近的是X1X1,首先在X1X1上面走一小段距离,此处εε为一个较小的常量,发现此时的残差还是和\X1X1最接近。那么接着沿X1X1走,一直走到发现残差不是和X1X1最接近,而是和X2X2最接近,此时残差如上图长虚线。接着沿着X2X2走一小步,发现残差此时又和X1X1最接近,那么开始沿着X1X1走,走完一步后发现残差为0,那么算法停止。此时YY由刚才所有的所有步相加而模拟,对应的算出的系数θθ即为最终结果。此处θθ计算设计较多矩阵运算,这里不讨论。

    当算法在εε很小的时候,可以很精确的给出最优解,当然,其计算的迭代次数也是大大的增加。和前向选择算法相比,前向梯度算法更加精确,但是更加复杂。

    有没有折中的办法可以综合前向梯度算法和前向选择算法的优点,做一个折中呢?有!这就是终于要出场的最小角回归法。

5.3  最小角回归(Least Angle Regression, LARS)算法

    好吧,最小角回归(Least Angle Regression, LARS)算法终于出场了。最小角回归法对前向梯度算法和前向选择算法做了折中,保留了前向梯度算法一定程度的精确性,同时简化了前向梯度算法一步步迭代的过程。具体算法是这样的: 

    首先,还是找到与因变量YY最接近或者相关度最高的自变量XkXk,使用类似于前向梯度算法中的残差计算方法,得到新的目标YyesYyes,此时不用和前向梯度算法一样小步小步的走。而是直接向前走直到出现一个XtXt,使得XtXt和YyesYyes的相关度和XkXk与YyesYyes的相关度是一样的,此时残差YyesYyes就在XtXt和XkXk的角平分线方向上,此时我们开始沿着这个残差角平分线走,直到出现第三个特征XpXp和YyesYyes的相关度足够大的时候,即XpXp到当前残差YyesYyes的相关度和θtθt,θkθk与YyesYyes的一样。将其也叫入到YY的逼近特征集合中,并用YY的逼近特征集合的共同角分线,作为新的逼近方向。以此循环,直到YyesYyes足够的小,或者说所有的变量都已经取完了,算法停止。此时对应的系数θθ即为最终结果。

 机器学习 Lasso回归算法「建议收藏」

    当θθ只有2维时,例子如上图,和YY最接近的是X1X1,首先在X1X1上面走一段距离,一直到残差在X1X1和X2X2的角平分线上,此时沿着角平分线走,直到残差最够小时停止,此时对应的系数ββ即为最终结果。此处θθ计算设计较多矩阵运算,这里不讨论。

    最小角回归法是一个适用于高维数据的回归算法,其主要的优点有:

    1)特别适合于特征维度n 远高于样本数m的情况。

    2)算法的最坏计算复杂度和最小二乘法类似,但是其计算速度几乎和前向选择算法一样

    3)可以产生分段线性结果的完整路径,这在模型的交叉验证中极为有用

    主要的缺点是:

    由于LARS的迭代方向是根据目标的残差而定,所以该算法对样本的噪声极为敏感。

6. 总结

    Lasso回归是在ridge回归的基础上发展起来的,如果模型的特征非常多,需要压缩,那么Lasso回归是很好的选择。一般的情况下,普通的线性回归模型就够了。

    另外,本文对最小角回归法怎么求具体的θθ参数值没有提及,仅仅涉及了原理,如果对具体的算计推导有兴趣,可以参考Bradley Efron的论文《Least Angle Regression》,网上很容易找到。  

 

转载:https://www.cnblogs.com/pinard/p/6018889.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144002.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware中安装系统提示没有可用的映像(No image available)

    VMware中安装系统提示没有可用的映像(No image available)今天新建了个虚机在装系统的时候提示“没有可用的映像”之所以会出现这种情况是因为在新建虚机的时候选择的设置不同导致的,此处不管选第一项还是第二项都会虚机设置中多了一个软盘的配置项,而这个选项默认的勾选就是导致上面没有可用镜像的真正元凶。网上一查这个问题很多都说是开始迅速按F2或者ESC进BIOS修改默认启动顺序,但即使你这么设置了但依旧是无济于事的,所以要解决这个问题…

    2022年6月25日
    29
  • socket编程与线程模型二

    socket编程与线程模型二

    2021年7月27日
    59
  • 音频可视化图形引擎—Specinker「建议收藏」

    音频可视化图形引擎—Specinker「建议收藏」bo主有话说:喜欢音乐的小伙伴相信都或多或少看到过一些频谱,简单的比如QQ音乐,酷狗等一些音乐软件上面都有一些,可惜的是这些频谱嵌入到软件界面上,好看的就那么一两个,并不能满足一些人对音乐的渴望,至少对我来说,是这样的。当然,还可以使用雨滴,AE来制作非常炫酷的频谱,但是这两个软件却也有一些弊端。通过雨滴,我们可以制作一些悬挂在桌面的频谱,但是制作这样的频谱,需要使用雨滴的编程语法进行开发,这…

    2022年10月12日
    1
  • 什么是udp攻击?udp攻击的基本原理是什么

    什么是udp攻击?udp攻击的基本原理是什么UDPFlood关联TCP类服务防范UDP是无连接的协议,因此无法通过源认证的方法防御UDPFlood攻击。如果UDP业务流量需要通过TCP业务流量认证或控制,则当UDP业务受到攻击时,对关联的TCP业务强制启动防御,用此TCP防御产生的白名单决定同一源的UDP报文是丢弃还是转发。  比如,有些服务例如游戏类服务,是先通过TCP协议对用户进行认证,认证通过后使用UDP协议传输…

    2022年10月2日
    2
  • altium 原理图reset unique id

    altium 原理图reset unique id当画模块原理图时 电路相同的模块可以单独建一个文件 然后复制粘贴 得到多个相同的原理图图纸然而 sheet 文件复制粘贴会出现 ID 相同的情况 UNIQUEID 在原理图和 pcb 里面相当于元器件的唯一身份许可 不可相同 有的时候我们操作不当造成 ID 相同怎么办呢 nbsp 在原理图界面 TOOL Convert Reset nbsp Componentuni AD17 即可选择对应的图纸或工程或打开的文

    2025年10月11日
    4
  • 【C/C++】C语言特性总结

    【C/C++】C语言特性总结已经有大约半年的时间没有碰C语言了,当时学习的时候记录了很多的笔记,但是都是特别混乱,后悔那个时候,不懂得写博客,这里凭借记忆和零零散散的笔记记录,尝试系统性地复习一下C语言。之前都是在Windows环境下学习,这次把重心放在Linux环境下,这次的复习源于基础,但是要高于基础。文章目录工具gcc编译器VS2019C语言编译过程C语言代码主体必要内容C语言数据类型关键字常量变量进制表示s…

    2022年6月21日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号