之前所学习的论文中求解稀疏解的时候一般采用的都是最小二乘方法进行计算,为了降低计算复杂度和减少内存,这篇论文梯度追踪,属于贪婪算法中一种。主要为三种:梯度(gradient)、共轭梯度(conjugate gradient)、近似共轭梯度(an approximation to the conjugate gradient),看师兄之前做压缩感知的更新点就是使用近似共轭梯度方法代替了StOMP中的最小二乘的步骤。

首先说明一下论文中的符号表示:
Γn表示第n次迭代过程中所选择的原子的索引
ΦΓn表示Φ的一个子矩阵,即只包含索引在集合Γn中的那些列
gram matrix格拉姆矩阵
小写加粗字体用来表示向量,大写加粗字体表示矩阵,带下标的标准字体表示向量中的元素
论文的第II部分介绍了MP算法和OMP算法的流程。算法的基本思想是通过不断的迭代来逼近x,x在这篇论文中指的是观测向量,有x=Φy+ε,为方便起见,将符号改为常见形式:y=Φx+ε
通过逼近得到的为:
然后计算残差为:
每次迭代中残差用来决定从观测矩阵中选出最相关的原子。
MP的算法流程为:
解释一下给出的MP的算法流程,采用熟悉的符号代码来解释

OMP算法流程:
其中Φ+是矩阵Φ的伪逆矩阵。论文中采用梯度更新的方式来估计信号的近似解,采用来代替MP算法中的2c,其中dΓn是梯度更新方向,其中步长,向量。不同的梯度算法所选择的dΓn不同。综上,我们可将梯度追踪算法的总体框架归纳如下:

接下来分别介绍论文中提出的三种梯度追踪方法。

基于最速下降法的匹配追踪

最速下降法(这个翻译是从参考文献2中得来的)是采用目标函数的负梯度作为更新方向。目标函数的梯度大小为:

则GP算法流程如下:

在作者的主页上下载了论文中的代码,(附下载地址为:http://www.personal.soton.ac.uk/tb1m08/sparsify/sparsify.html

对其中的GP算法进行了自行仿写,但是不知道为什么跟作者的代码比较起来效果很差,代码所在文件夹为sparsify_0_5,将自己写的代码贴出如下,用了两种不同的写法,其实原理都是一样的,仿真结果很差,残差很大。
function[theta]=CS_GP(y,A,t)
%CS_GP Summary of this function goes here
%Version: 1.0 written by wwf @2017-04-28
% Detailed explanation goes here
% y = Phi * x
% x = Psi * theta
% y = Phi*Psi * theta
% 令 A = Phi*Psi, 则y=A*theta
% 现在已知y和A,求theta
[y_rows,y_columns]= size(y);
if y_rows<y_columns
y = y';%y should be a column vector
end
[M,N]= size(A); %传感矩阵A为M*N矩阵
theta = zeros(N,1); %用来存储恢复的theta(列向量)
aug_y=[];
r_n = y; %初始化残差(residual)为y
Aug_t=[];
for ii =1:t %迭代t次,t为输入参数
for col=1:N;
product(col)=abs(A(:,col)'*r_n); %传感矩阵A各列与残差的内积
end
[val,pos]= max(abs(product)); %找到最大内积绝对值,即与残差最相关的列
Aug_t=[Aug_t,A(:,pos)];
pos_array(ii)=pos;
g_n=Aug_t'*r_n; % 梯度方向
c_n=Aug_t*g_n;
w_n=(r_n'*c_n)/(c_n'*c_n); % 最速下降步长
d_n=w_n*g_n;
[x1,x2]=size(d_n);
[y1,y2]=size(aug_y);
D=aug_y;
aug_y=zeros(x1,x2);
aug_y(1:y1,1:y2)=D;
aug_y=aug_y+d_n ; % 最小二乘,使残差最小
r_n=r_n-(w_n)*(c_n); % 残差
end
theta(pos_array)=aug_y;
end
第二种:
function[theta]=GP_test(y,A,t)
%CS_GP Summary of this function goes here
%Version: 1.0 written by wwf @2017-04-28
% Detailed explanation goes here
% y = Phi * x
% x = Psi * theta
% y = Phi*Psi * theta
% 令 A = Phi*Psi, 则y=A*theta
% 现在已知y和A,求theta
[y_rows,y_columns]= size(y);
if y_rows<y_columns
y = y';%y should be a column vector
end
[M,N]= size(A); %传感矩阵A为M*N矩阵
theta = zeros(N,1); %用来存储恢复的theta(列向量)
r_n = y; %初始化残差(residual)为y
d_n=zeros(N,1);
P =@(z) A*z;
Pt =@(z) A'*z;
IN=[]; for ii =1:50 %迭代t次,t为输入参数
product=Pt(r_n);
[v I]=max(abs(product)); if isempty(find (IN==I))
IN=[IN I];
else
break;
end
d_n(IN)=product(IN);
c_n=P(d_n);
a_n=r_n'*c_n/(c_n'*c_n);
theta=theta+a_n*d_n;
r_n=r_n-a_n*c_n;
end
end
测试代码和前几次的一样,实验结果如下所示:

输出残差为:

调用作者写的代码的时候发现,有的时候恢复效果比较好,残差很小,但有的时候也会出现残差比较大的情况,猜测可能和生成的信号有关系,因为每次信号是随机生成的。结果如下图所示:

 

在参考文献[2]中对论文进行了翻译,读过一遍之后对文献[1]也更加理解了,这里就不再单独给出,摘取文献[2]中的内容进行解释,在以后的论文编写中若需要文献[1],建议自己再翻译比较好。
 

接下来解释一下CGP和ACGP的主要代码,CGP的代码没有看太懂。

CGP(代码名称为greed_omp_cgp)
while~done
DR(IN)=0;
[v I]=max(abs(DR));
IN=[IN I];
k=k+1;
ifk==1
d(IN)=1;
PG(1)=1;
else
%%%% Calculate P'*G, but only need new column and new row %%%%%
mask=zeros(m,1);
mask(IN(k))=1;%将mask中对应的第k次迭代所选出的内积所在的列序号的项置为1
new_element=P(mask);%选出此次迭代所选择出的原子
gnew=Pt(new_element);%gnew相当于G,即Psi'*Psi
PG(k-1,k-1)=D(1:k,k-1)'*[g;1];
g=gnew(IN);
%PG计算的是D’*G
PG(:,k)=D'*[g;zeros(maxM-k,1)]; % 1 general mult.
%%%% Calculate conjugate directions %%%
b=(PG(1:k-1,1:k)*DR(IN))./(dPPd(1:k-1));
d(IN)=DR(IN)-D(1:k,1:k-1)*b;%d should be orthogonal to the first k-1 columns of G.
end
D(1:k,k)=d(IN);%D是由n-1次的更新方向组成的矩阵
Pd=P(d);
dPPd(k)=Pd'*Pd;
a=(DR'*d)/dPPd(k);
s=s+a*d;
Residual=Residual-a*Pd;
DR=Pt(Residual); ERR=Residual'*Residual/n;
ifcomp_err
err_mse(iter)=ERR;
end ifcomp_time
iter_time(iter)=toc;
end
ACGP(代码名称为greed_nomp)
tic
t=0;
p=zeros(m,1);
DR=Pt(Residual);
[v I]=max(abs(DR));
ifweakness~=1
[vals inds]=sort(abs(DR),'descend');
I=inds(find(vals>=alpha*v));
end IN=union(IN,I);
ifstrcmp(STOPCRIT,'M')&length(IN)>=STOPTOL
IN=IN(1:STOPTOL);
end
MASK=zeros(size(DR));
pDDp=1;
done=0;
iter=1;
while~done % Select new element
ifisa(GradSteps,'char')
ifstrcmp(GradSteps,'auto') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Iteration to automatic selection of the number of gradient steps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% finished=0;
% while ~finished
% Update direction
ifiter==1
p(IN)=DR(IN); %p相当于论文中的d_n,当迭代次数为1时,d_n等于内积
Dp=P(p); %Dp相当于论文中的c_n,即Psi与d_n的乘积
else
MASK(IN)=1; %IN为此次迭代选出的内积值最大的列序号,将MASK的该项置为1
PDR=P(DR.*MASK);%取出最大的内积值,与字典矩阵Psi相乘
b=-Dp'*PDR/pDDp;%计算系数b1
p(IN)=DR(IN)+b*p(IN);%计算更新的方向d_n
Dp=PDR+b*Dp; %c_n是Psi与d_n-1的乘积,即P(d_n-1),将d_n-1展开带入即得
end
% Step size
% Dp=P(p); % =P(DR(IN)) +b P(p(IN));
pDDp=Dp'*Dp;
a=Residual'*Dp/(pDDp);
% Update coefficients
s=s+a*p;
% New Residual and inner products
Residual=Residual-a*Dp;
DR=Pt(Residual);
% select new element
[v I]=max(abs(DR));
ifweakness~=1
[vals inds]=sort(abs(DR),'descend');
I=inds(find(vals>=alpha*v));
end
IN=union(IN,I);
ifstrcmp(STOPCRIT,'M')&length(IN)>=STOPTOL
IN=IN(1:STOPTOL);
end
% % Only if we select new element do we leave the loop
% if isempty(find (IN==I, 1))
% IN=[IN I];
% finished=1;
% end
% end
 
参考文献:
[1] Blumensath  T,  Davies  M.  Gradient  pursuits[J].  IEEE  Transactions  on  Signal  Processing,  2008, 56(6):2370-2382. 
[2] 刘盼盼.压缩感知中梯度追踪算法的研究[D].南京:南京邮电大学,2015:7-21
 
 
 
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

IEEE Trans 2008 Gradient Pursuits论文学习的更多相关文章

  1. IEEE Trans 2009 Stagewise Weak Gradient Pursuits论文学习

    论文在第二部分先提出了贪婪算法框架,如下截图所示: 接着根据原子选择的方法不同,提出了SWOMP(分段弱正交匹配追踪)算法,以下部分为转载<压缩感知重构算法之分段弱正交匹配追踪(SWOMP)&g ...

  2. 对比学习下的跨模态语义对齐是最优的吗?---自适应稀疏化注意力对齐机制 IEEE Trans. MultiMedia

    论文介绍:Unified Adaptive Relevance Distinguishable Attention Network for Image-Text Matching (统一的自适应相关性 ...

  3. IEEE Trans 2007 Signal Recovery From Random Measurements via OMP

    看了一篇IEEE Trans上的关于CS图像重构的OMP算法的文章,大部分..看不懂,之前在看博客的时候对流程中的一些标号看不太懂,看完论文之后对流程有了一定的了解,所以在这里解释一下流程,其余的如果 ...

  4. 《Explaining and harnessing adversarial examples》 论文学习报告

    <Explaining and harnessing adversarial examples> 论文学习报告 组员:裴建新   赖妍菱    周子玉 2020-03-27 1 背景 Sz ...

  5. 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集

    A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...

  6. Faster RCNN论文学习

    Faster R-CNN在Fast R-CNN的基础上的改进就是不再使用选择性搜索方法来提取框,效率慢,而是使用RPN网络来取代选择性搜索方法,不仅提高了速度,精确度也更高了 Faster R-CNN ...

  7. Apache Calcite 论文学习笔记

    特别声明:本文来源于掘金,"预留"发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a07eea32a6f ...

  8. 论文学习笔记--无缺陷样本产品表面缺陷检测 A Surface Defect Detection Method Based on Positive Samples

    文章下载地址:A Surface Defect Detection Method Based on Positive Samples 第一部分  论文中文翻译 摘要:基于机器视觉的表面缺陷检测和分类可 ...

  9. 论文学习笔记 - Classifification of Hyperspectral and LiDAR Data Using Coupled CNNs

    Classifification of Hyperspectral and LiDAR Data Using Coupled CNNs 来源:IEEE TGRS 2020 下载:https://arx ...

随机推荐

  1. Unity3d 2017

    Unity3d引擎的新纪元--Unity3d 2017 来源 http://blog.csdn.net/dark00800/article/details/75209544 Unity3d不久之前正式 ...

  2. CentOS6.8通过yum安装MySQL5.7

    Centos6.8通过yum安装mysql5.7 1.安装mysql的yum源 a.下载配置mysql的yum源的rpm包 根据上面3张图片中的操作下载下来的rpm文件可以通过如下命令获取: wget ...

  3. 基于HTML5 Canvas的CSG构造实体几何书架

    CSG 构造实体几何这个概念在工业水利水电施工上.游戏上已经有很多人使用了,最简单的实体表示叫作体元,通常是形状简单的物体,如立方体.圆柱体.棱柱.棱锥.球体.圆锥等.根据每个软件包的不同这些体元也有 ...

  4. Virtual

    Virtual 作用: 允许在派生类中重新定义与基类同名函数并且可以通过其类的指针或引用来访问基类何派生类的同名函数. 1. 概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少 ...

  5. no suitable driver found for jdbc:mysql//localhost:3306/..

      出现这样的情况,一般有四种原因(网上查的): 一:连接URL格式出现了问题(Connection conn=DriverManager.getConnection("jdbc:mysql ...

  6. 身为运维的你,怎么掌握python才不会失业

    以前,我们都说Python是运维工程师的未来:现在,为什么大家都说不会Python的运维都将失业?运维必须懂开发,特别是python开发,已经形成大家的共识,不懂开发的运维,路会越走越窄. 而现在的情 ...

  7. VUE环境配置——运行Demo

    如果有Vue的Demo   不知道怎么运行的同学可以看这里 这里只讲Win下面环境配置 一.NodeJs安装 1.下载Windows 安装包(.msi),并安装https://nodejs.org/d ...

  8. 分享:苹果APP更新上架被拒的另一种理由(Safety - Objectionable Content)

    这两个星期,本来想和大伙分享:写IT连创业系列运营篇. 但时间飞过,仍只是写了开头,一直很忙,没能完往下写. 今天就动手写点其它内容,哈哈,免的和小伙伴太陌生〜〜〜 前几天更新了:IT恋和IT连的版本 ...

  9. C++静态库与动态库(转)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0cAAAC6CAIAAADqPKGOAAAgAElEQVR4nO2dy5WrOhREFYgjcAQ9Iw

  10. Api管理工具(spring-rest-docs)

    对于app开发来说,必须需要有相应的api文档,一般最基础的就是用markdown工具来撰写api文档.当对于开发人员来说,是总会想着寻找更方便撰写,测试,对接前端开发的文档生成的工具. 其实这方面的 ...