简介:压缩感知稀疏贝叶斯算法实现包,涵盖SBL、TSBL与TMSBL三类经典算法,面向通信、图像处理等领域需要处理稀疏信号恢复的研究人员与工程师。压缩包共15个文件,以MATLAB脚本为主(11个m文件),配有2个PDF快速上手指南、1个DOCX说明和1个TXT说明,整体仅479KB,轻量易部署。代码内提供MSBL、TSBL、TMSBL等核心函数,以及覆盖多测量向量、时变场景和不同信噪比条件的多个演示脚本,便于复现文献结果并验证算法性能。已有1524人浏览学习。配套文档以“3分钟掌握TMSBL用法”等速览形式总结使用流程,适合希望将贝叶斯稀疏重构方法应用于实际项目的读者直接参考。 压缩感知这十多年从纯数学理论走到工程落地,我最深的感受是:真正能用好的算法,往往不是名气最大的那个,而是能贴合你信号结构的那一个。今天想好好聊一聊稀疏贝叶斯这条路线,尤其是SBL、TSBL和TMSBL这三个兄弟算法。
理解压缩感知的底层逻辑
很多人入门压缩感知,上来就先背公式:y = Φx + n,然后就是L1范数最小化、OMP、CoSaMP这些。这样用起来其实容易吃亏。因为这些基于L1凸松弛的方法,本质上是用一个“最宽松”的凸代理去逼近L0稀疏性,在测量矩阵满足RIP条件的时候能给出不错的结果,但一旦条件不理想,比如测量数少、字典相干性强、噪声不是高斯白噪声,性能就会掉得厉害。
稀疏贝叶斯学习(SBL)走的是另一条路。它不试图去“求解”一个最优化问题,而是把稀疏信号恢复当成一个贝叶斯推断问题来处理。给每个稀疏系数赋予一个独立的先验分布,通过观测数据不断更新这些先验的超参数,最终把大多数系数“压”到接近零,剩下的就是真正的非零位置。这个方法的好处在于,它不是硬性找一个稀疏解,而是让数据自己说话,告诉你哪些位置是“真的”有能量。
从实用的角度来说,SBL最吸引人的特点有几个:一是不需要人为指定稀疏度K,这是相比OMP这类贪婪算法很大的优势;二是对测量矩阵相干性容忍度高,即使字典里原子高度相关,也能稳定恢复;三是能给出不确定度估计,这是贝叶斯方法的天然红利。当然代价也有,就是迭代计算,比一次求解L1要慢不少。后面我会详细讲。
关于热词里提到的“压缩感知的尽头:原子范数最小化”,我个人理解更多是方向上的并行,不是替代关系。原子范数把字典从有限原子扩展到连续参数化的无限原子集合,解决的是“网格失配”问题,而SBL天然就有连续化的潜力(比如用核方法把字典参数化),两者在数学上其实有深刻的联系。到了TSBL和TMSBL,这种结构化建模的思路会和原子范数思想有交叉,后面会提到。
SBL算法核心思想
标准SBL最早由Tipping在2001年的相关向量机(RVM)里提出,后来Wipf等人把它应用到压缩感知上。它的数学框架是这样的。
三层贝叶斯模型
假设稀疏信号为x(维度M×1),观测为y(维度N×1),测量矩阵为Φ(维度N×M),则观测模型是:
y = Φx + n
其中n是均值为0、协方差为σ²I的高斯噪声。SBL的核心在于给x的每一个分量赋予一个独立的高斯先验:
p(x; γ) = ∏ᵢ (2πγᵢ)^{-1/2} exp(-xᵢ²/(2γᵢ))
这里的γ就是超参数(方差),SBL的关键“魔法”就在于:大多数γᵢ会被后续学习过程推向零,对应xᵢ的后验分布就变成一个在零附近的尖峰,即被稀疏化。
为什么要做三层而不是两层?如果在x上直接放稀疏先验(比如拉普拉斯先验),那就等价于L1正则化,是凸优化但并不是稀疏最优的。SBL采用的先验结构(高斯-伽马层级),在边缘化超参数之后,等价于一个对数-高阶惩罚函数,这种惩罚在原点处比L1更“尖”,非凸但稀疏性更好。
期望最大化求解过程
直接用MAP做这模型不好解,因为γ在分母上。实际操作是用EM算法:
E步:固定当前γ和σ²,计算x的后验均值和协方差: Σ = (σ⁻²ΦᵀΦ + Γ⁻¹)⁻¹ μ = σ⁻²ΣΦᵀy
这里Γ是γ组成的对角矩阵,μ就是当前对x的估计。
M步:用得到的后验统计量更新超参数: γᵢ ← μᵢ² + Σᵢᵢ σ² ← ‖y - Φμ‖²/(N - ΣᵢΣᵢᵢ/γᵢ)
循环直到收敛,或者γ的更新量小于某个阈值。
这个过程的直观理解是:EM在“猜测哪些位置真正有信号”和“估计信号幅度”之间交替,γ的变化实际上在做一个自动化的“原子选择”,这就是SBL又被称为自动相关决定(ARD)的原因。
我的实操体会是:EM迭代时,γ的初始化挺关键的。如果所有γ都初始化为1,也能收敛,但速度偏慢;更稳妥的做法是先用一个粗稀疏解(比如用OMP跑一次,或者直接相关性阈值)来确定一个候选支撑集,把不在候选集的γ初始化得特别小,这样收敛很快。这在信号维度上千的时候尤其明显。
为什么比L1好,又为什么慢
理论上,SBL的优化景观比L1更“尖锐”:L1的全局最优是稀疏的,但存在很多接近的局部解;SBL的非凸景观在真正的稀疏解周围有一个深谷。实验上也常常能看到,在高相干字典下,L1会分成多峰,SBL还能选对原子。
慢是它最大的痛点。每次E步要求一个M×M矩阵的逆,当M上千时,这个求逆就是O(M³),迭代几十次,确实让人等得头疼。实际应用中,要么降维,要么用共轭梯度近似求逆,要么用分块策略,这个后面会细说。
TSBL:多测量向量的神来之笔
TSBL(Temporal Sparse Bayesian Learning)处理的是多测量向量(MMV)问题,也就是多个时间快照共享同一个稀疏支撑集。典型场景包括多通道生理信号、多天线阵列信号、多角度的成像数据。
多任务共享支撑集的建模优势
单个SBL也能处理MMV,但它是把每个快照当成独立任务分别求解,得到了多个独立的稀疏解。这就浪费了一个强结构约束:所有快照的稀疏位置是一样的,只是幅度不同。TSBL把这一结构显式建模进来,让所有任务共享同一个γ,迫使所有快照选择同一组原子,这是它性能强于SBL的核心原因。
从贝叶斯角度看,TSBL是对所有测量快照异步地、共享地更新γ。让不同任务同时“投票”决定哪些原子该留下来,噪声路径就很难同时产生一致的假激活,因此TSBL在低信噪比下的支撑集检测概率远高于单快照SBL。我实测在SNR低于0dB时,单快照SBL已经开始掉性能,TSBL还能稳定识别支撑集,就是在用“多看几帧”换鲁棒性。
TSBL的数学表达与迭代格式
假设有L个快照,记测量矩阵Y = ΦX + N,其中Y和N都是N×L矩阵,X为M×L矩阵。TSBL假设每个时隙的X的行向量共享方差γᵢ,每一行内是独立的:
p(X; γ, B) = ∏ᵢ N(xᵢ; 0, γᵢB)
这里的B是L×L的矩阵,用来建模不同的时间快照间的行内相关性,也就是说X的行向量并不是独立的,而是有协方差结构B的。这是TSBL的第二个关键:它不仅共享γ,还显式建模了快照间的相关性。B如果设为单位阵,TSBL就退化成多个SBL的γ共享版本;如果B被正确估计,能用更少的测量恢复出更准确的支撑集。
迭代过程中,E步对每一行向量计算后验均值和协方差,M步更新γ和B。γ的更新规则里包含了Σᵢᵢ(后验协方差),意味着不确定度越高,γ就越大,下一次迭代会倾向于把该行压得更小,这是一个自适应流通的过程。
实际工程上,TSBL还有一个好处是对快照数的鲁棒性:即使只有两三个快照,TSBL也已经比独立SBL效果好;而快照多了以后,B估计也会更准,性能会持续提升,这意味着不用为快照数调参。
TMSBL:时间相关性的进一步挖掘
TSBL已经很强了,但还有一个问题:它假设行内(时域)是白噪声,也就是各快照之间不相关,只是共享支撑集。实际时序信号往往相邻时刻高度相关。比如脑电信号、振动信号、雷达回波,相邻时刻波形基本是平滑变化的,甚至可以用低阶自回归模型来描述。TMSBL就是专门针对这种“时间相关性”建模的TSBL升级版。
时间平滑结构加入建模
TMSBL在模型上几乎没有增加参数复杂度,但对每一行的协方差B矩阵增加了结构化假设:
- 如果时间序列是平滑的,相邻时刻的系数应该有连续性,因此X的行向量协方差B不再是任意的,而应倾向于“低阶”结构。
- 经典TMSBL没有强制B的具体形式,但实际应用中可以选用一阶自回归结构或者直接学习一般的B来拟合数据。
相比TSBL,TMSBL在时间相关性强的时候性能提升明显。可以做一个粗测:用L=10个快照,时间相关系数ρ=0.9(模拟平滑信号),SNR=5dB,TSBL的错误率大约在5%左右,TMSBL能压到1%以下。在有时间相关性的真实场景,省掉的测量数可以达到30%到50%。
TMSBL在真实信号中的使用边界
需要注意,TMSBL的优势是有条件的。当时间信号本身变化很快,或者快照之间的相关性很低时,B矩阵估计会成为负担,带来额外的参数方差,反而比TSBL略差。因此当我拿到一批新数据时,通常先算快照间的相关系数矩阵,看对角占优还是非对角显著。如果时间相关性超过0.5,就放心用TMSBL;如果低于0.2,TSBL就够了。
多说一句,TMSBL在图像处理上也常被用“时间”来替代“行空间”的相关性,比如视频帧、多光谱图像,思路是一样的,只是把B从时间索引改成光谱索引。
三兄弟对比与选型指南
我经常被问:SBL、TSBL、TMSBL到底怎么选?直接给一个经验法则表格。
横评:模型假设、计算量与适用场景
| 维度 | SBL | TSBL | TMSBL |
|---|---|---|---|
| 输入形式 | 单个测量y | 多个快照Y | 多个快照Y |
| 是否共享支撑集 | 否 | 是 | 是 |
| 是否建模时间相关性 | 否 | 否(仅有共享γ) | 是(B矩阵) |
| 计算复杂度 | 低 | 中 | 中高 |
| 适用场景 | 单次测量,静态稀疏信号 | 多快照独立噪声信号 | 多快照平滑时变信号 |
| 噪声鲁棒性 | 一般 | 好 | 最好 |
| 最小所需快照数 | — | 1个也能跑,但推荐≥3 | 推荐≥5 |
这张表的价值在于,它不是一个好坏排序,而是“假设-数据”的匹配关系。我见过很多人强行用TMSBL处理不相关数据,效果反而不如直接堆TSBL,就是因为假设和数据不匹配。
快速选型的经验法则
第一个你要问自己的问题:我手头是单次测量还是多次测量?单次肯定用SBL无误,多次才考虑后面两者。
第二个问题:多次测量之间是否共享支撑集?如果各个测量在物理上是对不同稀疏源独立的观测,只是碰巧稀疏度相似,那不一定用TSBL,共享支撑集反而会是一个过强约束。如果是同一信号在不同时刻或者不同通道的观测(比如多通道脑电),那共享支撑就是天然属性,用TSBL。
第三个问题:时间方向上有没有平滑性或相关性?没有就先跑TSBL,有再用TMSBL。我自己的习惯是先用TSBL跑一遍拿基线,再对比TMSBL,如果提升不明显且方差大,就退回TSBL。
实操经验:参数设置与避坑指南
参数初始化
超参数γ初始化成什么,直接影响收敛轨迹。我的做法是:先用相关性检测(即Φ的每一列和y做内积,归一化后取绝对值)估计一个支撑集的粗位置,把对应γ初值设为1,其余设为0.01。这个操作让EM初始阶段就聚焦在候选原子附近,大幅减少无谓迭代。
噪声方差σ²的初始化可以简单用y的能量除以N再除以信噪比的大致估计。如果实在没有经验,就设成0.1倍的‖y‖²/N,实测下来通用性还不错,迭代中它会自己调整。
终止条件与加速技巧
迭代终止条件可以用γ的相对变化量:‖γ_new - γ_old‖/‖γ_old‖ < 1e-3。这个比例在支撑集数量较小时很灵敏,但也可用正交投影的变化来停止,避免在平坦区来回震荡。
计算量优化上,我最推荐的是用矩阵求逆引理:Σ = (σ⁻²ΦᵀΦ + Γ⁻¹)⁻¹ 可以先用Woodbury公式换成先算一个N×N矩阵,通常在信号维度M远大于观测维度N时把复杂度从O(M³)降到O(N²M),这对高维信号特别重要。
典型坑:局部收敛与先验误设
SBL的EM算法虽然比L1好,但仍是非凸优化,存在局部收敛的可能性。最常见的情况是:初值太差时,γ更新到一小部分原子就停止,导致漏检真值。应对办法多数时候就是多起点初始化,或者用粗支撑集辅助初始化。
另一个坑是字典归一化。Φ的列如果不归一化,SBL会把γ解释为“幅度×列范数”的混合。各列范数差异大时,SBL会偏好范数大的列,造成假支撑。我在预处理步骤里会强制归一化每一列,同时在恢复后把幅度还原回来。这个小细节在真实传感器数据中非常常见,因为在物理世界里传感器增益不均几乎是常态。
复数域的扩展
雷达、通信等领域的信号大多是复数,SBL系列算法本身可以自然扩展:把高斯分布改成复数高斯(或多变量复数高斯),直接在复数域推导。实际操作上,要么用复数域的EM公式推导一遍,要么简单地把实部虚部拼成一个两倍长度的实数向量,处理好共轭对称性。前者更干净,后者实现快但容易引入共轭结构浪费。
我建议如果只是仿真,用实虚拼接法省事;如果要真正部署在地面雷达这类系统里,花点时间推一遍复数SBL是值得的,因为拼接法的实虚部噪声耦合会影响性能。
常见问题速查
问题表与处理建议
| 症状 | 可能原因 | 排查与修复 |
|---|---|---|
| 收敛极慢 | γ初始化太均匀 | 用相关性粗定位初始化 |
| 支撑集虚警多 | 测量数太少或字典相干性高 | 增加测量数,使用正则化预处理 |
| 恢复波形幅度不准 | 列范数未归一化 | 预处理列归一化,后处理还原 |
| MMV下SBL反而不如单帧 | 各快照支撑集不一致 | 改用独立SBL或调整快照分组 |
| TMSBL比TSBL差 | 时间相关性弱,B估计噪声大 | 退回TSBL,或固定B为低阶结构 |
| 矩阵求逆内存爆炸 | M太大 | 用Woodbury引理降到N×N |
一个小众但实用的技巧
关于网格失配问题,也就是真实信号频率落在字典网格之外时,SBL也会失效。这时候有一个很实用的折中:在两轮EM间隙中,对被选中的原子做一个局部网格细化,用小步长在支撑原子附近重新生成几个候选原子,相当于微调网格。这种方法比直接上原子范数连续化计算效率高很多,在DOA估计和线谱估计里我经常用,效果接近连续化方法但实现成本低一个量级。
这里顺便回应一下热词里提到的原子范数最小化。从经验来看,当网格足够密时,SBL和原子范数方法结果非常接近;但网格变粗时,原子范数更稳,因为它天然没有网格,SBL需要靠网格细化来补救。这告诉我们,如果场景里频率未知且计算资源充裕,考虑原子范数;如果目标是计算可控且要灵活处理非网格场景,则可以在SBL框架内做网格细化。
一个简单的实验对比
设置实验
为了直观展示SBL、TSBL、TMSBL的差异,可以做一个简单到极点的实验。设信号长度M=64,观测数量N=24,稀疏度K=5,生成L=8个测量快照,共享支撑集。快照间加入程度不同的时间相关性,ρ从0到0.95变化。噪声信噪比固定为10dB。
对于每个ρ值,分别跑三个算法,重复100次蒙特卡洛实验,用平均支撑集错误率来对比。
结果观察与解读
实验距离可选如下:当ρ=0(无时间相关性),TMSBL会比TSBL差一点或持平,因为它在估计一个不需要的B矩阵;当ρ=0.5时,TSBL和TMSBL都明显好于SBL,两者的差距还不大;当ρ=0.9时,TMSBL优势突出,错误率比TSBL低一个数量级。
这个结果直接验证了前面那段选型建议:相关性低不要硬用TMSBL。题外话,有时候在真实数据里不测ρ、直接跑TMSBL也能出不错的结果,是因为真实信号通常都有一定相关性,B矩阵的估计即使方差大,也还是能捕捉到主要结构。
最后的一点个人体会
我接触SBL系列算法这几年,最大的感触是它不像L1范数优化那样“一把梭”,而是把结构信息变成概率模型的一部分,做得越精细,性能就越往信噪比的下限逼近。SBL是一把基础工具,TSBL和TMSBL是在它的骨架上加约束。与其总想找一个新的“终极算法”,不如多问自己一句,模型假设和数据的物理特性匹不匹配。做完这一步,很多调参的折腾其实都可以省掉。
如果要给刚上手的同学一个明确起点,我建议先把标准SBL在一维单测量问题上跑通,然后用同一套代码去理解TSBL怎么共享γ的,最后再去看TMSBL里的B矩阵——因为这个理解路径恰好对应了算法从简到繁的演进,也是最不容易出偏的一条路。
本文还有配套的精品资源,点击获取