You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LASSO的坐标下降Python算法扩展为Adaptive LASSO?

如何用坐标下降实现Adaptive LASSO

我目前拥有一个用于求解LASSO的简单坐标下降Python算法,代码如下:

def lasso_nb(X, y, alpha, tol=0.001, maxiter=10000):
    n, p = X.shape
    beta = np.zeros(p)
    R = y.copy()
    norm_cols_X = (X ** 2).sum(axis=0)
    resids = []
    prev_cost = 10e10
    for n_iter in range(maxiter):
        for ii in range(p):
            beta_ii = beta[ii]
            if beta_ii != 0.:
                R += X[:, ii] * beta_ii
            tmp = np.dot(X[:, ii], R)
            beta[ii] = fsign(tmp) * max(abs(tmp) - alpha, 0) / (.00001 + norm_cols_X[ii])
            if beta[ii] != 0.:
                R -= X[:, ii] * beta[ii]
        cost = (np.sum((y - X @ beta)**2) + alpha * np.sum(np.abs(beta))) / n
        resids.append(cost)
        if prev_cost - cost < tol:
            break
        else:
            prev_cost = cost
    return beta

请问如何将该算法扩展以实现Adaptive LASSO?或者坐标下降法无法实现Adaptive LASSO吗?

坐标下降法完全可以实现Adaptive LASSO。Adaptive LASSO的核心是给每个特征的L1惩罚项分配自适应权重——对初始估计中系数绝对值较大的特征,施加更小的惩罚,反之则施加更大的惩罚,以此提升变量选择的一致性。

实现步骤

Adaptive LASSO的实现分为三步:

  1. 获取初始系数估计:先通过普通最小二乘(OLS)或普通LASSO得到一组初始系数beta0;
  2. 计算自适应权重:基于beta0计算每个特征的权重w_j,通常取w_j = 1 / (|beta0_j| + eps)^gamma(eps用于避免除以0,gamma一般取1或2);
  3. 修改坐标下降的软阈值步骤:将原LASSO中统一的惩罚系数alpha替换为alpha * w_j,对每个特征应用不同的软阈值。

修改后的代码

import numpy as np

def fsign(x):
    return np.sign(x) if x != 0 else 0

def adaptive_lasso_nb(X, y, alpha, gamma=1.0, eps=1e-6, tol=0.001, maxiter=10000):
    n, p = X.shape
    
    # 步骤1:获取初始系数估计(n>p用OLS;n<p可替换为普通LASSO)
    beta0 = np.linalg.lstsq(X, y, rcond=None)[0]
    
    # 步骤2:计算自适应权重
    w = 1 / (np.abs(beta0) + eps) ** gamma
    
    # 初始化参数,和原LASSO逻辑一致
    beta = np.zeros(p)
    R = y.copy()
    norm_cols_X = (X ** 2).sum(axis=0)
    resids = []
    prev_cost = 10e10
    
    for n_iter in range(maxiter):
        for ii in range(p):
            beta_ii = beta[ii]
            if beta_ii != 0.:
                R += X[:, ii] * beta_ii
            tmp = np.dot(X[:, ii], R)
            # 步骤3:替换为自适应的软阈值
            adaptive_alpha = alpha * w[ii]
            beta[ii] = fsign(tmp) * max(abs(tmp) - adaptive_alpha, 0) / (.00001 + norm_cols_X[ii])
            if beta[ii] != 0.:
                R -= X[:, ii] * beta[ii]
        # 更新代价函数,匹配Adaptive LASSO的目标
        cost = (np.sum((y - X @ beta)**2) + alpha * np.sum(w * np.abs(beta))) / n
        resids.append(cost)
        if prev_cost - cost < tol:
            break
        else:
            prev_cost = cost
    return beta, resids

关键改动说明

  • 新增初始系数估计和自适应权重计算逻辑;
  • 软阈值计算时,将原固定的alpha替换为alpha * w[ii],实现特征差异化惩罚;
  • 代价函数中的惩罚项更新为alpha * np.sum(w * np.abs(beta)),完全匹配Adaptive LASSO的目标函数。

注意事项

  • 若样本量n小于特征数p,OLS无法直接求解,此时可替换为普通LASSO的结果作为初始beta0;
  • gamma取值影响自适应程度,通常取1或2即可;
  • eps用于避免初始系数为0时的除以0错误,可根据数据情况调整。

内容的提问来源于stack exchange,提问作者Tylerr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:20:23