转自https://blog.csdn.net/rainbow0210/article/details/53386695
压缩感知近些年在学术界非常火热,在信号处理领域取得了很多非常不错的成果。
博主最近的项目涉及到K-SVD算法,所以也就顺带着学习其重要的组成部分——匹配跟踪算法。
本文只介绍最基本的匹配跟踪算法和正交匹配跟踪算法,即MP和OMP。
这个算法的优化和变形非常之多,近些年学术界很多人都在研究这个,有兴趣的读者可以自行查阅相关论文,本文不多做阐述。
废话少说,直接上干货。
所谓压缩感知,从名字就可以理解,压缩,即为数据压缩,例如将特征维度从很高降到很低;感知,即为压缩之后依然能够感知其特征的主体含义。
说白了,就是让一个10000维的特征降到10维,但是分类效果不变,当然,这个例子有点夸张。
这里需要一个叫做词典的东西,这个东西和生活中的词典是一样的。既然是词典自然要有索引(压缩感知里称之为‘原子’),在这里即为一个词典矩阵D的每一个列向量,我们希望能将原信号尽可能表示成词典中尽可能少的原子的线性组合。
那么这里就有两个关键点:
原子的数目尽可能少
该线性组合要最大限度地恢复原信号的内容
这里理解不了的朋友可以想象一下三维空间中的向量,是不是都可以分解成x,y,z上的向量的矢量和?对,差不多就是这个意思,当然,其中还是差很多的,有个直观的感觉就好,继续看下文就明白了。
表达成数学形式就是这个样子:
其中,x是原信号,一个列向量,大小为N*1;D是词典,一个矩阵,大小为N*M; γγ 则是待求的稀疏表达,大小为M*1,我们希望 γγ 中的非零项的个数不大于K,同时其与原信号的误差不大于 ϵϵ。
通常K是远远小于M的,即 γγ 里的元素基本全为0,这既是‘稀疏表达’的由来,也是能够给特征降维的原因。
这里不讨论字典是怎么得到的,因为这是下篇文章,即K-SVD的内容。不过字典不一定是通过机器学习得到的,小波什么的也可以作为字典来使用。
MP算法
匹配跟踪算法,即MP算法,是一种基于迭代的贪婪算法。其大致思想为:
每次找到字典中与当前信号最为相关的原子,将其作为稀疏表达的一项,计算其误差,将误差视为新的信号重复以上步骤,直至满足终止条件。最终,信号就被表示成了若干个原子的线性组合和一个误差项,在压缩感知中,我们称这个误差项为‘残差’。
那么这里有两个关键点需要注意:
什么是与当前信号最为相关的原子?
如何构建稀疏表达并计算残差?
对于第一个问题,我们定义与当前信号的内积最大的原子(这里的原子需要进行归一化处理,即模长为1)即为最相关的原子。
说的直观点,例如二维空间,就是将当前信号和原子分别视为空间中的向量,其与当前信号夹角最小的原子即为最相关的原子。
对于第二个问题,由于我们通过上一步找到了这样的一个原子,并将原信号通过该原子进行表达,但原信号中还有一部分是这个原子不能够表达的(想一下N维空间中的矢量分解就明白了),那么这部分作为残差依然可以继续分解下去,于是便得到了原信号的系数表达和最终的残差。
MP算法的伪代码表述如下:
输入:字典矩阵ΦΦ,原信号yy
输出:重建目标信号xx
初始化:x=0,r=y,k=0x=0,r=y,k=0
当没有满足终止条件时,则循环执行步骤(1)~(4)
(1) k=k+1k=k+1
(2) λ=argmaxλ{<rk−1,ϕλ>ϕλ||ϕλ||2}λ=argmaxλ{<rk−1,ϕλ>ϕλ||ϕλ||2}
(3)x=x+<rk−1,ϕλk>ϕλk||ϕλk||2x=x+<rk−1,ϕλk>ϕλk||ϕλk||2
(4)r=r−Φxr=r−Φx
其中<x,y><x,y>表示向量x与向量y的内积。
这里有几点需要注意,每次循环产生的残差都与当前所选择的原子是正交的,从(2)不难推出。残差的值是越来越小的,所以算法必然收敛,这个大家知道就好,至于怎么证就无关紧要了。
匹配跟踪算法在重建原始信号的应用中是很实用的,但是它有两个缺点:
(1)这个方法不能保证重建误差足够小
(2)这个算法往往需要大量的循环次数才能逼近原始信号,如果残差在已选择的原子进行垂直投影是非正交性的,则会使得每次循环的结果并不是最优的,而是次优的,收敛需要很多次循环。说通俗点,就是我在地N次循环中选择的是原子a,第N+M次循环中可能选择的也是原子a,但实际上,这两次循环我们更期望合成为一次,即每次循环中都选择不同的原子,从而大大减少循环的次数。
通过改进上述缺点,便有了如下的OMP算法。
OMP算法
正交匹配跟踪算法,即OMP算法。该算法中,残差总是和已选取的原子正交,这样就能够保证相同的原子在OMP中不会被选中两次,进而减少算法的循环次数。
理论上来讲,可以通过施密特正交化来生成一个正交的词典,但其复杂度之高是我们所不能接受的。
OMP算法伪代码:
输入:字典矩阵ΦΦ,原始信号yy,稀疏度KK,标识待重建信号中非零元素位置的索引集ΛΛ
输出:重建信号xx
初始化:x=0,r=yx=0,r=y,循环标识k=0k=0,索引集Λ0Λ0为空集
当没有满足结束条件时,循环执行步骤(1)~(6)
(1)k=k+1k=k+1
(2)找出残余分类r与采样举证中最匹配原子的索引λkλk,即
λk=argmax{|<rk,ϕk>|}
λk=argmax{|<rk,ϕk>|}
(3)更新索引集Λk=Λk−1∪{λk}Λk=Λk−1∪{λk},并更新相应擦爱养矩阵中的列集合Φk=[Φk−1,ϕλk]Φk=[Φk−1,ϕλk]
(4)重建目标信号,x=Φ+yx=Φ+y,其中,Φ+Φ+表示矩阵ΦΦ的伪逆
(5)更新残差r=y−Φkxr=y−Φkx
(6)判断是够满足k>Kk>K,若满足则停止循环;若不满足,则执行步骤(1)
OMP保证了每次算法迭代的最有型,减少了迭代的次数。但是,它在每次迭代中仅选取一个元素来更新已选元素的集合,迭代的次数与稀疏度K或采样个数M密切相关,并且其中还有一个正交化的过程,随着K和M的增加,运算时间也会大幅增加。
由于存在上述缺点,大量的科研工作者针对此算法做出了各种各样不同的优化,有兴趣的读者可以自行查阅相关论文。