这篇博文是在对Koredianto Usman《Introduction to Orthogonal Matching Pursuit》文章的翻译,后面附带了一些总结.
这篇文章是前面《Matching Pursuit (MP)》文章的继续. (注:原文中还是有一些小细节错误,请大家睁大眼睛阅读)
简介
考虑下面的问题:给定
这相当简单!
现在是比较困难的部分!给定
在压缩感知(Compressive Sensing)术语中,从
一般地,
基本概念
和前面在MP算法中讨论过的一样,感知矩阵
其中,
这些列被称为基(basis)或者原子(atom).
现在,我们令
从该方程可以看出
OMP算法和MP算法类似,都是从字典中找出哪一个原子对
计算原子的贡献值
字典中有三个原子,
且
因此,各原子对
显然,原子
在第一次迭代过程中,我们选择
当然,我们也可以使用矩阵的形式计算点积:
原子和
计算残差
现在已经选定了第一个基
残差的几何意义如图2:
重复迭代
经过第一次迭代,我们选择出了基
贡献系数矩阵可以写成
第一个元素是第一个贡献值-1.34,对应着第一个第一个基
残差值为
现在需要从剩下的基
所以,
我们将选择的基
接下来的步骤和MP算法稍微有些不同. 这里,我们需要计算
我们使用最小二乘法(Least Square Problem)解决该该贡献值问题:
如何求得
表示成数学语言为:
在这个例子中,即
对于
其中,
(注:可参看我的博文《Moore-Penrose广义逆矩阵》和《矛盾方程的最小二乘解法》)
在我们的例子中
可以使用MATLAB中的内置函数pinv()进行伪逆的计算.
得到
得到
同样的,
得到
此时,残差值为
最后一次迭代
这一步不是必须的,因为残差已经完全消除了(很多实现OMP的软件都需要输入稀疏度
重新组织信号系数
其他例子
给定
求得
现在给定
我们有4个基(原子):
b1=⎡⎣⎢−0.8−0.20.2⎤⎦⎥b2=⎡⎣⎢0.30.41⎤⎦⎥b3=⎡⎣⎢1−0.3−0.1⎤⎦⎥b4=⎡⎣⎢0.4−0.40.8⎤⎦⎥ -
由于基向量的长度不是1,所以我们首先进行标准化.
b1^=b1/∥b1∥=⎡⎣⎢−0.8−0.20.2⎤⎦⎥/(−0.8)2+(−0.4)2+(0.2)2−−−−−−−−−−−−−−−−−−−−−−√=⎡⎣⎢−0.9428−0.23570.2357⎤⎦⎥ b2^=b2/∥b2∥=⎡⎣⎢0.26800.35780.8940⎤⎦⎥ b3^=b3/∥b3∥=⎡⎣⎢0.9535−0.28600.0953⎤⎦⎥ b2^=b2/∥b2∥=⎡⎣⎢0.4082−0.4082−0.8165⎤⎦⎥ -
标准化的基向量对
y 的贡献w w=A^T⋅y=⎡⎣⎢−0.9428−0.23570.23570.26800.35780.98400.9535−0.2860−0.09530.4082−0.4082−0.8165⎤⎦⎥T⋅⎡⎣⎢2.70.14.5⎤⎦⎥=⎡⎣⎢⎢⎢−1.50854.78522.11674.7357⎤⎦⎥⎥⎥ -
第二个基向量
b2 贡献值最大,所以将b2 加入到Anew Anew=b2=⎡⎣⎢0.30.41⎤⎦⎥ -
利用最小二乘法计算
xrec Lp=A+new⋅y=[4.28] 因为
Lp 对应着第二个基向量,所以xrec=⎡⎣⎢⎢⎢04.2800⎤⎦⎥⎥⎥ -
接下来计算残差
r=y−Anew⋅Lp=⎡⎣⎢2.70.14.5⎤⎦⎥−⎡⎣⎢0.30.41⎤⎦⎥⋅4.28=⎡⎣⎢1.416−1.6120.22⎤⎦⎥ -
接下来重复第3步,计算
b1^ ,b1^ 和b1^ 对r 的贡献.w=A^T⋅r=⎡⎣⎢−0.9428−0.23570.23570.9535−0.2860−0.09530.4082−0.4082−0.8165⎤⎦⎥T⋅⎡⎣⎢1.416−1.6120.22⎤⎦⎥=⎡⎣⎢−0.90321.79021.4158⎤⎦⎥ 选择第二个贡献最大的基
b3 ,其贡献值为1.7902. -
将选择的
b3 加入到Anew 中Anew=[b1b2]=⎡⎣⎢0.30.411−0.3−0.1⎤⎦⎥ -
用最小二乘法计算
Lp=A+new⋅y=[4.17021.7149] 这个
Lp 对应着b2 和b3 ,因此xrec=⎡⎣⎢⎢⎢04.1721.71490⎤⎦⎥⎥⎥ -
接着计算残差
r=y−Anew⋅Lp=⎡⎣⎢2.70.14.5⎤⎦⎥−⎡⎣⎢0.30.411−0.3−0.1⎤⎦⎥⋅[4.1721.7149]=⎡⎣⎢−0.266−1.05360.5012⎤⎦⎥ 重复步骤2,进行最后一次迭代
-
计算
b1 和b4 的贡献值w=[b1^b2^]⋅r=⎡⎣⎢−0.9428−0.23570.23570.4082−0.4082−0.8165⎤⎦⎥T⋅⎡⎣⎢−0.266−1.05360.5012⎤⎦⎥=[0.61720.7308] 这里
b4 提供了最大贡献值0.7308. 将
b4 加入Anew=⎡⎣⎢0.30.411−0.3−0.10.4−0.40.8⎤⎦⎥ 利用最小二乘计算
Lp=A+new⋅y=⎡⎣⎢321⎤⎦⎥ ,对应的xrec=⎡⎣⎢⎢⎢0312⎤⎦⎥⎥⎥ -
接着计算残差
r=y−Anew⋅Lp=⎡⎣⎢2.70.14.5⎤⎦⎥−⎡⎣⎢0.30.411−0.3−0.10.4−0.40.8⎤⎦⎥⋅⎡⎣⎢312⎤⎦⎥=⎡⎣⎢000⎤⎦⎥ 我们的迭代到此为止,因为此时残差已经为0,重建的
x 为xrec=⎡⎣⎢⎢⎢0312⎤⎦⎥⎥⎥ ,和原来的信号相同.
需要注意的问题
通过上面的迭代计算过程,我们应该注意如下几点:
- OMP中最大贡献值的计算需要对基向量进行标准化处理,不是由原始基得到的.
- 如果给定的基向量已经是单位向量,则不需要进行标准化.
- 基向量对
y 值的贡献的计算是通过标准化以后的基向量和残差的点积进行计算的. -
在MP算法中,重建系数
xrec 的计算是通过基向量和残差的点积进行计算的,在OMP算法中,xrec 的计算是通过最小二乘法得到Anew 相对于y 的系数得到的,即Lp 的计算.Lp 向量中的值直接对应于xrec 的相应位置.Anew 通过每次对基向量的选择得到. 这个过程是需要时间的,因此OMP比MP慢. (不是应该OMP收敛的快吗?) - 残差
r 的计算通过原始的y 值和Anew ,Lp 得到. - 迭代的次数最多等于
A 矩阵的行数M,或者如果给定了稀疏度K ,则迭代K 次. 如果K<M ,则已知的K 可以加快计算结束,如果K 未知,则迭代M 次.
说明总结
在正交匹配追踪OMP中,残差总是与已经选择过的原子正交的。这意味着一个原子不会被选择两次,结果会在有限的几步收敛。
OMP算法 步骤描述:
输入:字典矩阵
输出:
初始化:残差
循环执行步骤1-5:
- 找出残差
r 和字典矩阵的列Ai 积中最大值所对应的脚标λ ,即λt=argmaxi=1,⋯,N|<rt−1,Ai>| . - 更新索引集
Λt=Λt−1∪{λt} ,记录找到的字典矩阵中的重建原子集合At=[At−1,Aλt] . - 由最小二乘得到
x^t=argmin∣∣|y−Atx^|∣∣ . - 更新残差
rt=y−Atx^t ,t=t+1 . - 判断是否满足
t>K ,若满足,则迭代停止;若不满足,则继续执行步骤1.