壓縮感知重構(gòu)算法之廣義正交匹配追蹤
主要內(nèi)容:
gOMP的算法流程gOMP的MATLAB實(shí)現(xiàn)一維信號的實(shí)驗(yàn)與結(jié)果稀疏度K與重構(gòu)成功概率關(guān)系的實(shí)驗(yàn)與結(jié)果。
一、gOMP的算法流程
廣義正交匹配追蹤(Generalized OMP, gOMP)算法可以看作為OMP算法的一種推廣。OMP每次只選擇與殘差相關(guān)最大的一個,而gOMP則是簡單地選擇最大的S個。之所以這里表述為"簡單地選擇"是相比于ROMP之類算法的,不進(jìn)行任何其它處理,只是選擇最大的S個而已。
gOMP的算法流程:
二、gOMP的MATLAB實(shí)現(xiàn)(CS_gOMP.m)
function?[?theta?]?=?CS_gOMP(?y,A,K,S?) %???CS_gOMP %???Detailed?explanation?goes?here %???y?=?Phi?*?x %???x?=?Psi?*?theta %????y?=?Phi*Psi?*?theta %???令?A?=?Phi*Psi,?則y=A*theta %???現(xiàn)在已知y和A,求theta %???Reference:?Jian?Wang,?Seokbeop?Kwon,?Byonghyo?Shim.??Generalized? %???orthogonal?matching?pursuit,?IEEE?Transactions?on?Signal?Processing,? %???vol.?60,?no.?12,?pp.?6202-6216,?Dec.?2012.? %???Available?at:?http://islab.snu.ac.kr/paper/tsp_gOMP.pdf ????if?nargin?<?4 ????????S?=?round(max(K/4,?1)); ????end ????[y_rows,y_columns]?=?size(y); ????if?y_rowsM ????????????if?ii?==?1 ????????????????theta_ls?=?0; ????????????end ????????????break; ????????end ????????At?=?A(:,Sk);%將A的這幾列組成矩陣At ????????%y=At*theta,以下求theta的最小二乘解(Least?Square) ????????theta_ls?=?(At'*At)^(-1)*At'*y;%最小二乘解 ????????%At*theta_ls是y在At)列空間上的正交投影 ????????r_n?=?y?-?At*theta_ls;%更新殘差 ????????Pos_theta?=?Sk; ????????if?norm(r_n)<1e-6 ????????????break;%quit?the?iteration ????????end ????end ????theta(Pos_theta)=theta_ls;%恢復(fù)出的theta end
三、一維信號的實(shí)驗(yàn)與結(jié)果
%壓縮感知重構(gòu)算法測試
clear?all;close?all;clc;
M?=?128;%觀測值個數(shù)
N?=?256;%信號x的長度
K?=?30;%信號x的稀疏度
Index_K?=?randperm(N);
x?=?zeros(N,1);
x(Index_K(1:K))?=?5*randn(K,1);%x為K稀疏的,且位置是隨機(jī)的
Psi?=?eye(N);%x本身是稀疏的,定義稀疏矩陣為單位陣x=Psi*theta
Phi?=?randn(M,N)/sqrt(M);%測量矩陣為高斯矩陣
A?=?Phi?*?Psi;%傳感矩陣
y?=?Phi?*?x;%得到觀測向量y
%%?恢復(fù)重構(gòu)信號x
tic
theta?=?CS_gOMP(?y,A,K);
x_r?=?Psi?*?theta;%?x=Psi?*?theta
toc
%%?繪圖
figure;
plot(x_r,'k.-');%繪出x的恢復(fù)信號
hold?on;
plot(x,'r');%繪出原信號x
hold?off;
legend('Recovery','Original')
fprintf('n恢復(fù)殘差:');
norm(x_r-x)%恢復(fù)殘差四、稀疏數(shù)K與重構(gòu)成功概率關(guān)系的實(shí)驗(yàn)與結(jié)果
%???壓縮感知重構(gòu)算法測試CS_Reconstuction_KtoPercentagegOMP.m
%???Reference:?Jian?Wang,?Seokbeop?Kwon,?Byonghyo?Shim.??Generalized?
%???orthogonal?matching?pursuit,?IEEE?Transactions?on?Signal?Processing,?
%???vol.?60,?no.?12,?pp.?6202-6216,?Dec.?2012.?
%???Available?at:?http://islab.snu.ac.kr/paper/tsp_gOMP.pdf
clear?all;close?all;clc;
addpath(genpath('../../OMP/'))
%%?參數(shù)配置初始化
CNT?=?1000;?%對于每組(K,M,N),重復(fù)迭代次數(shù)
N?=?256;?%信號x的長度
Psi?=?eye(N);?%x本身是稀疏的,定義稀疏矩陣為單位陣x=Psi*theta
M_set?=?[128];?%測量值集合
KIND?=?['OMP??????';'ROMP?????';'StOMP????';'SP???????';'CoSaMP???';...
????'gOMP(s=3)';'gOMP(s=6)';'gOMP(s=9)'];
Percentage?=?zeros(N,length(M_set),size(KIND,1));?%存儲恢復(fù)成功概率
%%?主循環(huán),遍歷每組(K,M,N)
tic
for?mm?=?1:length(M_set)
????M?=?M_set(mm);?%本次測量值個數(shù)
????K_set?=?5:5:70;?%信號x的稀疏度K沒必要全部遍歷,每隔5測試一個就可以了
????%存儲此測量值M下不同K的恢復(fù)成功概率
????PercentageM?=?zeros(size(KIND,1),length(K_set));
????for?kk?=?1:length(K_set)
???????K?=?K_set(kk);?%本次信號x的稀疏度K
???????P?=?zeros(1,size(KIND,1));
???????fprintf('M=%d,K=%dn',M,K);
???????for?cnt?=?1:CNT??%每個觀測值個數(shù)均運(yùn)行CNT次
????????????Index_K?=?randperm(N);
????????????x?=?zeros(N,1);
????????????x(Index_K(1:K))?=?5*randn(K,1);?%x為K稀疏的,且位置是隨機(jī)的????????????????
????????????Phi?=?randn(M,N)/sqrt(M);?%測量矩陣為高斯矩陣
????????????A?=?Phi?*?Psi;?%傳感矩陣
????????????y?=?Phi?*?x;?%得到觀測向量y
????????????%(1)OMP
????????????theta?=?CS_OMP(y,A,K);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(1)?=?P(1)?+?1;
????????????end
????????????%(2)ROMP
????????????theta?=?CS_ROMP(y,A,K);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(2)?=?P(2)?+?1;
????????????end
????????????%(3)StOMP
????????????theta?=?CS_StOMP(y,A);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(3)?=?P(3)?+?1;
????????????end
????????????%(4)SP
????????????theta?=?CS_SP(y,A,K);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(4)?=?P(4)?+?1;
????????????end
????????????%(5)CoSaMP
????????????theta?=?CS_CoSaMP(y,A,K);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(5)?=?P(5)?+?1;
????????????end
????????????%(6)gOMP,S=3
????????????theta?=?CS_gOMP(y,A,K,3);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(6)?=?P(6)?+?1;
????????????end
????????????%(7)gOMP,S=6
????????????theta?=?CS_gOMP(y,A,K,6);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(7)?=?P(7)?+?1;
????????????end
????????????%(8)gOMP,S=9
????????????theta?=?CS_gOMP(y,A,K,9);?%恢復(fù)重構(gòu)信號theta
????????????x_r?=?Psi?*?theta;?%?x=Psi?*?theta
????????????if?norm(x_r-x)<1e-6?%如果殘差小于1e-6則認(rèn)為恢復(fù)成功
????????????????P(8)?=?P(8)?+?1;
????????????end
???????end
???????for?iii?=?1:size(KIND,1)
???????????PercentageM(iii,kk)?=?P(iii)/CNT*100;?%計(jì)算恢復(fù)概率
???????end
????end
????for?jjj?=?1:size(KIND,1)
????????Percentage(1:length(K_set),mm,jjj)?=?PercentageM(jjj,:);
????end
end
toc
save?KtoPercentage1000gOMP?%運(yùn)行一次不容易,把變量全部存儲下來
%%?繪圖
S?=?['-ks';'-ko';'-yd';'-gv';'-b*';'-r.';'-rx';'-r+'];
figure;
for?mm?=?1:length(M_set)
????M?=?M_set(mm);
????K_set?=?5:5:70;
????L_Kset?=?length(K_set);
????for?ii?=?1:size(KIND,1)
????????plot(K_set,Percentage(1:L_Kset,mm,ii),S(ii,:));?%繪出x的恢復(fù)信號
????????hold?on;
????end
end
hold?off;
xlim([5?70]);
legend('OMP','ROMP','StOMP','SP','CoSaMP',...
????'gOMP(s=3)','gOMP(s=6)','gOMP(s=9)');
xlabel('Sparsity?level?K');
ylabel('The?Probability?of?Exact?Reconstruction');
title('Prob.?of?exact?recovery?vs.?the?signal?sparsity?K(M=128,N=256)(Gaussian)');結(jié)論:gOMP只是在OMP基礎(chǔ)上修改了一下原子選擇的個數(shù),效果就好很多。





