一分钟了解”匹配追踪算法(Matching Pursuit,MP) 和 正交匹配追踪算法(Orthogonal Matching Pursuit,OMP)“

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yes1989yes/article/details/81806657

==先罗嗦几句(不计入一分钟正文)==

(1)OMP相对于MP的优势在此不讲,搜索到的帖子都会讲到。

(2)OMP的实现步骤资料虽有很多,但是讲的不太浅显易懂,所以这里讲一下。

(3)MP的实现步骤很多人讲的已经比较明白,本文也介绍MP目的是为了与OMP对比并有助理解。

== 一分钟正文开始 ==

Usman, Koredianto, (2017), Introduction to Orthogonal Matching Pursuit, Telkom University
Online : http://korediantousman.staff.telkomuniversity.ac.id 这一篇讲的非常清楚,例子也很丰富,解决了我的困惑。建议初学者:先看这篇讲义,其他的网上的资料可不必再看。

 

MP和OMP具体步骤&对比
MP算法 OMP算法
算法输入:字典D,待分解的输入信号y 算法输入:字典D,待分解的输入信号y
算法输出:稀疏系数向量x 算法输出:稀疏系数向量x
算法初始化:残差r=输入信号y;系数x全部元素初始化为0. 算法初始化:被选择的原子所构成的字典子集S=空集(每次迭代被选中的原子添加进这个子集作为新的一列);残差r=输入信号y;系数x全部元素初始化为0.

第一步:找出字典D中与残差r内积最大的那个原子di,记录下这个原子的索引  i (即该原子在字典D中的位置)。

 

文献[1]提到:在以后每次找与残差内积最大的原子di的时候,不需要搜索已经被选中的原子(原文:It is not necessary to include [-1/sqrt(2); -1/sqrt(2)] because the residual is orthogonal to that vector by construction.)文献[4]也有类似的言论:no need to count with b1
, since this residue must perpendicular to b1。但是有的文献都没有提到这一步,我个人理解是,这一步不是必须的(not necessary),因为残差已经在这个di上分解过一次了,以后的迭代中,就神经大条地认为:即使不把已选中的原子排除,最大的内积也不会再次落到di上(实际上这种事情还是有可能发生的,这也是MP的缺陷)。

第一步:找出字典D中与残差r内积最大的那个原子di,记录下这个原子的索引  i (即该原子在字典D中的位置)。把di添加入字典子集S中(每迭代一次,S中就会增加一个新的原子,这个加入的新原子就是此次迭代中发现的与残差内积最大的那个原子)。
第二步(计算x):系数向量x的第i个元素=di与残差r的内积(理解成残差r在di这个方向上投影了多少,也就是残差r在di这个方向上分解了多少)(为了下一步描述方便,这一步所求出的”系数x的第i个元素“记为”xi“)

第二步(计算x):

第1种说法:

系数向量是下列方程的最小二乘解:

残差r=S*x。

(参考文献[2]后面的中文流程图以及文献[3])

第2中说法:

x=S的伪逆*y。(伪逆在matlab里只是一个pinv语句,故这种算法在matlab里非常方便)(参考文献[4])

 

MP与OMP的主要区别就在这一步,左侧MP稀疏系数的计算是每次迭代只计算系数向量x中的一个元素xi;而OMP中每次都要根据新加入的原子所更新的子集字典S重新计算整个系数向量x。(文献[4]原句:In the case of MP, the reconstruction coefficient xrec is calculated from dot product of basis and residue, while on OMP, the coefficient xrec is calculated from Least Square solution of A_new to y.)这里我加粗了x,是为了强调这是个向量。

另外,计算得到的最小二乘解维度和S一样,是小于稀疏系数x的维度的,这个只需要把最小二乘解中的各个元素赋值到x的对应元素就行了(第一步中记录了被选中原子的索引,就是为了实现这个功能),这个操作比较符合直觉,不讲大家也会自然地想到。

第三步(更新残差r):更新后的残差r=当前残差r-di*xi

(解释一下:xi就是第二步里求出的系数,di*xi就是残差在di方向上分解的信号。所以,更新后的残差r就是当前的残差r减去该残差在di上的投影量)

第三步(更新残差r):更新后的残差r=当前残差r-S*x.

(根据这一步的说法,S*x就是残差r在S张成空间上的正交投影。但是,为什么最小二乘估计S*x就等于正交投影呢?我数学学的不好,就暂时搁置这个疑问吧。)

第四步:判断是否达到迭代终止条件。若是,结束算法,输出稀疏系数x;若否,转至第一步。 第四步:判断是否达到迭代终止条件。若是,结束算法,输出稀疏系数x;若否,转至第一步。
   

 

参考文献:

[1] Matching Pursuit Algorithms , https://ww2.mathworks.cn/help/wavelet/ug/matching-pursuit-algorithms.html

这是matlab关于MP方法和OMP方法的文档,对MP算法讲的比较清楚,对MP算法还附上了一个非常具体的小例子,有助于理解。缺点是对于MP算法和OMP的稀疏系数是怎么计算的没有讲清楚,让我这种小白仍然心存疑惑。

[2] 浅谈压缩感知(九):正交匹配追踪算法OMP, https://www.cnblogs.com/AndyJee/p/5047174.html

博文很乱,正文几乎没法看。但是后面附上的流程图对我有一点点指导(我的OMP算法第二步就是根据此流程图写的),最后还有代码。第一个代码帮助理解,第二个代码有报错。

[3]Orthogonal Matching Pursuit for Sparse Signal Recovery, 貌似是提出OMP的原始论文,缺点与文献[1]同。

[4] Usman, Koredianto, (2017), Introduction to Orthogonal Matching Pursuit, Telkom University
Online : http://korediantousman.staff.telkomuniversity.ac.id 这一篇讲的非常清楚,例子也很丰富,解决了我的困惑。建议初学者:先看这篇讲义,其他的网上的资料可不必再看。

[5] 中文论文若干,讲得 故作高深,我这种小白看不懂。

展开阅读全文

没有更多推荐了,返回首页