如何将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的实现分为三步:
- 获取初始系数估计:先通过普通最小二乘(OLS)或普通LASSO得到一组初始系数
beta0; - 计算自适应权重:基于
beta0计算每个特征的权重w_j,通常取w_j = 1 / (|beta0_j| + eps)^gamma(eps用于避免除以0,gamma一般取1或2); - 修改坐标下降的软阈值步骤:将原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
相关产品推荐
相关产品推荐

