浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)
主要内容:
- SP的算法流程
- SP的MATLAB实现
- 一维信号的实验与结果
- 测量数M与重构成功概率关系的实验与结果
- SP与CoSaMP的性能比较
一、SP的算法流程
压缩采样匹配追踪(CoSaMP)与子空间追踪(SP)几乎完全一样,因此算法流程也基本一致。
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,"。

SP的算法流程:

这个算法流程的初始化(Initialization)其实就是类似于CoSaMP的第1次迭代,注意第(1)步中选择了K个原子:"K indices corresponding to the largest magnitude entries",在CoSaMP里这里要选择2K个最大的原子,后面的其它流程都一样。这里第(5)步增加了一个停止迭代的条件:当残差经过迭代后却变大了的时候就停止迭代。
具体的算法步骤与浅谈压缩感知(二十三):压缩感知重构算法之压缩采样匹配追踪(CoSaMP)一致,只需将第(2)步中的2K改为K即可。
"贪婪类算法虽然复杂度低运行速度快,但其重构精度却不如BP类算法,为了寻求复杂度和精度更好地折中,SP算法应运而生","SP算法与CoSaMP算法一样其基本思想也是借用回溯的思想,在每步迭代过程中重新估计所有候选者的可信赖性","SP算法与CoSaMP算法有着类似的性质与优缺点"。
二、SP的MATLAB实现(CS_SP.m)
function [ theta ] = CS_SP( y,A,K )
% CS_SP
% 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,
% ,():-.
[m,n] = size(y);
if m<n
y = y'; %y should be a column vector
end
[M,N] = size(A); %传感矩阵A为M*N矩阵
theta = zeros(N,); %用来存储恢复的theta(列向量)
pos_num = []; %用来迭代过程中存储A被选择的列序号
res = y; %初始化残差(residual)为y
for kk=:K %最多迭代K次
%() Identification
product = A'*res; %传感矩阵A各列与残差的内积
[val,pos]=sort(abs(product),'descend');
Js = pos(:K); %选出内积值最大的K列
%() Support Merger
Is = union(pos_num,Js); %Pos_theta与Js并集
%() Estimation
%At的行数要大于列数,此为最小二乘的基础(列线性无关)
if length(Is)<=M
At = A(:,Is); %将A的这几列组成矩阵At
else %At的列数大于行数,列必为线性相关的,At'*At将不可逆
break; %跳出for循环
end
%y=At*theta,以下求theta的最小二乘解(Least Square)
theta_ls = (At'*At)^(-1)*At'*y; %最小二乘解
%() Pruning
[val,pos]=sort(abs(theta_ls),'descend');
%() Sample Update
pos_num = Is(pos(:K));
theta_ls = theta_ls(pos(:K));
%At(:,pos(:K))*theta_ls是y在At(:,pos(:K))列空间上的正交投影
res = y - At(:,pos(:K))*theta_ls; %更新残差
if norm(res)<1e- %Repeat the steps until r=
break; %跳出for循环
end
end
theta(pos_num)=theta_ls; %恢复出的theta
end
三、一维信号的实验与结果
%压缩感知重构算法测试
clear all;close all;clc;
M = ; %观测值个数
N = ; %信号x的长度
K = ; %信号x的稀疏度
Index_K = randperm(N);
x = zeros(N,);
x(Index_K(:K)) = *randn(K,); %x为K稀疏的,且位置是随机的
Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
Phi = randn(M,N); %测量矩阵为高斯矩阵
A = Phi * Psi; %传感矩阵
y = Phi * x; %得到观测向量y %% 恢复重构信号x
tic
theta = CS_SP( y,A,K );
x_r = Psi * theta; % x=Psi * theta
toc %% 绘图
figure;
plot(x_r,'k.-'); %绘出x的恢复信号
hold on;
plot(x,'r'); %绘出原信号x
hold off;
legend('Recovery','Original')
fprintf('\n恢复残差:');
norm(x_r-x) %恢复残差

四、测量数M与重构成功概率关系的实验与结果
clear all;close all;clc; %% 参数配置初始化
CNT = ; %对于每组(K,M,N),重复迭代次数
N = ; %信号x的长度
Psi = eye(N); %x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
K_set = [,,,,]; %信号x的稀疏度集合
Percentage = zeros(length(K_set),N); %存储恢复成功概率 %% 主循环,遍历每组(K,M,N)
tic
for kk = :length(K_set)
K = K_set(kk); %本次稀疏度
M_set = *K::N; %M没必要全部遍历,每隔5测试一个就可以了
PercentageK = zeros(,length(M_set)); %存储此稀疏度K下不同M的恢复成功概率
for mm = :length(M_set)
M = M_set(mm); %本次观测值个数
fprintf('K=%d,M=%d\n',K,M);
P = ;
for cnt = :CNT %每个观测值个数均运行CNT次
Index_K = randperm(N);
x = zeros(N,);
x(Index_K(:K)) = *randn(K,); %x为K稀疏的,且位置是随机的
Phi = randn(M,N)/sqrt(M); %测量矩阵为高斯矩阵
A = Phi * Psi; %传感矩阵
y = Phi * x; %得到观测向量y
theta = CS_SP(y,A,K); %恢复重构信号theta
x_r = Psi * theta; % x=Psi * theta
if norm(x_r-x)<1e- %如果残差小于1e-6则认为恢复成功
P = P + ;
end
end
PercentageK(mm) = P/CNT*; %计算恢复概率
end
Percentage(kk,:length(M_set)) = PercentageK;
end
toc
save SPMtoPercentage1000 %运行一次不容易,把变量全部存储下来 %% 绘图
S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
figure;
for kk = :length(K_set)
K = K_set(kk);
M_set = *K::N;
L_Mset = length(M_set);
plot(M_set,Percentage(kk,:L_Mset),S(kk,:));%绘出x的恢复信号
hold on;
end
hold off;
xlim([ ]);
legend('K=4','K=12','K=20','K=28','K=36');
xlabel('Number of measurements(M)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

五、SP与CoSaMP的性能比较
分别运行SP和CoSaMP中的"测量数M与重构成功概率关系的实验与结果"后,将相关变量load进来,并画在同一张图上,即可看出孰优孰劣。
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 = :length(K_set)
K = K_set(kk);
M_set = *K::N;
L_Mset = length(M_set);
plot(M_set,PercentageCoSaMP(kk,:L_Mset),S1(kk,:));%绘出x的恢复信号
hold on;
plot(M_set,PercentageSP(kk,:L_Mset),S2(kk,:));%绘出x的恢复信号
end
hold off;
xlim([ ]);
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)');
结论:从总体上看,SP优于CoSaMP(尤其是在M较小的时候)

六、参考文章
http://blog.csdn.net/jbb0523/article/details/45441459
浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)的更多相关文章
- 压缩感知重构算法之子空间追踪(SP)
		SP的提出时间比CoSaMP提出时间稍晚一些,但和压缩采样匹配追踪(CoSaMP)的方法几乎是一样的.SP与CoSaMP主要区别在于“In each iteration, in the SP algo ... 
- 浅谈Kotlin(二):基本类型、基本语法、代码风格
		浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ... 
- Bootstrap<基础二十四> 缩略图
		Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ... 
- 二十四、Struts2中的UI标签
		二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ... 
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
		原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ... 
- VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机
		VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ... 
- Bootstrap入门(二十四)data属性
		Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ... 
- 3360: [Usaco2004 Jan]算二十四
		3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6 Solved: 6[Submit][Statu ... 
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
		JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ... 
随机推荐
- uva11610 树状数组+素数打表求因子,好题!
			/* uva11610 树状数组+素数打表+离散化 打出的素数范围在2-1000000之间,不超过六位数,然后按照格式翻转成七位数 */ #include<bits/stdc++.h> u ... 
- hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)
			n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ... 
- [CQOI2017]老C的任务
			题解: 裸的主席树吧 要想避免带修主席树的话先排序一下吧 
- 记录weiye项目上线遇到的一些问题
			1.使用vpn访问客户内网 参考:http://jingyan.baidu.com/article/a3f121e4f9903cfc9052bb0b.html 2.设置使用ip地址直接访问项目(之后可 ... 
- K8s创建pod yaml文件详解
			kubernetes创建pod的yaml文件,参数说明 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 ... 
- BZOJ1073 [SCOI2007]kshort  K短路,A*
			欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ... 
- 什么是AOP?
			AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和 ... 
- 【java并发核心二】Exchanger的使用
			类 Exchanger 的功能可以使2个线程之间传输数据,比生产者/消费者模式方便. Exchanger类的结构很简单,重点就是exchange()方法. exchange()方法是阻塞执行的,可以设 ... 
- DB2<RedHed Linux> 创建数据库
			1 DB2 安装后组情况 Users User Desc Username Home folder Password Group Administration User -dasusr1 /hom ... 
- SQLite中的SELECT子句使用表达式
			SQLite中的SELECT子句使用表达式 在SELECT语句中可以只有SELECT子句不写FROM子句.这些表达式列表将被单次计算,生成一行,然后组成工作表.这对于测试和判断独立表达式很有用.例如, ... 
