坐标下降法(coordinate descent method)求解LASSO的推导

坐标下降法(coordinate descent method)求解LASSO推导

LASSO在尖点是singular的,因此传统的梯度下降法、牛顿法等无法使用。常用的求解算法有最小角回归法、coordinate descent method等。
由于coordinate descent method是相对较简单的做法,放在第一个介绍。

坐标下降法思想

坐标下降法基于的思想很简单,就是当面对最小化一个多元函数的问题时,我们每一次迭代的时候只改变一个目标变量的值。也就是固定其他变量不动,只在该变量的维度上寻找一个使函数最小的值。这种思想类似于贪心算法。

推导过程

定义Loss function为:
\[ \frac{1}{N}\sum_{i=1}^{N}(y_i-x_i^T\cdot \beta) \]
其中,\(x_i\)是p·1维的向量,\(\beta\)是p·1维的向量。

Penalty为Lasso penalty:
\[ \sum_{j=1}^p|\beta_j| \]
定义超参数为\(\lambda\)

目标函数为:
\[ L=\frac{1}{N}\sum_{i=1}^{N}(y_i-x_i^T\cdot \beta+\lambda\sum_{j=1}^p|\beta_j|) \]
应用坐标下降法的思想,我们固定住\(x_k\ne x_j\)的变量,然后在每一轮迭代中只优化\(x_j\)

可以采用的迭代顺序是从j=1依次到p进行迭代,然后再从j=1开始。

当固定住其他变量时,求object function的极小值就等价于求解一元LASSO的问题。
\[L=\frac{1}{N}\sum_{i=1}^{N}(r_i-\beta_jx_{ji})^2+\lambda \beta_j \tag{1}\]

其中,\(r_i=y_i-\sum_{k\ne j}x_{ik}\beta_k\),也就是只用其他变量拟合y的残差。

将式1稍微化简一下,可以得到:
\[ L=\beta_j^2\frac{\sum_{i=1}^{N}x_{ji}^2}{N}-2\beta_j\frac{\sum_{i=1}^{N}r_ix_{ji}}{N}+\frac{\sum_{i=1}^{N}r_i^2}{N}+\lambda{|\beta_j|} \]
这是一个二次函数。由于涉及到绝对值,我们需要分两个区间讨论:\(\beta_j<0\)\(\beta_j>0\)

相当于我们将\(\beta_j\)的取值划成了两个空间,分别讨论极值。最后的极值是把这两个空间的极值再取最小值。

  • 第一个区间, \(\beta_j>0\)
    可以观察到object function是一个开口向上二次函数,全局最小点在\(\beta_j=\frac{2\frac{\sum r_ix_i}{N}-\lambda}{2\sum x_i^2}{N}\)处取得。
    但是我们这时的定义域限制在 \(\beta_j>0\),因此需要分类讨论是否能取全局最小点:
    \[ if (2\frac{\sum r_ix_i}{N}-\lambda>0):\\ {\beta_j^{*}=\frac{2\frac{\sum r_ix_i}{N}-\lambda}{2\sum x_i^2}{N}}\\ Else:\\ {\beta_j^{*}=0} \]

  • 第二个区间,\(\beta_j<0\)
    全局最小点在\(\beta_j=\frac{2\frac{\sum r_ix_i}{N}+\lambda}{2\sum x_i^2}{N}\)处取得。

但是我们这时的定义域限制在 \(\beta_j<0\),因此需要分类讨论是否能取全局最小点:
\[ if (2\frac{\sum r_ix_i}{N}+\lambda<0):\\ {\beta_j^{*}=\frac{2\frac{\sum r_ix_i}{N}+\lambda}{2\sum x_i^2}{N}}\\ Else:\\ {\beta_j^{*}=0} \]

综合上面的讨论,

  • case1:\(2\frac{\sum r_ix_i}{N}<-\lambda\)
    \(\beta_j^{*}=\frac{2\frac{\sum r_ix_i}{N}+\lambda}{2\sum x_i^2}{N}\)

  • case2:\(-\lambda<2\frac{\sum r_ix_i}{N}<\lambda\)
    \(\beta_j^{*}=0\)

  • case3:\(\lambda<2\frac{\sum r_ix_i}{N}\)
    \(\beta_j^{*}=\frac{2\frac{\sum r_ix_i}{N}-\lambda}{2\sum x_i^2}{N}\)

定义一个软阈值函数来统一三个case

\[ \beta_j^{*}=\frac{\text{soft threshold}({2\frac{\sum r_ix_i}{N},\lambda)}}{2\frac{\sum x_i^2}{N}} \]

comment

对于用L2 loss function作为损失函数的回归问题,由于object function是关于\(\beta\)的凸函数,因此我们一定可以找到一个全局最优点。迭代过程是收敛的。

转载于:https://www.cnblogs.com/zzqingwenn/p/10874522.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用R语言实现的循环坐标下降coordinate descent求解Lasso的代码: ``` # Lasso using coordinate descent # Define the L1 penalty function L1 <- function(beta, lambda) { sum(abs(beta)) * lambda } # Define the coordinate descent function lasso_cd <- function(X, y, lambda, max_iter = 1000, tol = 1e-4) { # Standardize X and y X <- scale(X) y <- scale(y) # Initialize beta n <- nrow(X) p <- ncol(X) beta <- rep(0, p) beta_old <- beta # Define the soft-thresholding operator soft_thresh <- function(x, lambda) { sign(x) * pmax(abs(x) - lambda, 0) } # Coordinate descent loop for (iter in 1:max_iter) { for (j in 1:p) { X_j <- X[, j] beta_j <- beta[-j] r <- y - X[, -j] %*% beta_j c_j <- colSums(X_j^2) z_j <- X_j %*% r / n + beta[j] beta[j] <- soft_thresh(z_j, lambda * n) / c_j } if (max(abs(beta - beta_old)) < tol) { break } beta_old <- beta } # Return the final beta values beta } # Example usage set.seed(123) n <- 100 p <- 10 X <- matrix(rnorm(n * p), n, p) y <- X[, 1] - 2 * X[, 2] + rnorm(n) lambda <- 0.5 beta <- lasso_cd(X, y, lambda) ``` 其中,第一步定义了L1惩罚函数(L1 penalty function),第二步是循环坐标下降coordinate descent)函数的定义,第三步是对输入的数据进行标准化,第四步是初始化beta。在coordinate descent循环中,我们对于每个j循环遍历每个参数,计算残差r,第j个自变量的列和c_j,z_j,然后更新beta_j。最后,我们检查beta是否收敛,并返回最终的beta值。 这个函数可以接受任意大小的X和y,以及任意的lambda值,它返回Lasso估计的系数向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值