从因子图到代码:手把手拆解GAMP-MMSE算法里的‘消息’到底怎么传
在信号处理领域,稀疏信号恢复是一个经典问题。想象一下,你正在尝试从嘈杂的观测数据中恢复原始信号,而这个信号本身具有稀疏特性——就像夜空中的星星,大部分区域是黑暗的,只有少数亮点散布其中。GAMP-MMSE算法正是为解决这类问题而生,它通过一种称为"消息传递"的机制,在概率图模型中进行高效推理。
1. 消息传递:从因子图说起
因子图是一种二分图,它将变量和约束条件分开表示,为理解复杂算法提供了直观的可视化工具。在GAMP-MMSE算法中,我们可以将整个系统建模为一个因子图,其中包含两类节点:
- 变量节点:代表待估计的未知量(如稀疏信号x)
- 因子节点:代表观测方程和先验约束(如y=Ax+w)
消息传递算法的核心思想是让这些节点之间交换"信念"——即关于变量概率分布的信息。在GAMP中,这些消息被巧妙地简化为只需要传递均值和方差的高斯分布。
提示:虽然真实分布可能非高斯,但通过中心极限定理的近似,我们可以用高斯分布来简化计算。
消息传递方向分为两种:
- 从左到右(因子节点→变量节点):携带观测信息
- 从右到左(变量节点→因子节点):携带先验信息
2. GAMP-MMSE的核心计算步骤
让我们用一个简单的线性模型y=Ax+w来演示GAMP-MMSE的具体计算流程。假设A是已知的测量矩阵,w是高斯噪声。
2.1 左消息计算(观测更新)
左消息对应算法中的phat和phatvar计算:
phatvar = (abs(A).^2)*Xhatvar; phat = A*Xhat - phatvar.*Shat;这里:
Xhat和Xhatvar是当前对x的估计均值和方差Shat是来自上一次迭代的残差信息
2.2 中间变量更新
计算观测侧的中间变量Shat和Shatvar:
Shatvar = 1./(noise_lamda + phatvar); Shat = (y - phat).*Shatvar;这一步实际上是在计算观测似然对x的贡献。
2.3 右消息计算(先验更新)
右消息对应算法中的rhat和rhatvar:
rhatvar = 1./(((abs(A).').^2)*Shatvar); rhat = rhatvar.*((A')*Shat) + Xhat;这些值将被用于结合先验信息更新对x的估计。
3. 稀疏贝叶斯学习(SBL)先验的整合
GAMP框架的强大之处在于它能灵活整合各种先验。在稀疏信号恢复中,稀疏贝叶斯学习(SBL)先验特别有效:
gamma_l = (1+epc)./(eta + abs(Xhat).^2 + Xhatvar); Xhatvar = rhatvar./(1 + gamma_l.*rhatvar); Xhat = rhat./(1 + gamma_l.*rhatvar);这里gamma_l是SBL引入的超参数,它会自动学习信号的稀疏模式——对非零元素赋予较大的gamma_l值,对零元素则相反。
4. 从理论到代码的完整对应
让我们将上述数学概念与提供的MATLAB代码关键部分对应起来:
初始化阶段:
Xhatvar = ones(L,1); % 初始方差 Xhat = zeros(L,1); % 初始均值 gamma_l = ones(L,1); % SBL超参数主迭代循环:
- 左消息计算(观测更新)
- 中间变量更新
- 右消息计算(先验更新)
- SBL超参数更新
高斯乘积计算:
function [m3,v3] = GaussianProduct(m1,v1,m2,v2) v3 = (1./(v1)+1./(v2)).^-1; m3 = (m1./v1+m2./v2).*v3; end
这个辅助函数实现了两个高斯分布的乘积运算,在消息传递中频繁使用。
5. 算法优势与实现细节
GAMP-MMSE相比传统AMP算法有几个显著优势:
- 更强的稳定性:不需要额外的正则化项
- 更广的适用性:可以处理各种先验分布和噪声模型
- 保持计算效率:复杂度仍为O(nm)
在实际实现时,有几个关键点需要注意:
- 噪声方差估计:代码中实现了噪声方差的在线估计
- 收敛判断:示例使用了固定迭代次数,实践中可添加收敛判断
- 数值稳定性:矩阵运算需要注意避免数值下溢
注意:虽然GAMP比AMP更稳定,但对于极端病态问题仍可能出现发散情况。