一、引言
压缩感知(Compressive Sensing, CS)理论打破了奈奎斯特采样定理的限制,通过少量线性测量即可高概率恢复稀疏信号。块稀疏贝叶斯学习(Block Sparse Bayesian Learning, BSBL)是CS领域的重要算法,专门针对块稀疏信号(即信号的非零元素集中在少数连续块中)设计,通过贝叶斯框架建模块内相关性与稀疏性,显著提升了重构性能。
二、BSBL算法理论基础
1. 块稀疏信号模型
块稀疏信号的核心特征是非零元素呈块状分布,例如时间序列中的连续脉冲、图像中的纹理块。数学上,块稀疏信号可表示为:
$x = [x_1^T, x_2^T, \\dots, x_B^T]^T$
其中,$x_b \in \mathbb{R}^{n_b}$ 是第 $b$ 个块($n_b$ 为块大小),$B$ 为块总数,且仅有少数块 $x_b$ 非零(块稀疏性)。
2. BSBL的贝叶斯框架
BSBL通过层次化先验建模块稀疏性与块内相关性:
- 第一层(块内先验):每个块 $x_b$ 服从高斯分布,均值为0,协方差矩阵为 $\gamma_b\Sigma_b$($\gamma_b$ 为块稀疏参数,$\Sigma_b$ 为块内相关性矩阵): $p(x_b|\gamma_b,\Sigma_b) = \mathcal{N}(0, \gamma_b\Sigma_b)$
- 第二层(超先验):块稀疏参数 $\gamma_b$ 服从伽马分布(自动相关性确定,ARD),鼓励稀疏性: $p(\gamma_b|a,b) = \text{Gamma}(\gamma_b|a,b)$ 其中,$a,b$ 为超参数(通常取极小值,如 $a=b=10^{-8}$,表示对 $\gamma_b$ 无先验偏好)。
3. 观测模型与后验推断
压缩感知的观测模型为:
$y = Ax + w$
其中,$A \in \mathbb{R}^{M \times N}$ 为测量矩阵($M \ll N$),$w \sim \mathcal{N}(0, \sigma^2 I)$ 为高斯噪声。
BSBL通过后验推断估计 $x$:
- E步(期望):计算 $x$ 的后验均值与协方差(利用当前超参数 $\gamma_b,\Sigma_b$);
- M步(最大化):更新超参数 $\gamma_b,\Sigma_b$(最大化边缘似然)。
三、BSBL算法实现(MATLAB)
以下是BSBL的核心实现步骤(基于EM算法):
1. 参数初始化
function[x_hat, gamma]=bsbl_em(y, A, B, n_b)
% 输入:y(测量向量,M×1);A(测量矩阵,M×N);B(块数);n_b(每块大小)
% 输出:x_hat(重构信号,N×1);gamma(块稀疏参数,B×1)
N =size(A,2);
M =size(A,1);
gamma =ones(B,1);% 初始化块稀疏参数
Sigma_b =eye(n_b);% 初始化块内协方差矩阵(单位矩阵)
max_iter =100;% 最大迭代次数
tol =1e-6;% 收敛阈值
for iter =1:max_iter
% ----------------------
% E步:计算后验均值与协方差
% ----------------------
x_post_mean =zeros(N,1);
x_post_cov =zeros(N, N);
for b =1:B
idx =(b-1)*n_b +1: b*n_b;% 当前块的索引
A_b =A(:, idx);% 当前块对应的测量矩阵列
Sigma_b_inv =inv(gamma(b)*Sigma_b);% 块内协方差逆
% 后验协方差(块内)
Sigma_b_post =inv(A_b'*A_b + Sigma_b_inv);
% 后验均值(块内)
mu_b_post = Sigma_b_post * A_b'* y;
% 累积后验均值与协方差
x_post_mean(idx)= mu_b_post;
x_post_cov(idx, idx)= Sigma_b_post;
end
% ----------------------
% M步:更新超参数
% ----------------------
gamma_old = gamma;
for b =1:B
idx =(b-1)*n_b +1: b*n_b;
mu_b_post =x_post_mean(idx);
Sigma_b_post =x_post_cov(idx, idx);
% 更新块稀疏参数gamma_b(最大化边缘似然)
gamma(b)=1/(trace(Sigma_b_post)+ mu_b_post'*mu_b_post);
% 更新块内协方差矩阵Sigma_b(可选,若假设块内独立则固定为单位矩阵)
% Sigma_b = cov(mu_b_post);
end
% ----------------------
% 收敛判断
% ----------------------
ifnorm(gamma - gamma_old)< tol
break;
end
end
x_hat = x_post_mean;
end

