贪婪算法中,SP算法的原理介绍及MATLAB仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

压缩感知重构算法之子空间追踪(SP)

如果掌握了压缩采样匹配追踪(CoSaMP)后,再去学习子空间追踪(Subspace Pursuit)是一件非常简单的事情,因为它们几乎是完全一样的。

SP的提出时间比CoSaMP提出时间略晚,首个论文版本是参考文献[1],后来更新了两次,最后在IEEE Transactions on Information Theory发表[2]。从算法角度来讲,SP与CoSaMP差别非常小,这一点作者也意识到了,在文献[1]首页的左下角就有注释:

在文献[2]第2页提到了SP与CoSaMP的具体不同:

从上面可以知道,SP与CoSaMP主要区别在于“Ineach 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,”。

以下是文献[2]中的给出的SP算法流程:

这个算法流程的初始化(Initialization)其实就是类似于CoSaMP的第1次迭代,注意第(1)步中选择了K个原子:“K indices correspo nding to the largest magnitude entries”,在CoSaMP里这里要选择2K个最大的原子,后面的其它流程都一样。这里第(5)步增加了一个停止迭代的条件:当残差经过迭代后却变大了的时候就停止迭代。

不只是SP作者认识到了自己的算法与CoSaMP的高度相似性,CoSaMP的作者也同样关注到了SP算法,在文献[3]中就提到:

文献[3]是CoSaMP原始提出文献的第2个版本,文献[3]的早期版本[4]是没有提及SP算法的。

鉴于SP与CoSaMP如此相似,这里不就再单独给出SP的步骤了,参考《压缩感知重构算法之压缩采样匹配追踪(CoSaMP)》,只需将第(2)步中的2K改为K即可。

引用文献[5]的3.5节中的几句话:“贪婪类算法虽然复杂度低运行速度快,但其重构精度却不如BP类算法,为了寻求复杂度和精度更好地折中,SP算法应运而生”,“SP算法与CoSaMP算法一样其基本思想也是借用回溯的思想,在每步迭代过程中重新估计所有候选者的可信赖性”,“SP算法与CoSaMP算法有着类似的性质与优缺点”。

子空间追踪代码可实现如下(CS_SP.m),通过对比可以知道该程序与CoSaMP的代码基本完全一致。本代码未考虑文献[2]中的给出的SP算法流程的第(5)步。代码可参见参考文献[6]中的Demo_CS_SP.m。

[plain]view plaincopy

1.function [ theta ] = CS_SP( y,A,K )

2.%CS_SP Summary of this function goes here

3.%Version: 1.0 written by jbb0523 @2015-05-01

4.% Detailed explanation goes here

5.% y = Phi * x

6.% x = Psi * theta

7.% y = Phi*Psi * theta

8.% 令 A = Phi*Psi, 则y=A*theta

9.% K is the sparsity level

10.% 现在已知y和A,求theta

11.% Reference:Dai W,Milenkovic O.Subspace pursuit for compressive sensing

12.% signal reconstruction[J].IEEE Transactions on Information Theory,

13.% 2009,55(5):2230-2249.

14. [y_rows,y_columns] = size(y);

15. if y_rows

16. y = y';%y should be a column vector

17. end

18. [M,N] = size(A);%传感矩阵A为M*N矩阵

19. theta = zeros(N,1);%用来存储恢复的theta(列向量)

20. Pos_theta = [];%用来迭代过程中存储A被选择的列序号

21. r_n = y;%初始化残差(residual)为y

22. for kk=1:K%最多迭代K次

23. %(1) Identification

24. product = A'*r_n;%传感矩阵A各列与残差的内积

25. [val,pos]=sort(abs(product),'descend');

26. Js = pos(1:K);%选出内积值最大的K列

27. %(2) Support Merger

28. Is = union(Pos_theta,Js);%Pos_theta与Js并集

29. %(3) Estimation

30. %At的行数要大于列数,此为最小二乘的基础(列线性无关)

31. if length(Is)<=M

32. At = A(:,Is);%将A的这几列组成矩阵At

33. else%At的列数大于行数,列必为线性相关的,At'*At将不可逆

34. break;%跳出for循环

35. end

36. %y=At*theta,以下求theta的最小二乘解(Least Square)

37. theta_ls = (At'*At)^(-1)*At'*y;%最小二乘解

38. %(4) Pruning

39. [val,pos]=sort(abs(theta_ls),'descend');

40. %(5) Sample Update

相关文档
最新文档