用Python实战ISTA算法:从稀疏信号恢复到完整代码实现
稀疏信号恢复是信号处理中的经典问题,比如从部分观测数据中重建完整图像,或者从嘈杂的传感器读数中提取关键特征。传统最小二乘法在面对病态矩阵时表现糟糕,而LASSO(Least Absolute Shrinkage and Selection Operator)通过引入L1正则项,不仅能稳定求解,还能自动选择重要特征。本文将手把手带你实现ISTA(Iterative Shrinkage-Thresholding Algorithm)——这个求解LASSO问题的高效算法。
1. 问题背景与算法原理
假设我们有一个观测系统:y = Ax + w,其中y是观测向量,A是测量矩阵,x是我们想恢复的稀疏信号,w代表噪声。当A是病态矩阵时(比如CT扫描中的投影矩阵),直接求逆会导致数值不稳定。
LASSO将问题转化为优化目标:
math复制\min_x \frac{1}{2}\|Ax-y\|_2^2 + \lambda\|x\|_1
这里λ控制稀疏度强度。ISTA的核心思想是将不可导的L1项通过软阈值函数处理:
python复制def soft_threshold(x, lambda_):
return np.sign(x) * np.maximum(np.abs(x) - lambda_, 0)
ISTA的迭代公式为:
math复制x_{k+1} = soft_{\lambda t}(x_k - tA^T(Ax_k - y))
其中t是步长。这个公式结合了梯度下降(第一项)和稀疏促进(第二项)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Python实现基础版ISTA
我们先实现最基础的ISTA版本。关键步骤包括:
- 初始化参数:设置λ、最大迭代次数和停止阈值
- 计算梯度:A^T(Ax - y)
- 软阈值操作:应用soft_threshold函数
- 收敛判断:检查x的变化量
python复制import numpy as np
from scipy.linalg import norm
def ista_basic(A, y, lambda_, max_iter=1000, tol=1e-6):
"
