SP的提出時間比CoSaMP提出時間稍晚一些,但和壓縮采樣匹配追蹤(CoSaMP)的方法幾乎是一樣的。SP與CoSaMP主要區別在於“In each iteration, in the SP algorithm, only K new candidates are added, while theCoSAMP algorithm adds 2K vectors.”,即SP每次選擇K個原子,而CoSaMP則選擇2K個原子;這樣帶來的好處是“This makes the SP algorithm computationally moreefficient,”。
在看代碼之前,先看了SP的論文[1],在摘要部分提到SP算法具有兩個主要特點:一是較低的計算復雜度,特別是針對比較稀疏的信號的重構時,相比OMP算法,SP算法具有更低的計算復雜度;二是具有和線性規划優化(LP)方法相近的重構精度。在待重構信號具有比較小的稀疏度的情況下,SP的計算復雜度明顯比LP方法的小,但是重構質量比LP的差。
在論文中還提到這么一段與OMP方法的比較,並提供了圖形加以理解。SP方法和OMP方法最大的區別就是針對所選擇的原子有無回溯(反向跟蹤)。

參考文獻[2]中對SP算法進行了解釋,如下所示:
在論文中還提到這么一段與OMP方法的比較,並提供了圖形加以理解。SP方法和OMP方法最大的區別就是針對所選擇的原子有無回溯(反向跟蹤)。
以下是文獻[1]中的給出的SP算法流程:
這個算法流程的初始化(Initialization)其實就是類似於CoSaMP的第1次迭代,注意第(1)步中選擇了K個原子:“K indices corresponding to the largest magnitude entries”,在CoSaMP里這里要選擇2K個最大的原子,后面的其它流程都一樣。這里第(5)步增加了一個停止迭代的條件:當殘差經過迭代后卻變大了的時候就停止迭代。
鑒於SP與CoSaMP如此相似,這里不就再單獨給出SP的步驟了,參考《壓縮感知重構算法之壓縮采樣匹配追蹤(CoSaMP)》,只需將第(2)步中的2K改為K即可。
function [ theta ] = CS_SP( y,A,K )
%CS_SP Summary of this function goes here
%Version: 1.0 written by jbb0523 @2015-05-01
% Detailed explanation goes here
% y = Phi * x
% x = Psi * theta
% y = Phi*Psi * theta
% 令 A = Phi*Psi, 則y=A*theta
% K is the sparsity level
% 現在已知y和A,求theta
% Reference:Dai W,Milenkovic O.Subspace pursuit for compressive sensing
% signal reconstruction[J].IEEE Transactions on Information Theory,
% 2009,55(5):2230-2249.
[y_rows,y_columns] = size(y);
if y_rows<y_columns
y = y';%y should be a column vector
end
[M,N] = size(A);%傳感矩陣A為M*N矩陣
theta = zeros(N,1);%用來存儲恢復的theta(列向量)
Pos_theta = [];%用來迭代過程中存儲A被選擇的列序號
r_n = y;%初始化殘差(residual)為y
for kk=1:K%最多迭代K次
%(1) Identification
product = A'*r_n;%傳感矩陣A各列與殘差的內積
[val,pos]=sort(abs(product),'descend');
Js = pos(1:K);%選出內積值最大的K列
%(2) Support Merger
Is = union(Pos_theta,Js);%Pos_theta與Js並集
%(3) Estimation
%At的行數要大於列數,此為最小二乘的基礎(列線性無關)
if length(Is)<=M
At = A(:,Is);%將A的這幾列組成矩陣At
else%At的列數大於行數,列必為線性相關的,At'*At將不可逆
break;%跳出for循環
end
%y=At*theta,以下求theta的最小二乘解(Least Square)
theta_ls = (At'*At)^(-1)*At'*y;%最小二乘解
%(4) Pruning
[val,pos]=sort(abs(theta_ls),'descend');
%(5) Sample Update
Pos_theta = Is(pos(1:K));
theta_ls = theta_ls(pos(1:K));
%At(:,pos(1:K))*theta_ls是y在At(:,pos(1:K))列空間上的正交投影
r_n = y - At(:,pos(1:K))*theta_ls;%更新殘差
if norm(r_n)<1e-6%Repeat the steps until r=0
break;%跳出for循環
end
end
theta(Pos_theta)=theta_ls;%恢復出的theta
end
鑒於SP與CoSaMP的極其相似性,這里就不再給出單次重構和測量數M與重構成功概率關系曲線繪制例程代碼了,只需將CoSaMP中調用CS_CoSaMP函數的部分改為調用CS_SP即可,無須任何其它改動。這里給出對比兩種重構算法所繪制的測量數M與重構成功概率關系曲線的例程代碼,只有這樣才可以看出兩種算法的重構性能優劣,以下是在分別運行完SP與CoSaMP的測量數M與重構成功概率關系曲線繪制例程代碼的基礎上,即已經存儲了數據CoSaMPMtoPercentage1000.mat和SPMtoPercentage1000.mat:
clear all;close all;clc;
load CoSaMPMtoPercentage1000;
PercentageCoSaMP = Percentage;
load SPMtoPercentage1000;
PercentageSP = Percentage;
S1 = ['-ks';'-ko';'-kd';'-kv';'-k*'];
S2 = ['-rs';'-ro';'-rd';'-rv';'-r*'];
figure;
for kk = 1:length(K_set)
K = K_set(kk);
M_set = 2*K:5:N;
L_Mset = length(M_set);
plot(M_set,PercentageCoSaMP(kk,1:L_Mset),S1(kk,:));%繪出x的恢復信號
hold on;
plot(M_set,PercentageSP(kk,1:L_Mset),S2(kk,:));%繪出x的恢復信號
end
hold off;
xlim([0 256]);
legend('CoSaK=4','SPK=4','CoSaK=12','SPK=12','CoSaK=20',...
'SPK=20','CoSaK=28','SPK=28','CoSaK=36','SPK=36');
xlabel('Number of measurements(M)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');
運行結果如下:
可以發現在M較小時SP略好於CoSaMP,當M變大時二者重構性能幾乎一樣。
參考文獻:
[1] Dai W,Milenkovic O.Subspacepursuit for compressive sensing signal reconstruction[J].IEEETransactions on Information Theory,2009,55(5):2230-2249.
[2] 楊真真,楊震,孫林慧.信號壓縮重構的正交匹配追蹤類算法綜述[J]. 信號處理,2013,29(4):486-496.
