稀疏优化 / 压缩感知(MATLAB 版)
稀疏优化 / 压缩感知里一个非常经典的完整实验示例。按“代码在干什么 → 背后的数学模型 → 三种方法对比 → 图像如何解读 → 常见坑”的逻辑,系统拆解一遍(偏教学版,适合讲课或写讲义)。
一、整体问题在干什么?(一句话版)
在欠定线性方程 ( A u = b ) 中,利用“稀疏性”恢复真实信号 (u)
——比较 L1(稀疏) 和 L2(最小二乘) 的本质差异。
二、数据构造部分(最关键)
m = 128;
n = 256;
A = randn(m, n);
u = sprandn(n, 1, 0.1);
b = A * u;
1️⃣ 维度含义
| 变量 | 含义 | 维度 |
|---|---|---|
| (A) | 测量矩阵(感知矩阵) | (128 \times 256) |
| (u) | 真实稀疏信号 | (256 \times 1) |
| (b) | 观测值 | (128 \times 1) |
⚠️ 这是一个欠定系统:
[
128 < 256 \quad \Rightarrow \quad A u = b \text{ 有无穷多解}
]
2️⃣ A = randn(m, n);
- 每个元素服从 标准高斯分布
- 高斯随机矩阵满足 RIP(受限等距性质) 的概率很高
👉 压缩感知里的“理想字典”
3️⃣ u = sprandn(n,1,0.1);
这是重点 ⭐⭐⭐
-
sprandn(n,1,0.1)表示:- 向量长度 256
- 只有 10% 非零
- 非零元素服从高斯分布
👉 真实稀疏度 ≈ 25 个非零
数学上:
[
|u|_0 \approx 0.1n
]
4️⃣ b = A * u;
- 无噪声观测
- 理论上:
[
b \in \mathbb{R}^{128}, \quad u \text{ 是稀疏的}
]
这是最标准的 Basis Pursuit / LASSO 测试场景
三、方法一:LASSO(L2 + L1)
lambda = 0.1;
u_recovered = lasso(A, b, 'Lambda', lambda);
数学模型
MATLAB 的 lasso 解的是:
[
\min_x \frac{1}{2}|Ax - b|_2^2 + \lambda |x|_1
]
含义
- 第一项:拟合数据
- 第二项:鼓励稀疏
- λ 越大 → 越稀疏,但误差可能变大
📌 这是统计/机器学习中最常用的稀疏回归模型
优点 / 缺点
✅ 数值稳定
✅ 对噪声鲁棒
❌ λ 需要调参
❌ 理论恢复不如 BP 干净
四、方法二:OMP(贪心法,注释掉)
% u_recovered = omp(A'*b, A'*A, 25);
思想
- 每一步选一个与残差最相关的原子
- 假设稀疏度是 25
📌 典型信号处理算法,但:
- 对噪声敏感
- 稀疏度估计错 → 崩
五、方法三:CVX + Basis Pursuit(最核心)
cvx_begin
variable x(n)
minimize(norm(x, 1))
subject to
A*x == b
cvx_end
u_recovered = x;
数学模型(重点)
[
\boxed{
\min_x |x|_1 \quad
\text{s.t. } Ax = b
}
]
👉 这就是 Basis Pursuit(基追踪)
为什么用 L1?
- L0:NP-hard
- L2:不稀疏
- L1 是 L0 的最优凸松弛
几何直觉(图):
- L1 单位球是“尖的”
- 更容易在坐标轴上取极值 → 大量 0
CVX 是什么?
CVX = MATLAB 的凸优化建模工具
-
只写数学形式
-
CVX 自动:
- 判断是否凸
- 调用内点法 / 一阶法
-
非常适合:
- 教学
- 理论验证
- 论文复现实验
六、恢复效果评估
recovery_error = norm(u_recovered - u) / norm(u);
相对误差
[
\frac{|u_{\text{rec}} - u|_2}{|u|_2}
]
- 接近
1e-6 ~ 1e-8→ 完美恢复 -
1e-2→ 失败
sparsity = nnz(abs(u_recovered) > 1e-3) / n;
稀疏度
- 看恢复信号中“非零比例”
- L1 → 稀疏
- L2 → 几乎全非零
七、图像如何解读(图)
(a) 精确解 u
- 90% 是 0
- 少数尖峰
(b) L1 解
- 位置对、数值准
- 非零数量 ≈ 原始
👉 压缩感知成功
(c) L2 解(最小二乘)
- 几乎每个位置都有小值
- 完全不稀疏
👉 L2 完全忽略“稀疏先验”

浙公网安备 33010602011771号