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

Posted 程序猿-小秦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)iargminθiJ(θ(k)1,θ(k)2,...θ(k)i1,θi,θ(k1)i+1,...,θ(k1)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)i1,θi,θ(k1)i+1,...,θ(k1)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)1argmin线性回归

手写算法-python代码实现Lasso回归

最小角回归详解

最小角回归 LARS算法包的用法以及模型参数的选择

线性回归 scikit-learn LinearRegression最小二乘法梯度下降SDG多项式回归学习曲线岭回归Lasso回归

Lasso的三种解读视角