压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法。CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了原子的选择标准之外,它有一点不同于ROMP:ROMP每次迭代已经选择的原子会一直保留,而CoSaMP每次迭代选择的原子在下次迭代中可能会被抛弃
在这之前先读了下参考论文[1],论文前面还是看得懂一点的,讲了一些压缩感知的基础知识,还聊到了压缩重构方法主要分为三类,但是到了第2部分介绍算法的时候又看不懂了,感觉符号都还没聊清楚就开始讲流程了。佩服看得懂的博主,还说很容易就看懂了。。。希望自己好好努力也能看懂这些外文文献,fighting啦!
那么我先把论文中的流程贴出来,并没有对符号作过多的解释。。。  supp(x)表示x的支撑集

          

然后在网上找到了符合论文中符号的代码。

  1. function Sest = cosaomp(Phi,u,K,tol,maxiterations)
  2. Sest = zeros(size(Phi,2),1);
  3. v = u;
  4. t = 1;
  5. numericalprecision = 1e-12;
  6. T = [];
  7. while (t <= maxiterations) && (norm(v)/norm(u) > tol)
  8. y = abs(Phi'*v);
  9. [vals,z] = sort(y,'descend');
  10. Omega = find(y >= vals(2*K) & y > numericalprecision);
  11. T = union(Omega,T);
  12. b = pinv(Phi(:,T))*u;
  13. [vals,z] = sort(abs(b),'descend');
  14. Kgoodindices = (abs(b) >= vals(K) & abs(b) > numericalprecision);
  15. T = T(Kgoodindices);
  16. Sest = zeros(size(Phi,2),1);
  17. phit = Phi(:,T);
  18. b = pinv(phit)*u;
  19. Sest(T) = b;
  20. v = u - phit*b;
  21. t = t+1;
  22. end

接下来综合代码我准备强行解释一波论文算法的伪代码流程,哎呀半懂半懂希望以后要全懂全懂。

1.Identification(识别)
大意是说要构造一个signal proxy,在伪代码中构造signal proxy是y=Phi*v,下图是从论文中摘出来的,突然明白了这段话的意思,首先翻译一下。信号重构的最大难点在于找到目标信号中这些最大项所在的位置。CoSaOMP受到RIP的启发,假设字典矩阵的RIP常数为远远小于1的一个值,对s稀疏的信号x,y=Phi*Phi x可以作为信号的一个代理。因为y的每一个s向量的结合的能量与信号x中s个向量的能量相对应。(我觉得这里的Phi应该是理解为字典矩阵的,因为计算内积的时候我们是选择将字典矩阵与残差相乘,残差初始化为观测向量也就是Phi*x)。这一步对应着代码的第8行。
接着是伪代码中所说的Identify large components,也就是找到内积值中最大的2K项,复制给Ω,对应上述代码的第10行。
2.Support Merger(合并支撑集)
代码第11行。
3.Estimation
这里是求解一个最小二乘问题,pinv是求伪逆矩阵。
“b|Tc←0”中的“Tc”应该是T的补集(complementary set),向量b的元素序号为全集,子集T对应的元素等于最小二乘解,补集对应的元素为零。
4.Pruning(修剪)
代码第13行,选出b中K个最大项。
5.Sample Update(更新)

强行解释结束了,接下来贴出博主的解释。

1、CoSaMP重构算法流程

步骤(5)稍微有点绕,综合代码理解一下还是不难的。

2、压缩采样匹配追踪(CoSaOMP)Matlab代码(CS_CoSaMP.m)

  1. function [ theta ] = CS_CoSaMP( y,A,K )
  2. %CS_CoSaOMP Summary of this function goes here
  3. %Created by jbb0523@@2015-04-29
  4. %Version: 1.1 modified by jbb0523 @2015-05-09
  5. % Detailed explanation goes here
  6. % y = Phi * x
  7. % x = Psi * theta
  8. % y = Phi*Psi * theta
  9. % A = Phi*Psi, y=A*theta
  10. % K is the sparsity level
  11. % 现在已知yA,求theta
  12. % Reference:Needell DTropp J ACoSaMPIterative signal recovery from
  13. % incomplete and inaccurate samples[J].Applied and Computation Harmonic
  14. % Analysis200926301-321.
  15. [y_rows,y_columns] = size(y);
  16. if y_rows<y_columns
  17. y = y';%y should be a column vector
  18. end
  19. [M,N] = size(A);%传感矩阵A为M*N矩阵
  20. theta = zeros(N,1);%用来存储恢复的theta(列向量)
  21. Pos_theta = [];%用来迭代过程中存储A被选择的列序号
  22. r_n = y;%初始化残差(residual)为y
  23. for kk=1:K%最多迭代K次
  24. %(1) Identification
  25. product = A'*r_n;%传感矩阵A各列与残差的内积
  26. [val,pos]=sort(abs(product),'descend');
  27. Js = pos(1:2*K);%选出内积值最大的2K
  28. %(2) Support Merger
  29. Is = union(Pos_theta,Js);%Pos_thetaJs并集
  30. %(3) Estimation
  31. %At的行数要大于列数,此为最小二乘的基础(列线性无关)
  32. if length(Is)<=M
  33. At = A(:,Is);%将A的这几列组成矩阵At
  34. else%At的列数大于行数,列必为线性相关的,At'*At将不可逆
  35. if kk == 1
  36. theta_ls = 0;
  37. end
  38. break;%跳出for循环
  39. end
  40. %y=At*theta,以下求theta的最小二乘解(Least Square)
  41. theta_ls = (At'*At)^(-1)*At'*y;%最小二乘解
  42. %(4) Pruning
  43. [val,pos]=sort(abs(theta_ls),'descend');
  44. %(5) Sample Update
  45. Pos_theta = Is(pos(1:K));
  46. theta_ls = theta_ls(pos(1:K));
  47. %At(:,pos(1:K))*theta_ls是y在At(:,pos(1:K))列空间上的正交投影
  48. r_n = y - At(:,pos(1:K))*theta_ls;%更新残差
  49. if norm(r_n)<1e-6%Repeat the steps until r=0
  50. break;%跳出for循环
  51. end
  52. end
  53. theta(Pos_theta)=theta_ls;%恢复出的theta
  54. end

3、CoSaMP单次重构测试代码

以下测试代码基本与OMP单次重构测试代码一样。
  1. %压缩感知重构算法测试
  2. clear all;close all;clc;
  3. M = 64;%观测值个数
  4. N = 256;%信号x的长度
  5. K = 12;%信号x的稀疏度
  6. Index_K = randperm(N);
  7. x = zeros(N,1);
  8. x(Index_K(1:K)) = 5*randn(K,1);%xK稀疏的,且位置是随机的
  9. Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
  10. Phi = randn(M,N);%测量矩阵为高斯矩阵
  11. A = Phi * Psi;%传感矩阵
  12. y = Phi * x;%得到观测向量y
  13. %% 恢复重构信号x
  14. tic
  15. theta = CS_CoSaMP( y,A,K );
  16. x_r = Psi * theta;% x=Psi * theta
  17. toc
  18. %% 绘图
  19. figure;
  20. plot(x_r,'k.-');%绘出x的恢复信号
  21. hold on;
  22. plot(x,'r');%绘出原信号x
  23. hold off;
  24. legend('Recovery','Original')
  25. fprintf('\n恢复残差:');
  26. norm(x_r-x)%恢复残差

运行结果如下:(信号为随机生成,所以每次结果均不一样)

 1)图:
2)Command  windows
      Elapsedtime is 0.073375 seconds.
      恢复残差:
      ans=
          7.3248e-015

4、测量数M与重构成功概率关系曲线绘制例程代码

以下测试代码基本与OMP测量数M与重构成功概率关系曲线绘制代码一样。增加了“fprintf('K=%d,M=%d\n',K,M);”,可以观察程序运行进度。
  1. clear all;close all;clc;
  2. %% 参数配置初始化
  3. CNT = 1000;%对于每组(K,M,N),重复迭代次数
  4. N = 256;%信号x的长度
  5. Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
  6. K_set = [4,12,20,28,36];%信号x的稀疏度集合
  7. Percentage = zeros(length(K_set),N);%存储恢复成功概率
  8. %% 主循环,遍历每组(K,M,N)
  9. tic
  10. for kk = 1:length(K_set)
  11. K = K_set(kk);%本次稀疏度
  12. M_set = 2*K:5:N;%M没必要全部遍历,每隔5测试一个就可以了
  13. PercentageK = zeros(1,length(M_set));%存储此稀疏度K下不同M的恢复成功概率
  14. for mm = 1:length(M_set)
  15. M = M_set(mm);%本次观测值个数
  16. fprintf('K=%d,M=%d\n',K,M);
  17. P = 0;
  18. for cnt = 1:CNT %每个观测值个数均运行CNT
  19. Index_K = randperm(N);
  20. x = zeros(N,1);
  21. x(Index_K(1:K)) = 5*randn(K,1);%xK稀疏的,且位置是随机的
  22. Phi = randn(M,N)/sqrt(M);%测量矩阵为高斯矩阵
  23. A = Phi * Psi;%传感矩阵
  24. y = Phi * x;%得到观测向量y
  25. theta = CS_CoSaMP(y,A,K);%恢复重构信号theta
  26. x_r = Psi * theta;% x=Psi * theta
  27. if norm(x_r-x)<1e-6%如果残差小于1e-6则认为恢复成功
  28. P = P + 1;
  29. end
  30. end
  31. PercentageK(mm) = P/CNT*100;%计算恢复概率
  32. end
  33. Percentage(kk,1:length(M_set)) = PercentageK;
  34. end
  35. toc
  36. save CoSaMPMtoPercentage1000 %运行一次不容易,把变量全部存储下来
  37. %% 绘图
  38. S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
  39. figure;
  40. for kk = 1:length(K_set)
  41. K = K_set(kk);
  42. M_set = 2*K:5:N;
  43. L_Mset = length(M_set);
  44. plot(M_set,Percentage(kk,1:L_Mset),S(kk,:));%绘出x的恢复信号
  45. hold on;
  46. end

本程序运行结果:

最后摘出文献[4]中关于ROMP优缺点的分析:
ROMP 算法虽具有贪婪算法的速度以及凸优化算法的强有力的理论保证,但其与StOMP 算法一样,对稀疏度K 的依赖性太大,稀疏度估计的准确与否,将会影响到算法的收敛性、收敛速度、鲁棒性以及重构信号的性能。针对此缺点,提出了正则化自适应匹配追踪( Regularized adaptive matching pursuit,RAMP) 算法,该算法将ROMP 算法进行改进,引入回溯的思想,自适应调节候选集原子的数目。
CoSaMP 算法为了提高算法的收敛速度和算法效率,通过回溯的思想从原子库里选择多个相关原子同时剔除部分不相关原子。设算法的迭代步长为K,候选集中最多有3K 个原子,每次最多剔除K个原子,以保证支撑集中有2K 个原子。CoSaMP 算法虽结合了组合算法的思想保证了算法的收敛速度,而且提供了严格的误差界,但其与ROMP 算法一样需要已知信号的稀疏度K。然而实际应用中的信号往往是近似稀疏的,其稀疏度K需要去估计。如果低估了K 的值,算法精确重构的能力会下降甚至可能会消除,导致算法不再收敛;若高估了K 的值,算法的鲁棒性和重构精度都将会下降,使得重构的信号的误差增大,导致最终重构得到的信号失真。此外,CoSaMP 算法每步迭代时增加与剔除原子所依据的原则不一样,增加原子时依据的是原子与余量的相关性原则,剔除原子时依据的是重构信号的大小,标准的不同可能会导致对支撑集的估计不准确。针对第一个问题,仍可以采取改变信号的稀疏度,多次运行,使得重构精度最高的稀疏度即作为信号的稀疏度的思想,也可以引入回溯思想自适应选择原子。针对第二个问题,可以改变剔除原子的标准,采用依据原子与余量的相关性原则,剔除相关性小的原子,使得每步迭代时增加与剔除原子所依据的标准一样。
 
参考文献:
[1]D. Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples.http://arxiv.org/pdf/0803.2392v2.pdf
[2]D.Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples[J]. Communications of theACM,2010,53(12):93-100.
(http://dl.acm.org/citation.cfm?id=1859229)
[4] 杨真真,杨震,孙林慧.信号压缩重构的正交匹配追踪类算法综述[J]. 信号处理,2013,29(4):486-496.

压缩感知重构算法之压缩采样匹配追踪(CoSaMP)的更多相关文章

  1. [转]压缩感知重构算法之分段正交匹配追踪(StOMP)

    分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的 ...

  2. 浅谈压缩感知(二十八):压缩感知重构算法之广义正交匹配追踪(gOMP)

    主要内容: gOMP的算法流程 gOMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.gOMP的算法流程 广义正交匹配追踪(Generalized OMP, g ...

  3. 浅谈压缩感知(二十五):压缩感知重构算法之分段正交匹配追踪(StOMP)

    主要内容: StOMP的算法流程 StOMP的MATLAB实现 一维信号的实验与结果 门限参数Ts.测量数M与重构成功概率关系的实验与结果 一.StOMP的算法流程 分段正交匹配追踪(Stagewis ...

  4. 浅谈压缩感知(二十二):压缩感知重构算法之正则化正交匹配追踪(ROMP)

    主要内容: ROMP的算法流程 ROMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 一.ROMP的算法流程 正则化正交匹配追踪ROMP算法流程与OMP的最大不同之 ...

  5. 浅谈压缩感知(二十三):压缩感知重构算法之压缩采样匹配追踪(CoSaMP)

    主要内容: CoSaMP的算法流程 CoSaMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 一.CoSaMP的算法流程 压缩采样匹配追踪(CompressiveS ...

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

    SP的提出时间比CoSaMP提出时间稍晚一些,但和压缩采样匹配追踪(CoSaMP)的方法几乎是一样的.SP与CoSaMP主要区别在于“In each iteration, in the SP algo ...

  7. 浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)

    主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子 ...

  8. 浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)

    主要内容: SWOMP的算法流程 SWOMP的MATLAB实现 一维信号的实验与结果 门限参数a.测量数M与重构成功概率关系的实验与结果 SWOMP与StOMP性能比较 一.SWOMP的算法流程 分段 ...

  9. 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)

    主要内容: OMP的算法流程 OMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.OMP的算法流程 二.OMP的MATL ...

随机推荐

  1. OSGi-开发环境的建立和HelloWorld(04)

    1 OSGi开发环境的建立 1.1 Equinox是什么 从代码角度来看,Equinox其实就是OSGi核心标准的完整实现,并且还在这个基础上增加了一些额外的功能(比如为框架增加了命令行和程序执行的入 ...

  2. 高德地图markers生成和点击

    因为自己平时上班也是比较忙,遇到什么写什么,希望能给现在的你一些帮助,都是自己在工作中遇到的问题,给自己一个提醒,也是分享 相信很多人在做高德地图开发的时候,对于新手,官方的demo解读单个marke ...

  3. Markdown使用简单示例

    标题示例: 标题一 #标题一 标题二 #标题二 标题三 ###标题三 标题四 ####标题四 标题五 #####标题五 标题六 ######标题六 连接示例 [![License](图片地址)](跳转 ...

  4. python 部署 Restful web

    使用python web做Restful 风格,很简单,采用Flask框架轻松实现一个RESTful的服务. Restful相关介绍请查看:https://www.ibm.com/developerw ...

  5. oracle pl/sql 基础

    一.pl/sql developer开发工具pl/sql developer是用于开发pl/sql块的集成开发环境(ide),它是一个独立的产品,而不是oracle的一个附带品. 二.pl/sql介绍 ...

  6. Apache Spark 2.2.0 中文文档 - Submitting Applications | ApacheCN

    Submitting Applications 在 script in Spark的 bin 目录中的spark-submit 脚本用与在集群上启动应用程序.它可以通过一个统一的接口使用所有 Spar ...

  7. 策略模式Strategy

    定义一系列的算法,把他们封装起来,使得算法独立于适用对象. 比如,一个系统有很多的排序算法,但是使用哪个排序算法是客户对象的自有.因此把每一个排序当做一个策略对象,客户调用哪个对象,就使用对应的策略方 ...

  8. Mybatis #{ } 和 ${ } 区别

    动态 SQL 是 Mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因.Mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql ...

  9. uvalive 3029 City Game

    https://vjudge.net/problem/UVALive-3029 题意: 给出一个只含有F和R字母的矩阵,求出全部为F的面积最大的矩阵并且输出它的面积乘以3. 思路: 求面积最大的子矩阵 ...

  10. FPGA在电平接口领域的应用

    电子技术的发展,产生了各种各样的电平接口. TTL电平: TTL电平信号之所以被广泛使用,原因是因为:通常我们采用二进制来表示数据.而且规定,+5V等价于逻辑"1",0V等价于逻辑 ...