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

2023-10-07 18:10

本文主要是介绍压缩感知重构算法之子空间追踪(SP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:压缩感知重构算法之子空间追踪(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 corresponding 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 plain copy
print ?
  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<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_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  
  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  
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_columnsy = y';%y should be a column vectorend[M,N] = size(A);%传感矩阵A为M*N矩阵theta = zeros(N,1);%用来存储恢复的theta(列向量)Pos_theta = [];%用来迭代过程中存储A被选择的列序号r_n = y;%初始化残差(residual)为yfor kk=1:K%最多迭代K次%(1) Identificationproduct = A'*r_n;%传感矩阵A各列与残差的内积[val,pos]=sort(abs(product),'descend');Js = pos(1:K);%选出内积值最大的K列%(2) Support MergerIs = union(Pos_theta,Js);%Pos_theta与Js并集%(3) Estimation%At的行数要大于列数,此为最小二乘的基础(列线性无关)if length(Is)<=MAt = A(:,Is);%将A的这几列组成矩阵Atelse%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 UpdatePos_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=0break;%跳出for循环endendtheta(Pos_theta)=theta_ls;%恢复出的theta
end
        鉴于SP与CoSaMP的极其相似性,这里就不再给出单次重构和测量数M与重构成功概率关系曲线绘制例程代码了,只需将CoSaMP中调用CS_CoSaMP函数的部分改为调用CS_SP即可,无须任何其它改动。这里给出对比两种重构算法所绘制的测量数M与重构成功概率关系曲线的例程代码,只有这样才可以看出两种算法的重构性能优劣,以下是在分别运行完SP与CoSaMP的测量数M与重构成功概率关系曲线绘制例程代码的基础上,即已经存储了数据CoSaMPMtoPercentage1000.mat和SPMtoPercentage1000.mat:
[plain] view plain copy
print ?
  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)');  
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. Subspace pursuitfor compressive sensing: Closing the gap between performance and complexity.http://arxiv.org/pdf/0803.0811v1.pdf

[2]Dai W,Milenkovic O.Subspacepursuit for compressive sensing signal reconstruction[J].IEEETransactions on Information Theory,2009,55(5):2230-2249.

[3]D. Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples. http://arxiv.org/pdf/0803.2392v2.pdf

[4]D. Needell, J.A. Tropp.CoSaMP: Iterative signal recoveryfrom incomplete and inaccurate samples. http://arxiv.org/pdf/0803.2392v1.pdf

[5]杨真真,杨震,孙林慧.信号压缩重构的正交匹配追踪类算法综述[J]. 信号处理,2013,29(4):486-496.

[6]Li Zeng. CS_Reconstruction. http://www.pudn.com/downloads518/sourcecode/math/detail2151378.html

这篇关于压缩感知重构算法之子空间追踪(SP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159540

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int