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即可。
  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. % 现在已知yA,求theta
  11. % Reference:Dai WMilenkovic OSubspace pursuit for compressive sensing
  12. % signal reconstruction[J].IEEE Transactions on Information Theory
  13. % 200955(5):2230-2249.
  14. [y_rows,y_columns] = size(y);
  15. if y_rows<y_columns
  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_thetaJs并集
  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
  41. Pos_theta = Is(pos(1:K));
  42. theta_ls = theta_ls(pos(1:K));
  43. %At(:,pos(1:K))*theta_ls是y在At(:,pos(1:K))列空间上的正交投影
  44. r_n = y - At(:,pos(1:K))*theta_ls;%更新残差
  45. if norm(r_n)<1e-6%Repeat the steps until r=0
  46. break;%跳出for循环
  47. end
  48. end
  49. theta(Pos_theta)=theta_ls;%恢复出的theta
  50. end
鉴于SP与CoSaMP的极其相似性,这里就不再给出单次重构和测量数M与重构成功概率关系曲线绘制例程代码了,只需将CoSaMP中调用CS_CoSaMP函数的部分改为调用CS_SP即可,无须任何其它改动。这里给出对比两种重构算法所绘制的测量数M与重构成功概率关系曲线的例程代码,只有这样才可以看出两种算法的重构性能优劣,以下是在分别运行完SP与CoSaMP的测量数M与重构成功概率关系曲线绘制例程代码的基础上,即已经存储了数据CoSaMPMtoPercentage1000.mat和SPMtoPercentage1000.mat:

  1. clear all;close all;clc;
  2. load CoSaMPMtoPercentage1000;
  3. PercentageCoSaMP = Percentage;
  4. load SPMtoPercentage1000;
  5. PercentageSP = Percentage;
  6. S1 = ['-ks';'-ko';'-kd';'-kv';'-k*'];
  7. S2 = ['-rs';'-ro';'-rd';'-rv';'-r*'];
  8. figure;
  9. for kk = 1:length(K_set)
  10. K = K_set(kk);
  11. M_set = 2*K:5:N;
  12. L_Mset = length(M_set);
  13. plot(M_set,PercentageCoSaMP(kk,1:L_Mset),S1(kk,:));%绘出x的恢复信号
  14. hold on;
  15. plot(M_set,PercentageSP(kk,1:L_Mset),S2(kk,:));%绘出x的恢复信号
  16. end
  17. hold off;
  18. xlim([0 256]);
  19. legend('CoSaK=4','SPK=4','CoSaK=12','SPK=12','CoSaK=20',...
  20. 'SPK=20','CoSaK=28','SPK=28','CoSaK=36','SPK=36');
  21. xlabel('Number of measurements(M)');
  22. ylabel('Percentage recovered');
  23. 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.

压缩感知重构算法之子空间追踪(SP)的更多相关文章

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

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

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

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

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

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

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

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

  5. 压缩感知重构算法之压缩采样匹配追踪(CoSaMP)

    压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法.CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了 ...

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

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

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

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

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

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

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

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

随机推荐

  1. linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

    linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表 ...

  2. 【京东账户】——Mysql/PHP/Ajax爬坑之页头页尾加载

    一.引言 实现京东的账户项目,有一个小功能,页头页尾加载.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.实现 原理: 用php文件分别写一个的页头和一个页尾,放在前后两个div里. ...

  3. 【京东账户】——Mysql/PHP/Ajax爬坑之购物车列表显示

    一.引言 做京东账户项目中的购物车模块,功能之二是购物车列表显示.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.小功能-点击“去购物车结算” 小坑:Ajax动态生成的不能直接绑定,因 ...

  4. 逆向实用干货分享,Hook技术第一讲,之Hook Windows API

    逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...

  5. append、extend与insert的区别

    最近在自学Python语言,看到向列表增加更多数据时被append(),extend(),insert()方法绕晕了. 作为编程0基础的小白,觉得有必要自己再梳理一遍: 1.append()方法是指在 ...

  6. 三、js的函数

    三.函数 函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 1.函数声 ...

  7. POJ1032 Parliament(数论)

    New convocation of The Fool Land's Parliament consists of N delegates. According to the present regu ...

  8. Java历程-初学篇 Day06 循环结构

    前记:永远不要写死循环 一,while循环 先判断,再执行 while(条件){ //代码块; 迭代; } 示例: 二,do while语句 先执行一次,再判断 do{ //代码块; 迭代; }whi ...

  9. C#实现断点续传

    断点续传的原理在了解HTTP断点续传的原理之前,先来说说HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种.请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时 ...

  10. 使用Grub Rescue 修复MBR

    ubuntu 14.04 (本机) 1.使用以下命令查看分区: grub rescure> ls            (hd0,msdos7),(hd0,msdos8),(hd0,msdos9 ...