压缩感知近些年在学术界非常火热,在信号处理领域取得了很多非常不错的成果。
博主最近的项目涉及到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算法的伪代码表述如下:
输入:字典矩阵 Φ ,原信号 y
输出:重建目标信号
初始化: x=0,r=y,k=0
当没有满足终止条件时,则循环执行步骤(1)~(4)
(1) k=k+1
(2) λ=arg