机器学习算法系列(五)- Lasso回归算法(Lasso Regression Algorithm)

article/2025/9/28 22:22:18

阅读本文需要的背景知识点:线性回归算法、一丢丢编程知识

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

一、引言

  上一节我们学习了解决多重共线性的一种方法是对代价函数正则化,其中一种正则化的算法叫岭回归算法(Ridge Regression Algorithm)。下面我们来学习另一种正则化的算法 - Lasso回归算法1(Lasso Regression Algorithm),LASSO的完整名称叫最小绝对值收敛和选择算子算法(least absolute shrinkage and selection operator)。

二、模型介绍

  先来回顾一下岭回归的代价函数,在原来标准线性回归代价函数上加上了一个带惩罚系数 λ 的 w 向量的 L2-范数的平方:
Cost ⁡ ( w ) = ∑ i = 1 N ( y i − w T x i ) 2 + λ ∥ w ∥ 2 2 \operatorname{Cost}(w) = \sum_{i = 1}^N \left( y_i - w^Tx_i \right)^2 + \lambda\|w\|_{2}^{2} Cost(w)=i=1N(yiwTxi)2+λw22

  Lasso回归算法也同岭回归一样加上了正则项,只是改成加上了一个带惩罚系数 λ 的 w 向量的 L1-范数作为惩罚项(L1-范数的含义为向量 w 每个元素绝对值的和),所以这种正则化方式也被称为L1正则化。
Cost ⁡ ( w ) = ∑ i = 1 N ( y i − w T x i ) 2 + λ ∥ w ∥ 1 \operatorname{Cost}(w) = \sum_{i = 1}^N \left( y_i - w^Tx_i \right)^2 + \lambda\|w\|_1 Cost(w)=i=1N(yiwTxi)2+λw1

  同样是求使得代价函数最小时 w 的大小:
w = argmin ⁡ w ( ∑ i = 1 N ( y i − w T x i ) 2 + λ ∥ w ∥ 1 ) w = \underset{w}{\operatorname{argmin}}\left(\sum_{i = 1}^N \left( y_i - w^Tx_i \right)^2 + \lambda\|w\|_1\right) w=wargmin(i=1N(yiwTxi)2+λw1)

  由于加入的是向量的 L1-范数,其中存在绝对值,导致其代价函数不是处处可导的,所以就没办法通过直接求导的方式来直接得到 w 的解析解。下面介绍两种求解权重系数 w 的方法:坐标下降法2(coordinate descent)、最小角回归法3(Least Angle Regression,LARS)

三、算法步骤

坐标下降法:
  坐标下降法的核心与它的名称一样,就是沿着某一个坐标轴方向,通过一次一次的迭代更新权重系数的值,来渐渐逼近最优解。

  具体步骤:
(1)初始化权重系数 w,例如初始化为零向量。
(2)遍历所有权重系数,依次将其中一个权重系数当作变量,其他权重系数固定为上一次计算的结果当作常量,求出当前条件下只有一个权重系数变量的情况下的最优解。
  在第 k 次迭代时,更新权重系数的方法如下:
w m k 表示第 k 次迭代,第 m 个权重系数 w 1 k = argmin ⁡ w 1 ( Cost ⁡ ( w 1 , w 2 k − 1 , … , w m − 1 k − 1 , w m k − 1 ) ) w 2 k = argmin ⁡ w 2 ( Cost ⁡ ( w 1 k , w 2 , … , w m − 1 k − 1 , w m k − 1 ) ) ⋮ w m k = argmin ⁡ w m ( Cost ⁡ ( w 1 k , w 2 k , … , w m − 1 k , w m ) ) \begin{matrix} w_m^k 表示第k次迭代,第m个权重系数 \\ w_1^k = \underset{w_1}{\operatorname{argmin}} \left( \operatorname{Cost}(w_1, w_2^{k-1}, \dots, w_{m-1}^{k-1}, w_m^{k-1}) \right) \\ w_2^k = \underset{w_2}{\operatorname{argmin}} \left( \operatorname{Cost}(w_1^{k}, w_2, \dots, w_{m-1}^{k-1}, w_m^{k-1}) \right) \\ \vdots \\ w_m^k = \underset{w_m}{\operatorname{argmin}} \left( \operatorname{Cost}(w_1^{k}, w_2^{k}, \dots, w_{m-1}^{k}, w_m) \right) \\ \end{matrix} wmk表示第k次迭代,第m个权重系数w1k=w1argmin(Cost(w1,w2k1,,wm1k1,wmk1))w2k=w2argmin(Cost(w1k,w2,,wm1k1,wmk1))wmk=wmargmin(Cost(w1k,w2k,,wm1k,wm))

(3)步骤(2)为一次完整迭代,当所有权重系数的变化不大或者到达最大迭代次数时,结束迭代。

1.png

By Nicoguaro - Own work

  如上图所示,每次迭代固定其他的权重系数,只朝着其中一个坐标轴的方向更新,最后到达最优解。

最小角回归法:
  最小角回归法是一种特征选择的方法,计算出每个特征的相关性,通过数学公式逐渐计算出最优解。

  具体步骤:
(1)初始化权重系数 w,例如初始化为零向量。
(2)初始化残差向量 residual 为目标标签向量 y − X w y - Xw yXw,由于此时 w 为零向量,所以残差向量等于目标标签向量 y
(3)选择一个与残差向量相关性最大的特征向量 x i x_i xi,沿着特征向量 x i x_i xi 的方向找到一组权重系数 w,出现另一个与残差向量相关性最大的特征向量 x j x_j xj 使得新的残差向量 residual 与这两个特征向量的相关性相等(即残差向量等于这两个特征向量的角平分向量上),重新计算残差向量。
(4)重复步骤(3),继续找到一组权重系数 w,使得第三个与残差向量相关性最大的特征向量 x k x_k xk 使得新的残差向量 residual 与这三个特征向量的相关性相等(即残差向量等于这三个特征向量的等角向量上),以此类推。
(5)当残差向量 residual 足够小或者所有特征向量都已被选择,结束迭代。

2.png

Least Angle Regression - Figure 2

  上图演示了只有两个特征向量时的情况,初始残差向量为 y 2 y_2 y2,其中 x 1 x_1 x1 向量与残差向量的相关性最大(向量夹角最小),找到一个 θ 11 θ_{11} θ11 使得新的残差向量 y 2 − x 1 ∗ θ 11 y_2 - x_1 * θ_{11} y2x1θ11 x 1 x_1 x1 x 2 x_2 x2 的角平分线(图中为 u 2 u_2 u2),此时 w 1 = θ 11 w_1 = θ_{11} w1=θ11, w 2 = 0 w_2 = 0 w2=0。最后找到一组 θ 21 θ_{21} θ21 θ 22 θ_{22} θ22 使得新的残差向量 y 2 − x 1 ∗ θ 11 − ( x 1 ∗ θ 21 + x 2 ∗ θ 22 ) y_2 - x_1 * θ_{11} - (x_1 * θ_{21} + x_2 * θ_{22}) y2x1θ11(x1θ21+x2θ22) 尽可能小, 此时 w 1 = θ 11 + θ 21 w_1 = θ_{11} + θ_{21} w1=θ11+θ21 w 2 = θ 22 w_2 = θ_{22} w2=θ22。所有特征向量都已被选择,所以结束迭代。

  坐标下降法相对最小角回归法相对好理解一些,每次只需要关心一个权重系数即可。最小角回归法则是通过一些巧妙的数学公式减少了迭代次数,使其的最坏计算复杂度和最小二乘法类似。

四、原理证明

Lasso回归代价函数为凸函数

  同样需要证明:
f ( x 1 + x 2 2 ) ≤ f ( x 1 ) + f ( x 2 ) 2 f\left(\frac{x_{1}+x_{2}}{2}\right) \leq \frac{f\left(x_{1}\right)+f\left(x_{2}\right)}{2} f(2x1+x2)2f(x1)+f(x2)

  不等式左边:
Cost ⁡ ( w 1 + w 2 2 ) = ∑ i = 1 N [ ( w 1 + w 2 2 ) T x i − y i ] 2 + λ ∥ w 1 + w 2 2 ∥ 1 \operatorname{Cost}\left(\frac{w_{1}+w_{2}}{2}\right)=\sum_{i=1}^{N}\left[\left(\frac{w_{1}+w_{2}}{2}\right)^{T} x_{i}-y_{i}\right]^{2}+\lambda\left\|\frac{w_{1}+w_{2}}{2}\right\|_{1} Cost(2w1+w2)=i=1N[(2w1+w2)Txiyi]2+λ 2w1+w2 1

  不等式右边:
Cost ⁡ ( w 1 ) + Cost ⁡ ( w 2 ) 2 = ∑ i = 1 N ( w 1 T x i − y i ) 2 + ∑ i = 1 N ( w 2 T x i − y i ) 2 + λ ∥ w 1 ∥ 1 + λ ∥ w 2 ∥ 1 2 \frac{\operatorname{Cost}\left(w_{1}\right)+\operatorname{Cost}\left(w_{2}\right)}{2}=\frac{\sum_{i=1}^{N}\left(w_{1}^{T} x_{i}-y_{i}\right)^{2}+\sum_{i=1}^{N}\left(w_{2}^{T} x_{i}-y_{i}\right)^{2}+\lambda\left\|w_{1}\right\|_{1}+\lambda\left\|w_{2}\right\|_{1}}{2} 2Cost(w1)+Cost(w2)=2i=1N(w1Txiyi)2+i=1N(w2Txiyi)2+λw11+λw21

(1)不等式两边的前半部分与标准线性回归一致,只需要证明剩下的差值大于等于零即可
(2)根据向量范数的正齐次性,常数项系数可以乘进去
(3)将 λ 提到括号外
(4)根据向量范数的定义,满足三角不等式,必然是大于等于零
Δ = λ ∥ w 1 ∥ 1 + λ ∥ w 2 ∥ 1 − 2 λ ∥ w 1 + w 2 2 ∥ 1 ( 1 ) = λ ∥ w 1 ∥ 1 + λ ∥ w 2 ∥ 1 − λ ∥ w 1 + w 2 ∥ 1 ( 2 ) = λ ( ∥ w 1 ∥ 1 + ∥ w 2 ∥ 1 − ∥ w 1 + w 2 ∥ 1 ) ( 3 ) ≥ 0 ( 4 ) \begin{aligned} \Delta &=\lambda\left\|w_{1}\right\|_{1}+\lambda\left\|w_{2}\right\|_{1}-2 \lambda\left\|\frac{w_{1}+w_{2}}{2}\right\|_{1} & (1) \\ &=\lambda\left\|w_{1}\right\|_{1}+\lambda\left\|w_{2}\right\|_{1}-\lambda\left\|w_{1}+w_{2}\right\|_{1} & (2) \\ &=\lambda\left(\left\|w_{1}\right\|_{1}+\left\|w_{2}\right\|_{1}-\left\|w_{1}+w_{2}\right\|_{1}\right) & (3) \\ & \geq 0 & (4) \end{aligned} Δ=λw11+λw212λ 2w1+w2 1=λw11+λw21λw1+w21=λ(w11+w21w1+w21)0(1)(2)(3)(4)

人为的控制 λ 的大小,最后的结果在实数范围内必然大于等于零,证毕。

最小回归法数学公式

  求单位角平分向量:

(1)设单位角平分向量为 u A u_A uA,可以将其看成选中的特征向量的线性组合,下标 A 表示选中的特征的序号集合
(2)由于每个选中的特征向量与角平分向量的夹角都相同,所以特征向量与角平分向量的点积后的向量每一个元素必然相同, 1 A 1_A 1A 为元素都为 1 的向量,z 为常数
(3)根据(2)式可以表示出线性组合的系数向量 ω A ω_A ωA
u A = X A ω A ( 1 ) X A T u A = X A T X A ω A = z 1 A ( 2 ) ω A = z ( X A T X A ) − 1 1 A ( 3 ) \begin{aligned} & u_\mathcal{A} = X_\mathcal{A} \omega_\mathcal{A} & (1)\\ & X_\mathcal{A}^Tu_\mathcal{A} = X_\mathcal{A}^TX_\mathcal{A} \omega_\mathcal{A} = z 1_\mathcal{A} & (2)\\ & \omega_\mathcal{A} = z(X_\mathcal{A}^TX_\mathcal{A})^{-1} 1_\mathcal{A} & (3) \end{aligned} uA=XAωAXATuA=XATXAωA=z1AωA=z(XATXA)11A(1)(2)(3)

(1)角平分向量 u A u_A uA 为单位向量,所以长度为 1
(2)改写成向量的形式
(3)带入上一步的线性组合的系数向量 ω A ω_A ωA
(4)根据转置的性质第一项的括号可以化简,提出常数 z
(5)矩阵乘以其逆矩阵为单位矩阵,所以可以化简
(6)最后解得常数 z 的表达式
∥ u A ∥ 2 = 1 ( 1 ) ω A T X A T X A ω A = 1 ( 2 ) ( z ( X A T X A ) − 1 1 A ) T X A T X A z ( X A T X A ) − 1 1 A = 1 ( 3 ) z 2 1 A T ( X A T X A ) − 1 ( X A T X A ) ( X A T X A ) − 1 1 A = 1 ( 4 ) z 2 1 A T ( X A T X A ) − 1 1 A = 1 ( 5 ) z = 1 1 A T ( X A T X A ) − 1 1 A = ( 1 A T ( X A T X A ) − 1 1 A ) − 1 2 ( 6 ) \begin{aligned} & \left\|u_{\mathcal{A}}\right\|^{2}=1 & (1)\\ & \omega_{\mathcal{A}}^{T} X_{\mathcal{A}}^{T} X_{\mathcal{A}} \omega_{\mathcal{A}}=1 & (2) \\ & \left(z\left(X_{\mathcal{A}}^{T} X_{\mathcal{A}}\right)^{-1} 1_{\mathcal{A}}\right)^{T} X_{\mathcal{A}}^{T} X_{\mathcal{A}} z\left(X_{\mathcal{A}}^{T} X_{\mathcal{A}}\right)^{-1} 1_{\mathcal{A}}=1 & (3) \\ & z^{2} 1_{\mathcal{A}}^{T}\left(X_{\mathcal{A}}^{T} X_{\mathcal{A}}\right)^{-1}\left(X_{\mathcal{A}}^{T} X_{\mathcal{A}}\right)\left(X_{\mathcal{A}}^{T} X_{\mathcal{A}}\right)^{-1} 1_{\mathcal{A}}=1 & (4) \\ & z^21_\mathcal{A}^T\left(X_\mathcal{A}^TX_\mathcal{A}\right)^{-1}1_\mathcal{A} = 1 & (5) \\ & z= \frac{1}{\sqrt[]{1_\mathcal{A}^T\left(X_\mathcal{A}^TX_\mathcal{A}\right)^{-1}1_\mathcal{A}}} = \left(1_\mathcal{A}^T\left(X_\mathcal{A}^TX_\mathcal{A}\right)^{-1}1_\mathcal{A}\right)^{-\frac{1}{2} } & (6) \\ \end{aligned} uA2=1ωATXATXAωA=1(z(XATXA)11A)TXATXAz(XATXA)11A=1z21AT(XATXA)1(XATXA)(XATXA)11A=1z21AT(XATXA)11A=1z=1AT(XATXA)11A 1=(1AT(XATXA)11A)21(1)(2)(3)(4)(5)(6)

(1)将特征向量的转置乘以特征向量用 G A G_A GA 表示
(2)带入 G A G_A GA,得到 z 的表达式
(3)带入 G A G_A GA ,得到 ω A ω_A ωA 的表达式
G A = X A T X A ( 1 ) z = ( 1 A T ( G A ) − 1 1 A ) − 1 2 ( 2 ) ω A = z ( G A ) − 1 1 A ( 3 ) \begin{aligned}{} & G_{\mathcal{A}}=X_{\mathcal{A}}^{T} X_{\mathcal{A}} & (1)\\ & z=\left(1_{\mathcal{A}}^{T}\left(G_{\mathcal{A}}\right)^{-1} 1_{\mathcal{A}}\right)^{-\frac{1}{2}} & (2)\\ & \omega_{\mathcal{A}}=z\left(G_{\mathcal{A}}\right)^{-1} 1_{\mathcal{A}} & (3) \end{aligned} GA=XATXAz=(1AT(GA)11A)21ωA=z(GA)11A(1)(2)(3)

  将 X A X_A XA 乘以 ω A ω_A ωA ,就得到了角平分向量 u A u_A uA 的表达式,这样就可以求出单位角平分向量。更加详细的证明请参考 Bradley Efron 的论文4

  求角平分向量的长度:

(1) μ A μ_A μA 表示当前预测值,沿着角平分向量的方向更新一个 γ 长度
(2)C 表示特征向量与残差向量的相关性,为两个向量的点积,带入(1)式,得到相关性的更新表达式
(3)当特征向量为被选中的特征向量时,由于每个特征向量与角平分向量的乘积都相同,都等于 z
(4)计算每个特征向量与角平分向量的乘积
(5)当特征向量不是被选中的特征向量时,使用 a 来带入(2)式
(6)要想加入下一个特征向量,则(3)式与(5)式的绝对值必然相等,才能保证下一次更新后的相关性也是相同的
(7)解得 γ 的表达式
μ A + = μ A + γ u A ( 1 ) C + = X T ( y − μ A + ) = X T ( y − μ A − γ u A ) = C − γ X T u A ( 2 ) C + = C − γ z ( j ∈ A ) ( 3 ) a = X T u A ( 4 ) C + = C j − γ a j ( j ∉ A ) ( 5 ) ∣ C − γ z ∣ = ∣ C − γ a j ∣ ( 6 ) γ = min ⁡ j ∉ A + { C − C j z − a j , C + C j z + a j } ( 7 ) \begin{aligned} &\mu_{A^{+}}=\mu_{A}+\gamma u_{A} & (1)\\ &C_{+}=X^{T}\left(y-\mu_{A^{+}}\right)=X^{T}\left(y-\mu_{A}-\gamma u_{A}\right)=C-\gamma X^{T} u_{A} & (2)\\ &C_{+}=C-\gamma z \quad(j \in A) & (3)\\ &a=X^{T} u_{A} & (4)\\ &C_{+}=C_{j}-\gamma a_{j} \quad(j \notin A) & (5)\\ &|C-\gamma z|=\left|C-\gamma a_{j}\right| & (6)\\ &\gamma=\min _{j \notin A}^{+}\left\{\frac{C-C_{j}}{z-a_{j}}, \frac{C+C_{j}}{z+a_{j}}\right\} & (7) \end{aligned} μA+=μA+γuAC+=XT(yμA+)=XT(yμAγuA)=CγXTuAC+=Cγz(jA)a=XTuAC+=Cjγaj(j/A)Cγz=Cγajγ=j/Amin+{zajCCj,z+ajC+Cj}(1)(2)(3)(4)(5)(6)(7)

  这样就求出了 γ 的表达式,也就是角平分向量的长度。更加详细的证明请参考 Bradley Efron 的论文4

五、代码实现

使用 Python 实现Lasso回归算法(坐标下降法):
注:本实现未考虑偏移量 b ,需要对特征进行归一化处理

def lassoUseCd(X, y, lambdas=0.1, max_iter=1000, tol=1e-4):"""Lasso回归,使用坐标下降法(coordinate descent)args:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数max_iter - 最大迭代次数tol - 变化量容忍值return:w - 权重系数"""# 初始化 w 为零向量w = np.zeros(X.shape[1])for it in range(max_iter):done = True# 遍历所有自变量for i in range(0, len(w)):# 记录上一轮系数weight = w[i]# 求出当前条件下的最佳系数w[i] = down(X, y, w, i, lambdas)# 当其中一个系数变化量未到达其容忍值,继续循环if (np.abs(weight - w[i]) > tol):done = False# 所有系数都变化不大时,结束循环if (done):breakreturn wdef down(X, y, w, index, lambdas=0.1):"""cost(w) = (x1 * w1 + x2 * w2 + ... - y)^2 + ... + λ(|w1| + |w2| + ...)假设 w1 是变量,这时其他的值均为常数,带入上式后,其代价函数是关于 w1 的一元二次函数,可以写成下式:cost(w1) = (a * w1 + b)^2 + ... + λ|w1| + c (a,b,c,λ 均为常数)=> 展开后cost(w1) = aa * w1^2 + 2ab * w1 + λ|w1| + c (aa,ab,c,λ 均为常数)"""# 展开后的二次项的系数之和aa = 0# 展开后的一次项的系数之和ab = 0for i in range(X.shape[0]):# 括号内一次项的系数a = X[i][index]# 括号内常数项的系数b = X[i][:].dot(w) - a * w[index] - y[i]# 可以很容易的得到展开后的二次项的系数为括号内一次项的系数平方的和aa = aa + a * a# 可以很容易的得到展开后的一次项的系数为括号内一次项的系数乘以括号内常数项的和ab = ab + a * b# 由于是一元二次函数,当导数为零时,函数值最小值,只需要关注二次项系数、一次项系数和 λreturn det(aa, ab, lambdas)def det(aa, ab, lambdas=0.1):"""通过代价函数的导数求 w,当 w = 0 时,不可导det(w) = 2aa * w + 2ab + λ = 0 (w > 0)=> w = - (2 * ab + λ) / (2 * aa)det(w) = 2aa * w + 2ab - λ = 0 (w < 0)=> w = - (2 * ab - λ) / (2 * aa)det(w) = NaN (w = 0)=> w = 0"""w = - (2 * ab + lambdas) / (2 * aa)if w < 0:w = - (2 * ab - lambdas) / (2 * aa)if w > 0:w = 0return w

使用 Python 实现Lasso回归算法(最小角回归法):

def lassoUseLars(X, y, lambdas=0.1, max_iter=1000):"""Lasso回归,使用最小角回归法(Least Angle Regression)论文:https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdfargs:X - 训练数据集y - 目标标签值lambdas - 惩罚项系数max_iter - 最大迭代次数return:w - 权重系数"""n, m = X.shape# 已被选择的特征下标active_set = set()# 当前预测向量cur_pred = np.zeros((n,), dtype=np.float32)# 残差向量residual = y - cur_pred# 特征向量与残差向量的点积,即相关性cur_corr = X.T.dot(residual)# 选取相关性最大的下标j = np.argmax(np.abs(cur_corr), 0)# 将下标添加至已被选择的特征下标集合active_set.add(j)# 初始化权重系数w = np.zeros((m,), dtype=np.float32)# 记录上一次的权重系数prev_w = np.zeros((m,), dtype=np.float32)# 记录特征更新方向sign = np.zeros((m,), dtype=np.int32)sign[j] = 1# 平均相关性lambda_hat = None# 记录上一次平均相关性prev_lambda_hat = Nonefor it in range(max_iter):# 计算残差向量residual = y - cur_pred# 特征向量与残差向量的点积cur_corr = X.T.dot(residual)# 当前相关性最大值largest_abs_correlation = np.abs(cur_corr).max()# 计算当前平均相关性lambda_hat = largest_abs_correlation / n# 当平均相关性小于λ时,提前结束迭代# https://github.com/scikit-learn/scikit-learn/blob/2beed55847ee70d363bdbfe14ee4401438fba057/sklearn/linear_model/_least_angle.py#L542if lambda_hat <= lambdas:if (it > 0 and lambda_hat != lambdas):ss = ((prev_lambda_hat - lambdas) / (prev_lambda_hat - lambda_hat))# 重新计算权重系数w[:] = prev_w + ss * (w - prev_w)break# 更新上一次平均相关性prev_lambda_hat = lambda_hat# 当全部特征都被选择,结束迭代if len(active_set) > m:break# 选中的特征向量X_a = X[:, list(active_set)]# 论文中 X_a 的计算公式 - (2.4)X_a *= sign[list(active_set)]# 论文中 G_a 的计算公式 - (2.5)G_a = X_a.T.dot(X_a)G_a_inv = np.linalg.inv(G_a)G_a_inv_red_cols = np.sum(G_a_inv, 1)     # 论文中 A_a 的计算公式 - (2.5)A_a = 1 / np.sqrt(np.sum(G_a_inv_red_cols))# 论文中 ω 的计算公式 - (2.6)omega = A_a * G_a_inv_red_cols# 论文中角平分向量的计算公式 - (2.6)equiangular = X_a.dot(omega)# 论文中 a 的计算公式 - (2.11)cos_angle = X.T.dot(equiangular)# 论文中的 γgamma = None# 下一个选择的特征下标next_j = None# 下一个特征的方向next_sign = 0for j in range(m):if j in active_set:continue# 论文中 γ 的计算方法 - (2.13)v0 = (largest_abs_correlation - cur_corr[j]) / (A_a - cos_angle[j]).item()v1 = (largest_abs_correlation + cur_corr[j]) / (A_a + cos_angle[j]).item()if v0 > 0 and (gamma is None or v0 < gamma):gamma = v0next_j = jnext_sign = 1if v1 > 0 and (gamma is None or v1 < gamma):gamma = v1next_j = jnext_sign = -1if gamma is None:# 论文中 γ 的计算方法 - (2.21)gamma = largest_abs_correlation / A_a# 选中的特征向量sa = X_a# 角平分向量sb = equiangular * gamma# 解线性方程(sa * sx = sb)sx = np.linalg.lstsq(sa, sb)# 记录上一次的权重系数prev_w = w.copy()d_hat = np.zeros((m,), dtype=np.int32)for i, j in enumerate(active_set):# 更新当前的权重系数w[j] += sx[0][i] * sign[j]# 论文中 d_hat 的计算方法 - (3.3)d_hat[j] = omega[i] * sign[j]# 论文中 γ_j 的计算方法 - (3.4)gamma_hat = -w / d_hat# 论文中 γ_hat 的计算方法 - (3.5)gamma_hat_min = float("+inf")# 论文中 γ_hat 的下标gamma_hat_min_idx = Nonefor i, j in enumerate(gamma_hat):if j <= 0:continueif gamma_hat_min > j:gamma_hat_min = jgamma_hat_min_idx = iif gamma_hat_min < gamma:# 更新当前预测向量 - (3.6)cur_pred = cur_pred + gamma_hat_min * equiangular# 将下标移除至已被选择的特征下标集合active_set.remove(gamma_hat_min_idx)# 更新特征更新方向集合sign[gamma_hat_min_idx] = 0else:# 更新当前预测向量cur_pred = X.dot(w)# 将下标添加至已被选择的特征下标集合active_set.add(next_j)# 更新特征更新方向集合sign[next_j] = next_signreturn w

六、第三方库实现

scikit-learn6 实现(坐标下降法):

from sklearn.linear_model import Lasso# 初始化Lasso回归器,默认使用坐标下降法
reg = Lasso(alpha=0.1, fit_intercept=False)
# 拟合线性模型
reg.fit(X, y)
# 权重系数
w = reg.coef_

scikit-learn7 实现(最小角回归法):

from sklearn.linear_model import LassoLars# 初始化Lasso回归器,使用最小角回归法
reg = LassoLars(alpha=0.1, fit_intercept=False)
# 拟合线性模型
reg.fit(X, y)
# 权重系数
w = reg.coef_

七、示例演示

  下面动图展示了前面一节的工作年限与平均月工资的例子,每次只朝这坐标轴的一个方向改变权重系数,逐渐逼近最优解的过程。

10.gif

坐标下降法

  下面动图展示了 λ 对各个自变量权重系数的影响,横轴为惩罚系数 λ ,纵轴为权重系数,每一个颜色表示一个自变量的权重系数(训练数据来源于sklearn diabetes datasets):

11.gif

λ 对权重系数的影响

12.png

  可以看到当 λ 逐渐增大时( λ 向左移动),某些特征的权重系数会快速变成零,通过这个性质说明Lasso 回归可以用来做特征选择,控制 λ 的大小来选择出关键特征。

八、思维导图

13.png

九、参考文献

  1. https://en.wikipedia.org/wiki/Lasso_(statistics)
  2. https://en.wikipedia.org/wiki/Coordinate_descent
  3. https://en.wikipedia.org/wiki/Least-angle_regression
  4. https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf
  5. https://zhuanlan.zhihu.com/p/46999826
  6. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html
  7. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LassoLars.html

完整演示请点击这里

最近笔者做了一个基于人工智能实现音乐转谱和人声分离功能的在线应用——反谱(Serocs),感兴趣的读者欢迎试用与分享,感谢您的支持!serocs.cn

注:本文力求准确并通俗易懂,但由于笔者也是初学者,水平有限,如文中存在错误或遗漏之处,恳请读者通过留言的方式批评指正

本文首发于——AI导图,欢迎关注


http://chatgpt.dhexx.cn/article/CCl8O1oj.shtml

相关文章

学习机器学习和深度学习的方法和步骤

学习机器学习和深度学习的方法和步骤 相信很多人都在找学习机器学习和深度学习的步骤和教程。作为过来人和大家一起交流一下。 我自己制作的一个思维导图希望对大家有帮助。

机器学习算法介绍

前言 谷歌董事长施密特曾说过&#xff1a;虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注&#xff0c;但是这家公司真正的未来在于机器学习&#xff0c;一种让计算机更聪明、更个性化的技术。 也许我们生活在人类历史上最关键的时期&#xff1a;从使用大型计算机&#xf…

机器学习之【提升方法】

机器学习【提升方法】 一、Adaboost的起源1.强可学习与弱可学习 二、怎样实现弱学习转为强学习1.怎样获得不同的弱分类器?BaggingBagging的弊端 2.怎样组合弱分类器? 三、Adaboost的提出四、Adaboost的基本概念五、Adaboost算法六、示例七、Boosting illustration 一、Adaboo…

(四)机器学习方法的分类

文章目录 一、监督学习二、非监督学习三、半监督学习四、增强学习五、机器学习的其他分类1. 批量学习&#xff08;Batch Learning&#xff09;2. 在线学习&#xff08;Online Learning&#xff09;3. 参数学习&#xff08;Parametric Learning&#xff09;4. 非参数学习 在上一…

【机器学习】之机器学习方法的分类

1&#xff0c;监督学习 给机器的训练数据拥有标记和答案 例如&#xff1a; 图像已经积累了标定信息银行已经积累了客户的信息和信用卡的信息 2&#xff0c;非监督学习 给机器的训练数据没有标记或答案 对没有标记的数据进行分类 – 聚类分析 对数据进行降维处理 特征提取…

机器学习常用方法

在本篇文章中&#xff0c;我将对机器学习做个概要的介绍。本文的目的是能让即便完全不了解机器学习的人也能了解机器学习&#xff0c;并且上手相关的实践。这篇文档也算是EasyPR开发的番外篇&#xff0c;从这里开始&#xff0c;必须对机器学习了解才能进一步介绍EasyPR的内核。…

机器学习的几种学习方式

根据数据类型的不同&#xff0c;对一个问题的建模有不同的方式&#xff0c;人们首先会考虑算法的学习方式。将算法按照学习方式分类可以让人们在建模和算法选择时&#xff0c;根据输入数据来选择最合适的算法&#xff0c;从而获得最好的结果。 在机器学习领域&#xff0c;有以…

机器学习--机器学习的基本方法

文章目录 1.1统计分析1.1.1 统计基础1.1.2 常见的概率分布2.1.3参数估计1.1.4 假设与检验1.1.5线性回归1.1.6逻辑回归1.1.7判别分析1.1.8 非线性判决 1.1统计分析 统计学是研究如何收集资料&#xff0c;整理资料和进行量化分析&#xff0c;判断的一门学科。在科学计算&#xf…

机器学习的四种学习方法

文章目录 监督学习&#xff08;Supervised Learning&#xff09;无监督学习&#xff08;Unsupervised Learning&#xff09;半监督学习&#xff08;Semi-supervised Learning)强化学习&#xff08;Reinforcement Learning)应用 监督学习&#xff08;Supervised Learning&#x…

机器学习方法的基本分类

目录 1、监督学习&#xff08;supervised learning&#xff09; 2、无监督学习&#xff08;unsupervised learning&#xff09; 3、强化学习&#xff08;reinforcement learning&#xff09; 4、半监督学习&#xff08;semi-supervised learning&#xff09;与主动学习&…

机器学习的常用方法

转自 史上最强----机器学习经典总结---入门必读----心血总结-----回味无穷 在这个部分我会简要介绍一下机器学习中的经典代表方法。这部分介绍的重点是这些方法内涵的思想&#xff0c;数学与实践细节不会在这讨论。 1、回归算法 在大部分机器学习课程中&#xff0c;回归算法都…

机器学习的三种方法

目录 介绍 鸢尾花(Iris)数据集 梯度下降 逻辑回归 使用逻辑回归处理鸢尾花(Iris)数据集 反向传播 使用反向传播处理鸢尾花(Iris)数据集 支持向量机 用支持向量机处理鸢尾花(Iris)数据集 结论 下载Iris_Data-3.7 KB下载LogiticRegression_Iris-309.7 KB下载LogiticReg…

机器学习的方法

机器学习(machine learning)是一门多领域交叉学科,涉及了概率论、统计学、算法复杂度等多门学科。专门研究计算机怎样模拟或实现人的学习行为,它能够发现和挖掘数据所包含的潜在价值。机器学习已经成为了人工智能的一个分支,通过自学习算法,发现和挖掘数据潜在的规律,从…

机器学习中常见4种学习方法、13种算法

机器学习中常见4种学习方法、13种算法 一. 4大主要学习方法 1.1 监督式学习 在监督式学习下&#xff0c;输入数据被称为“训练数据”&#xff0c;每组训练数据有一个明确的标识或结果&#xff0c;如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”&#xff0c;对手写数字识别中…

机器学习的13种算法和4种学习方法,推荐给大家

机器学习的算法很多。很多时候困惑人们都是&#xff0c;很多算法是一类算法&#xff0c;而有些算法又是从其他算法中延伸出来的。这里&#xff0c;我们从两个方面来给大家介绍&#xff0c;第一个方面是学习的方式&#xff0c;第二个方面是算法的分类。 一、4大主要学习方式 1…

好用的浏览器主页有哪些?

浏览器主页由于有个网址就能用&#xff0c;越来越受到年轻人的喜爱&#xff0c;而且浏览器主页非常的方便&#xff0c;我为什么说方便呢&#xff1f;举个例子哈&#xff0c;当我们在外边用电脑时&#xff0c;发现电脑自带的浏览器完全不符合自己的使用习惯&#xff0c;没有自己…

看完这6款浏览器的对比,你还使用国产浏览器吗

市面上的国产浏览器实在是太多了&#xff0c;曾几时&#xff0c;我也曾因为选择使用哪款浏览器而纠结过。是用搜狗浏览器好&#xff0c;还是360极速浏览器好&#xff0c;或者是多御浏览器&#xff1f;直到我学习了计算机&#xff0c;慢慢地开始使用国外浏览器&#xff0c;偶尔也…

目前主流浏览器市场及浏览器内核介绍

主流浏览器 以下的数据来源于国际知名的统计网站statcounter&#xff0c;数据的统计时间为2021年08月 – 2022年08月 主流电脑浏览器 全球 国内 主流手机浏览器 全球 国内 由此数据可看到&#xff0c;谷歌浏览器的市场份额占比遥遥领先 浏览器内核 1. Trident IE的内…

五大主流浏览器和四大浏览器内核

1.浏览器 任何上过网的用户对浏览器是再熟悉不过了&#xff0c;只是用户看到仅仅只是浏览器本身&#xff0c;却很少能看到浏览器最核心的部分—浏览器内核。从第一款libwww&#xff08;Library WorldWideWeb&#xff09;浏览器发展至今已经经历了无数竞争与淘汰了。现在国内常…

推荐几款我常用的浏览器

​首先先区分一下浏览器和搜索引擎,身边有的朋友经常将搜索引擎和浏览器搞混,找不到资源就换一个浏览器试试。 搜索引擎是运行在浏览器的基础上的&#xff0c;比如常见的搜索引擎有&#xff0c;www.sougou.com&#xff0c;www.baidu.com&#xff0c;www.google.com。这些都是搜…