用Python实战ISTA算法:攻克LASSO问题的稀疏解之谜
当数据科学家面对高维数据集时,传统线性回归往往会陷入"维度诅咒"的困境。想象一下,你手头有1000个特征,但只有100个样本——这种情况下,最小二乘法就像用渔网捞针,不仅效率低下,还容易捕捉到大量噪声。这正是LASSO回归和ISTA算法大显身手的舞台。
1. 病态矩阵与稀疏解:为什么需要LASSO?
在机器学习实践中,我们经常遇到设计矩阵列相关性高或样本量远小于特征数的情况。这类矩阵被称为"病态矩阵",其最小二乘解对微小扰动异常敏感。
1.1 病态系统的数值实验
让我们用NumPy创建一个故意设计的病态系统:
python复制import numpy as np
np.random.seed(42)
# 构造病态设计矩阵
n_samples, n_features = 50, 100
X = np.random.randn(n_samples, n_features)
# 人为制造列相关性(病态的核心原因)
X[:, 10] = X[:, 9] + 0.01 * np.random.randn(n_samples)
# 生成稀疏真实解(仅5%非零)
w_true = np.zeros(n_features)
nonzero_indices = np.random.choice(n_features, 5, replace=False)
w_true[nonzero_indices] = 3 * np.random.randn(5)
# 生成观测值并添加噪声
y = X @ w_true + 0.1 * np.random.randn(n_samples)
此时若直接使用最小二乘:
python复制w_ls = np.linalg.pinv(X) @ y
print(f"LS解与真实解的误差:{np.linalg.norm(w_ls - w_true):.4f}")
典型输出可能显示误差高达300%以上,且解完全失去稀疏性。这就是我们需要ℓ₁正则化的根本原因。
1.2 LASSO的数学本质
LASSO问题的目标函数:
minimize ½‖Xw - y‖₂² + λ‖w‖₁
其中λ控制稀疏度强度
