【压缩感知合集9】压缩感知的OMP算法(算法步骤分析、举例分析、说明总结和缺陷)

0 前情提要

0.1 数学模型和总体框图如下

给定输入信号 X ∈ R N × 1 \boldsymbol{X} \in \mathbb{R}^{N\times1} XRN×1,最终想要得到压缩信号 A ∈ R M × 1 \boldsymbol{A} \in \mathbb{R}^{M\times1} ARM×1 K < < N K<<N K<<N

image-20210709133311121

0.2 压缩过程图例分析如下

整个压缩过程也可以被称为感知过程
A = Φ X = Φ Ψ Y = Θ Y \boldsymbol{A} =\boldsymbol{\Phi}\boldsymbol{X} = \boldsymbol{\Phi}\boldsymbol{\Psi} \boldsymbol{Y} = \boldsymbol{\Theta}\boldsymbol{Y} A=ΦX=ΦΨY=ΘY

Θ \boldsymbol{\Theta} Θ即为感知过程的核心命名为感知矩阵

image-20210710112220724

符号含义维度属性
X \boldsymbol{X} X输入信号;待压缩信号 R N × 1 \mathbb{R}^{N\times1} RN×1未知,需要恢复
Φ \boldsymbol{\Phi} Φ观测矩阵;测量矩阵 R M × N \mathbb{R}^{M \times N} RM×N已知(非自适应性)
Ψ \boldsymbol{\Psi} Ψ变换矩阵;变换基矩阵;稀疏基矩阵;稀疏矩阵;正交基字典矩阵 R N × N \mathbb{R}^{N\times N} RN×N已知(非自适应性)
Y \boldsymbol{Y} Y正交基变换后的稀疏表示 R N × 1 \mathbb{R}^{N\times1} RN×1未知,需要恢复
Θ \boldsymbol{\Theta} Θ感知矩阵,传感矩阵 R M × N \mathbb{R}^{M\times N} RM×N已知(非自适应性)
A \boldsymbol{A} A观测压缩所得到压缩信号 R M × 1 \mathbb{R}^{M\times1} RM×1已知

0.3 算法重构恢复过程如下

在得到已经压缩完的采样信号 A \boldsymbol{A} A 后,根据确定的固定性观测矩阵 Φ \boldsymbol{\Phi} Φ 和稀疏矩阵 Ψ \boldsymbol{\Psi} Ψ 的先验信息进行恢复,数学表达如下
X ˇ = f ( A , Θ ) \boldsymbol{\check{X}}=f(\boldsymbol{A},\boldsymbol{\Theta}) Xˇ=f(A,Θ)
给定被压缩的信号 A \boldsymbol{A} A 和感知矩阵 Θ \boldsymbol{\Theta} Θ,求解输入原始信号 X ˇ \boldsymbol{\check{X}} Xˇ 的过程称为重构。

重构问题相较于压缩问题来说是一个更加困难的一个任务。

由于 M < < N M<<N M<<N, 已知条件所能构成的方程是欠定的,无法轻易求出数值解的,幸运的是,如果原始信号是稀疏的,那么这个问题可以被很好地解决。

解释一下为什么是欠定的:( X \boldsymbol{X} X 满足的约束如下)
A = Ψ X [ a 1 ⋮ a M ] = [ ψ 11 ψ 12 . . . ψ 1 N ψ 2 N ψ 2 N . . . ψ 2 N ⋮ ⋮ ⋮ ⋮ ψ M 1 ψ M 2 . . . ψ M N ] [ x 1 x 2 ⋮ x N ] \boldsymbol{A} = \boldsymbol{\Psi}\boldsymbol{X}\\ \left[\begin{array}{c}a_1 \\ \vdots\\ a_M \end{array}\right] = \left[\begin{array} {cccc} \psi_{11} & \psi_{12} & ... & \psi_{1N} \\\psi_{2N} & \psi_{2N} &... &\psi_{2N}\\ \vdots & \vdots & \vdots & \vdots \\ \psi_{M1} & \psi_{M2} &... &\psi_{MN}\end{array}\right]\left[\begin{array}{c}x_1 \\ x_2 \\ \vdots \\ x_N\end{array}\right] A=ΨXa1aM=ψ11ψ2NψM1ψ12ψ2NψM2.........ψ1Nψ2NψMNx1x2xN
实际使用过程中需要求解出 N N N 个未知数,但是只有 M M M 个方程,未知数的个数远远大于方程的个数。

N = M N=M N=M,则可轻松由 A \boldsymbol{A} A解出 X \boldsymbol{X} X Y \boldsymbol{Y} Y

M < < N M<<N M<<N,可根据稀疏表示下的信号 Y \boldsymbol{Y} Y和矩阵所具有的RIP性质重构

一般可以抽象为如下求解任务
min ⁡ ∥ Ψ T X ∥ 0 s . t . Θ X = Φ Ψ X = A \min \left\| \boldsymbol{\Psi}^{T} \boldsymbol{X}\right\|_{0} \\s.t. \boldsymbol{\Theta} \boldsymbol{X}=\boldsymbol{\Phi}\boldsymbol{\Psi}\boldsymbol{X}= \boldsymbol{A} minΨTX0s.t.ΘX=ΦΨX=A

1 正交匹配跟踪算法(OMP)

1.0 问题设置

考虑以下情况,给定 X = [ − 1.2 1 0 ] \boldsymbol{X}=\left[\begin{array}{c}-1.2 \\ 1 \\ 0\end{array}\right] X=1.210 D = [ − 0.707 0.8 0 0.707 0.6 − 1 ] \boldsymbol{D}=\left[\begin{array}{ccc}-0.707 & 0.8 & 0 \\ 0.707 & 0.6 & -1\end{array}\right] D=[0.7070.7070.80.601]

我们可以计算 A = D X \boldsymbol{A} = \boldsymbol{D}\boldsymbol{X} A=DX ,这是非常简单地,也就是
A = D X = [ − 0.707 0.8 0 0.707 0.6 − 1 ] [ − 1.2 1 0 ] = [ 1.65 − 0.25 ] \boldsymbol{A} = \boldsymbol{D}\boldsymbol{X}=\left[\begin{array}{ccc}-0.707 & 0.8 & 0 \\ 0.707 & 0.6 & -1\end{array}\right]\left[\begin{array}{c}-1.2 \\ 1 \\ 0\end{array}\right]=\left[\begin{array}{c}1.65 \\ -0.25\end{array}\right] A=DX=[0.7070.7070.80.601]1.210=[1.650.25]
现在让我们介绍比较难的部分,给定 A = [ 1.65 − 0.25 ] \boldsymbol{A} = \left[\begin{array}{c}1.65 \\ -0.25\end{array}\right] A=[1.650.25] D = [ − 0.707 0.8 0 0.707 0.6 − 1 ] \boldsymbol{D}=\left[\begin{array}{ccc}-0.707 & 0.8 & 0 \\ 0.707 & 0.6 & -1\end{array}\right] D=[0.7070.7070.80.601],如何找到最接近的 X \boldsymbol{X} X

解释一下为什么是欠定的:
A = D X [ 1.65 − 0.25 ] = [ − 0.707 0.8 0 0.707 0.6 − 1 ] [ x 1 x 2 x 3 ] \begin{aligned} \boldsymbol{A}&= \boldsymbol{D}\boldsymbol{X}\\ \left[\begin{array}{c}1.65 \\ -0.25\end{array}\right] &= \left[\begin{array}{ccc}-0.707 & 0.8 & 0 \\ 0.707 & 0.6 & -1\end{array}\right]\left[\begin{array}{c}x_1 \\ x_2 \\ x_3\end{array}\right] \end{aligned} A[1.650.25]=DX=[0.7070.7070.80.601]x1x2x3
例子中需要求解出3个未知数,但是只有2个方程

实际使用过程中需要求解的未知数有 N N N 个,但是只有 M M M 个方程,未知数的个数远远大于方程的个数 M < < N M<<N M<<N

1.1 步骤描述

输入:字典矩阵 D \boldsymbol{D} D ,采样所得向量 A \boldsymbol{A} A ,稀疏度 K K K

输出: X \boldsymbol{X} X K K K 稀疏逼近 X ˇ \boldsymbol{\check{X}} Xˇ

初始化:残差 f 0 = A \boldsymbol{f}_0=\boldsymbol{A} f0=A ,索引集 Λ 0 = ∅ Λ_0=\varnothing Λ0= t = 1 t=1 t=1

循环执行步骤1-5:

  • 找出残差 f t \boldsymbol{f}_t ft 和字典矩阵的列 d r t \boldsymbol{d}_{r_t} drt 内积中最大值所对应的脚标 r t r_t rt ,即 r i = arg ⁡ max ⁡ r t = 1 , ⋯ , N ∣ ⟨ f , d r t ⟩ ∣ r_i=\arg\max_{r_t=1,⋯,N}|\langle\boldsymbol{f},\boldsymbol{d}_{r_t}\rangle| ri=argmaxrt=1,,Nf,drt
  • 更新索引集 Λ t = Λ t − 1 ∪ r t Λ_t=Λ_{t−1}∪{r_t} Λt=Λt1rt ,记录找到的字典矩阵中的重建原子集合 D t = [ D t − 1 , d r t ] \boldsymbol{D}_t =\left[ \boldsymbol{D}_{t-1},\boldsymbol{d}_{r_t}\right] Dt=[Dt1,drt]
  • 由最小二乘得到 X ˇ = arg ⁡ min ⁡ w ∥ A − D t w ∥ \boldsymbol{\check{X}} = \arg \min_{\boldsymbol{w}}\|\boldsymbol{A}−\boldsymbol{D}_t\boldsymbol{w}\| Xˇ=argminwADtw
  • 更新残差 f t = A − A t X ˇ \boldsymbol{f}_t = \boldsymbol{A}−\boldsymbol{A}_t\boldsymbol{\check{X}} ft=AAtXˇ t = t + 1 t=t+1 t=t+1
  • 判断是否满足 t > K t>K t>K ,若满足,(或者判断残差的大小)则迭代停止;若不满足,则继续循环

1.2 匹配追踪的概念

这一部分是和MP算法相同的,正好也在此说明匹配追踪的算法。

字典由一系列基信号或者原子组成的,也就是说
D = [ − 0.707 0.8 0 0.707 0.6 − 1 ] = [ d 1 , d 2 , d 3 ] \boldsymbol{D}=\left[\begin{array}{ccc} -0.707 & 0.8 & 0 \\ 0.707 & 0.6 & -1 \end{array}\right]=\left[\begin{array}{c} \boldsymbol{d}_1, \boldsymbol{d}_2, \boldsymbol{d}_3 \end{array}\right] D=[0.7070.7070.80.601]=[d1,d2,d3]
其中,
d 1 = [ − 0.707 0.707 ] , d 2 = [ 0.8 0.6 ] , d 3 = [ 0 − 1 ] \boldsymbol{d}_1=\left[\begin{array}{c} -0.707 \\ 0.707 \end{array}\right], \quad \boldsymbol{d}_2=\left[\begin{array}{c} 0.8 \\ 0.6 \end{array}\right], \quad \boldsymbol{d}_3=\left[\begin{array}{c} 0 \\ -1 \end{array}\right] d1=[0.7070.707],d2=[0.80.6],d3=[01]
被称为原子或者基信号

现在我们将基信号表达出来
A = D X = [ − 0.707 0.8 0 0.707 0.6 − 1 ] [ x 1 x 2 x 3 ] = [ x 1 d 1 , x 2 d 2 , x 3 d 3 ] = [ − 0.707 0.707 ] x 1 + [ 0.8 0.6 ] x 2 + [ 0 − 1 ] x 3 \begin{aligned} \boldsymbol{A} &= \boldsymbol{D}\boldsymbol{X}=\left[\begin{array}{ccc}-0.707 & 0.8 & 0 \\0.707 & 0.6 & -1\end{array}\right] \left[\begin{array}{c}x_1 \\ x_2 \\ x_3 \end{array}\right] =\left[\begin{array}{c} x_1\boldsymbol{d}_1, x_2\boldsymbol{d}_2, x_3\boldsymbol{d}_3 \end{array}\right]\\ &=\left[\begin{array}{c}-0.707 \\0.707\end{array}\right]x_1+ \left[\begin{array}{c}0.8 \\0.6\end{array}\right]x_2+ \left[\begin{array}{c}0 \\-1\end{array}\right]x_3 \end{aligned} A=DX=[0.7070.7070.80.601]x1x2x3=[x1d1,x2d2,x3d3]=[0.7070.707]x1+[0.80.6]x2+[01]x3
上面的方程说明了 A \boldsymbol{A} A D \boldsymbol{D} D 中原子的线性组合,而线性组合系数恰好是 X \boldsymbol{X} X 。实际上,我们知道 x 1 = − 1.2 , x 2 = 1 , x 3 = 0 x_1=-1.2, x_2=1, x_3=0 x1=1.2,x2=1,x3=0 ,换句话说原子 d 1 \boldsymbol{d}_1 d1 对于 A \boldsymbol{A} A 贡献了 − 1.2 -1.2 1.2 d 2 \boldsymbol{d}_2 d2 对于 A \boldsymbol{A} A 贡献了 1 1 1 d 3 \boldsymbol{d}_3 d3 对于 A \boldsymbol{A} A 贡献了 0 0 0

MP算法OMP算法要找到对 A \boldsymbol{A} A 贡献最大的那个原子,然后是贡献次之的原子,一直进行到贡献最小的原子。

第一步:求取最大相关

在矩阵A中有三个原子,
d 1 = [ − 0.707 0.707 ] , d 2 = [ 0.8 0.6 ] , d 3 = [ 0 − 1 ] \boldsymbol{d}_1=\left[\begin{array}{c}-0.707 \\0.707\end{array}\right], \quad \boldsymbol{d} 2=\left[\begin{array}{c}0.8 \\0.6\end{array}\right], \quad \boldsymbol{d} 3=\left[\begin{array}{c}0 \\-1\end{array}\right] d1=[0.7070.707],d2=[0.80.6],d3=[01]
压缩信号 A = [ 1.65 − 0.25 ] \boldsymbol{A} = \left[\begin{array}{c}1.65 \\ -0.25\end{array}\right] A=[1.650.25]

我们计算每个原子对于 A \boldsymbol{A} A 的贡献(主要是点乘计算投影的大小)
⟨ d 1 , A ⟩ = [ − 0.707 0.707 ] [ 1.65 − 0.25 ] = − 0.707 × 1.65 + 0.707 × ( − 0.25 ) = − 1.34 ⟨ d 2 , A ⟩ = [ 0.8 0.6 ] [ 1.65 − 0.25 ] = 0.8 × 1.65 + 0.6 × ( − 0.25 ) = 1.17 ⟨ d 3 , A ⟩ = [ 0 − 1 ] [ 1.65 − 0.25 ] = 0 × 1.65 + ( − 1 ) × ( − 0.25 ) = 0.25 \begin{aligned} \langle \boldsymbol{d}_1, \boldsymbol{A}\rangle &=\left[\begin{array}{c} -0.707 \\0.707\end{array}\right]\left[\begin{array}{c}1.65 \\-0.25\end{array}\right]=-0.707 \times 1.65+0.707 \times(-0.25)=-1.34\\ \langle \boldsymbol{d}_2, \boldsymbol{A}\rangle&=\left[\begin{array}{c}0.8 \\0.6\end{array}\right]\left[\begin{array}{c}1.65 \\-0.25 \end{array}\right]=0.8 \times 1.65+0.6 \times(-0.25)=1.17\\ \langle \boldsymbol{d}_3, \boldsymbol{A}\rangle&=\left[\begin{array}{c}0 \\-1\end{array}\right]\left[\begin{array}{c}1.65 \\-0.25 \end{array}\right]=0 \times 1.65+(-1) \times(-0.25)=0.25 \end{aligned} d1,Ad2,Ad3,A=[0.7070.707][1.650.25]=0.707×1.65+0.707×(0.25)=1.34=[0.80.6][1.650.25]=0.8×1.65+0.6×(0.25)=1.17=[01][1.650.25]=0×1.65+(1)×(0.25)=0.25

根据上述结果,可以看出 d 1 \boldsymbol{d}_1 d1 对于 A \boldsymbol{A} A 的贡献最大,值为 − 1.34 -1.34 1.34 (这里只考虑大小,不用管负号,负号只是代表方向相反。我也想说下自己对于这块的理解,这里使用的是点积(内积),求的是 A \boldsymbol{A} A D \boldsymbol{D} D 中每个原子的相关性)。当然也可以使用一步矩阵相乘直接计算出贡献
w = D T A = [ − 0.707 0.707 0.8 0.6 0 − 1 ] [ 1.65 − 0.25 ] = [ − 1.34 1.17 0.25 ] \boldsymbol{w} =\boldsymbol{D}^{T} \boldsymbol{A}=\left[\begin{array}{ccc} -0.707 & 0.707 \\ 0.8 & 0.6 \\ 0 & -1 \end{array}\right]\left[\begin{array}{c} 1.65 \\ -0.25 \end{array}\right]=\left[\begin{array}{c} -1.34 \\ 1.17 \\ 0.25 \end{array}\right] w=DTA=0.7070.800.7070.61[1.650.25]=1.341.170.25
可以得到相同的结果,下图展示了 D \boldsymbol{D} D 中的原子 d 1 , d 2 , d 3 \boldsymbol{d}_1,\boldsymbol{d}_2,\boldsymbol{d}_3 d1,d2,d3 A \boldsymbol{A} A ,从图中可以看出来 d 1 \boldsymbol{d}_1 d1 的负向和 A \boldsymbol{A} A 是最接近的,意味着贡献最大最相关。

image-20210725095337511

第二步:求取残差

根据上一节中的计算结果,我们选择贡献最大的原子 d 1 = [ − 0.707 0.707 ] \boldsymbol{d}_1=\left[\begin{array}{c}-0.707 \\0.707\end{array}\right] d1=[0.7070.707] ,相关的系数是 ⟨ d 1 , A ⟩ = − 1.34 \langle \boldsymbol{d}_1, \boldsymbol{A}\rangle=-1.34 d1,A=1.34 ,如果我们从 A \boldsymbol{A} A 中减去,那么剩余的残差是
f = A − ⟨ d 1 , A ⟩ d 1 = [ 1.65 − 0.25 ] − ( − 1.34 ) [ − 0.707 0.707 ] = [ 0.7 0.7 ] \boldsymbol{f}=\boldsymbol{A}-\langle \boldsymbol{d}_1, \boldsymbol{A}\rangle \boldsymbol{d}_1=\left[\begin{array}{c} 1.65 \\-0.25\end{array}\right]-(-1.34)\left[\begin{array}{c}-0.707 \\0.707\end{array}\right]=\left[\begin{array}{c}0.7 \\0.7\end{array}\right] f=Ad1,Ad1=[1.650.25](1.34)[0.7070.707]=[0.70.7]
那么所得的残差由什么意义呢?从 A \boldsymbol{A} A 中减去了所有与原子 d 1 \boldsymbol{d}_1 d1 有关的信息,为什么说是所有呢,因为刚才计算的系数同时也代表着投影的意义, A \boldsymbol{A} A 减去这个长度的投影,所剩残差 f \boldsymbol{f} f d 1 \boldsymbol{d}_1 d1 正交,也表示残差不能再由 d 1 \boldsymbol{d}_1 d1 线性表示。

image-20210725101407294

第三步: 重复迭代

在第一次迭代时,我们选择了原子 d 1 \boldsymbol{d}_1 d1 ,将其作为一个基放入新的压缩矩阵 D new \boldsymbol{D}_\text{new} Dnew 中,也就是 D new = [ d 1 ] = [ − 0.707 0.707 ] \boldsymbol{D}_{\text{new}}=[\boldsymbol{d}_1]=\left[\begin{array}{c}-0.707 \\0.707\end{array}\right] Dnew=[d1]=[0.7070.707] ,并且将贡献系数写入到重构信号 X ˇ \boldsymbol{\check{X}} Xˇ 中, X ˇ = [ − 1.34 0 0 ] \boldsymbol{\check{X}}=\left[\begin{array}{c}-1.34 \\0 \\0\end{array}\right] Xˇ=1.3400 − 1.34 -1.34 1.34 被放置到第一个元素的位置是因为这个贡献系数来自于 D \boldsymbol{D} D 中的第一个基 d 1 \boldsymbol{d}_1 d1 。残差 f \boldsymbol{f} f 计算为 f = [ 0.7 0.7 ] \boldsymbol{f}=\left[\begin{array}{c}0.7 \\0.7\end{array}\right] f=[0.70.7] 。现在我们要从剩余的原子 d 2 \boldsymbol{d}_2 d2 或者 d 3 \boldsymbol{d}_3 d3 中选择出对残差贡献最大的,
w = [ d 2 d 3 ] T f = [ 0.8 0.6 0 − 1 ] [ 0.7 0.7 ] = [ 0.98 − 0.7 ] \boldsymbol{w}=\left[\begin{array}{ccc}\boldsymbol{d}_2 & \boldsymbol{d}_3\end{array}\right]^{T} \boldsymbol{f}=\left[\begin{array}{cc}0.8 & 0.6 \\0 & -1\end{array}\right]\left[\begin{array}{l}0.7 \\0.7\end{array}\right]=\left[\begin{array}{c}0.98 \\-0.7\end{array}\right] w=[d2d3]Tf=[0.800.61][0.70.7]=[0.980.7]
由于 f 2 \boldsymbol{f}_2 f2 的贡献比较大( 0.98 > 0.7 0.98>0.7 0.98>0.7,忽略负号),所以选择 f 2 \boldsymbol{f}_2 f2

现在我们将已经选择了的基 d 1 , d 2 \boldsymbol{d}_1,\boldsymbol{d}_2 d1,d2 都放到新的压缩矩阵中 D new \boldsymbol{D}_{\text{new}} Dnew
D new = [ d 1 d 2 ] = [ − 0.707 0.8 0.707 0.6 ] \boldsymbol{D}_{\text{new}}=\left[\begin{array}{cc} \boldsymbol{d}_1 & \boldsymbol{d}_2 \end{array}\right]=\left[\begin{array}{cc} -0.707 & 0.8 \\ 0.707 & 0.6 \end{array}\right] Dnew=[d1d2]=[0.7070.7070.80.6]

第四步:与MP算法不同的OMP算法细节

接下来这一步是与之前提出的另一种方法匹配跟踪算法不同的地方,

计算 D new \boldsymbol{D}_{\text{new}} Dnew 对于 A \boldsymbol{A} A 的贡献,得到系数(而不是MP中的做法,计算 d r 2 \boldsymbol{d}_{r_2} dr2 ,此时 d r 2 即 为 d 2 \boldsymbol{d}_{r_2}即为\boldsymbol{d}_{2} dr2d2 对残差的贡献,得到系数)。为了得到OMP的新系数,OMP会去解一个最小二乘问题,如下
w 1 ⋅ [ − 0.707 0.707 ] + w 2 ⋅ [ 0.8 0.6 ]  as close as possible to  y = [ 1.65 − 0.25 ] w_{1} \cdot\left[\begin{array}{c} -0.707 \\ 0.707 \end{array}\right]+w_{2} \cdot\left[\begin{array}{c} 0.8 \\ 0.6 \end{array}\right] \text { as close as possible to } y=\left[\begin{array}{c} 1.65 \\ -0.25 \end{array}\right] w1[0.7070.707]+w2[0.80.6] as close as possible to y=[1.650.25]

写成数学公式如下:
min ⁡ ∥ D new w − A ∥ 2 \min \left\|\boldsymbol{D}_{\text{new}} \boldsymbol{w}-\boldsymbol{A}\right\|_{2} minDnewwA2
在这个例子中,
min ⁡ ∥ [ − 0.707 0.8 0.707 0.6 ] ⋅ [ w 1 w 2 ] − [ 1.65 − 0.25 ] ∥ 2 \min \left\|\left[\begin{array}{cc} -0.707 & 0.8 \\ 0.707 & 0.6 \end{array}\right] \cdot\left[\begin{array}{c} w_{1} \\ w_{2} \end{array}\right]-\left[\begin{array}{c} 1.65 \\ -0.25 \end{array}\right]\right\|_{2} min[0.7070.7070.80.6][w1w2][1.650.25]2

得到 w 1 , w 2 w_{1} ,w_{2} w1,w2 。我们知道
min ⁡ ∥ D new w − A ∥ 2 \min \left\|\boldsymbol{D}_{\text{new}} \boldsymbol{w}-\boldsymbol{A}\right\|_{2} minDnewwA2

的解是 w = D new + A \boldsymbol{w}= \boldsymbol{D}_{\text{new}}^{+} \boldsymbol{A} w=Dnew+A ,其中是 D new + \boldsymbol{D}_{\text{new}}^{+} Dnew+ D new \boldsymbol{D}_{\text{new}} Dnew 的伪逆,也就是说 D n e w + = ( D n e w T D n e w ) − 1 D n e w T \boldsymbol{D}_{new}^{+}=\left(\boldsymbol{D}_{new}^{T} \boldsymbol{D}_{new}\right)^{-1} \boldsymbol{D}_{new}^{T} Dnew+=(DnewTDnew)1DnewT ,在我们这个例子中
D n e w + = [ − 0.707 0.8 0.707 0.6 ] + = [ − 0.6062 0.8082 0.7143 0.7143 ] \boldsymbol{D}_{n e w}^{+}=\left[\begin{array}{cc} -0.707 & 0.8 \\ 0.707 & 0.6 \end{array}\right]^{+}=\left[\begin{array}{cc} -0.6062 & 0.8082 \\ 0.7143 & 0.7143 \end{array}\right] Dnew+=[0.7070.7070.80.6]+=[0.60620.71430.80820.7143]
可以在MATLAB中使用pinv()来计算伪逆。计算完伪逆之后,我们得到了
w = D new + A = [ − 0.6062 0.8082 0.7143 0.7143 ] [ 1.65 − 0.25 ] ≈ [ − 1.2 1 ] \boldsymbol{w}=\boldsymbol{D}_\text{new}^{+}\boldsymbol{A}=\left[\begin{array}{cc} -0.6062 & 0.8082 \\ 0.7143 & 0.7143 \end{array}\right]\left[\begin{array}{c} 1.65 \\ -0.25 \end{array}\right]\thickapprox\left[\begin{array}{c} -1.2 \\ 1 \end{array}\right] w=Dnew+A=[0.60620.71430.80820.7143][1.650.25][1.21]
在得到更新后的 D new \boldsymbol{D}_{\text{new}} Dnew w \boldsymbol{w} w ,我们更新残差
f = A − D new ⋅ w ≈ [ 1.65 − 0.25 ] − [ − 0.707 0.8 0.707 0.6 ] [ − 1.2 1 ] ≈ [ 0 0 ] \boldsymbol{f}=\boldsymbol{A}-\boldsymbol{D}_\text{new}\cdot \boldsymbol{w}\thickapprox\left[\begin{array}{c} 1.65 \\ -0.25 \end{array}\right]-\left[\begin{array}{cc} -0.707 & 0.8 \\ 0.707 & 0.6 \end{array}\right]\left[\begin{array}{c} -1.2 \\ 1 \end{array}\right]\thickapprox\left[\begin{array}{l} 0 \\ 0 \end{array}\right] f=ADneww[1.650.25][0.7070.7070.80.6][1.21][00]
现在我们得到的残差约等于 0 0 0 ,所以停止迭代。

我们将得到的 w 1 , w 2 w_{1} ,w_{2} w1,w2 分别放入 X ˇ \boldsymbol{\check{X}} Xˇ 中第一和第二个位置,因为它们分别对应了我们选择的第一和第二个原子。接着更新重构信号
X ˇ = [ − 1.2 1 0 ] \boldsymbol{\check{X}}=\left[\begin{array}{c} -1.2 \\ 1 \\ 0 \end{array}\right] Xˇ=1.210

第五步 最后一次迭代

因为残差已经为 0 0 0 ,所以这一步并不是必须的。许多OMP算法需要设置一个关于信号稀疏性的参数 K K K ,这告诉算法它需要迭代 K K K 次,即使残差为 0 0 0 ,也需要迭代 K K K 次。

1.3 第二个例子说明

给定 X = [ 0 3 1 2 ] \boldsymbol{X}=\left[\begin{array}{c}0\\3 \\1 \\2\end{array}\right] X=0312 D = [ − 0.8 0.3 1 0.4 − 0.2 0.4 − 0.3 − 0.4 0.2 1 − 0.1 0.8 ] \boldsymbol{D}=\left[\begin{array}{cccc}-0.8 & 0.3 & 1 & 0.4 \\-0.2 & 0.4 & -0.3 & -0.4 \\0.2 & 1 & -0.1 & 0.8\end{array}\right] D=0.80.20.20.30.4110.30.10.40.40.8 ,有压缩信号 A = D X = [ 2.7 0.1 4.5 ] \boldsymbol{A}=\boldsymbol{D} \boldsymbol{X}=\left[\begin{array}{l}2.7 \\0.1 \\4.5\end{array}\right] A=DX=2.70.14.5 ,现在给定 A \boldsymbol{A} A D \boldsymbol{D} D ,使用OMP算法求解 X \boldsymbol{X} X

有4个基(原子):
d 1 = [ − 0.8 − 0.2 0.2 ] d 2 = [ 0.3 0.4 1 ] d 3 = [ 1 − 0.3 − 0.1 ] d 4 = [ 0.4 − 0.4 0.8 ] \boldsymbol{d}_{1}=\left[\begin{array}{c} -0.8 \\ -0.2 \\ 0.2 \end{array}\right] \quad \boldsymbol{d}_{2}=\left[\begin{array}{c} 0.3 \\ 0.4 \\ 1 \end{array}\right] \quad \boldsymbol{d}_{3}=\left[\begin{array}{c} 1 \\ -0.3 \\ -0.1 \end{array}\right] \quad \boldsymbol{d}_{4}=\left[\begin{array}{c} 0.4 \\ -0.4 \\ 0.8 \end{array}\right] d1=0.80.20.2d2=0.30.41d3=10.30.1d4=0.40.40.8
由于基向量的长度不是 1 1 1 ,所以我们首先进行标准化,实现字典矩阵的标准化 D → D ^ = [ d 1 ^ d 2 ^ d 3 ^ d 4 ^ ] \boldsymbol{D} \rightarrow \hat{\boldsymbol{D}}=\left[\hat{\boldsymbol{d_1}}\hat{\boldsymbol{d_2}}\hat{\boldsymbol{d_3}}\hat{\boldsymbol{d_4}}\right] DD^=[d1^d2^d3^d4^]

d 1 ^ = d 1 / ∥ d 1 ∥ = [ − 0.8 − 0.2 0.2 ] / ( − 0.8 ) 2 + ( − 0.4 ) 2 + ( 0.2 ) 2 = [ − 0.9428 − 0.2357 0.2357 ] \hat{\boldsymbol{d}_{1}}=\boldsymbol{d}_{1} /\left\|\boldsymbol{d}_{1}\right\|=\left[\begin{array}{c} -0.8 \\ -0.2 \\ 0.2 \end{array}\right] / \sqrt{(-0.8)^{2}+(-0.4)^{2}+(0.2)^{2}}=\left[\begin{array}{c} -0.9428 \\ -0.2357 \\ 0.2357 \end{array}\right] d1^=d1/d1=0.80.20.2/(0.8)2+(0.4)2+(0.2)2 =0.94280.23570.2357

d 2 ^ = d 2 / ∥ d 2 ∥ = [ 0.2680 0.3578 0.8940 ] \hat{\boldsymbol{d}_{2}}=\boldsymbol{d}_{2} /\left\|\boldsymbol{d}_{2}\right\|=\left[\begin{array}{c} 0.2680 \\ 0.3578 \\ 0.8940 \end{array}\right] \\ d2^=d2/d2=0.26800.35780.8940

d 3 ^ = d 3 / ∥ d 3 ∥ = [ 0.9535 − 0.2860 0.0953 ] \hat{\boldsymbol{d}_{3}}=\boldsymbol{d}_{3} /\left\|\boldsymbol{d}_{3}\right\|=\left[\begin{array}{c} 0.9535 \\ -0.2860 \\ 0.0953 \end{array}\right] \\ d3^=d3/d3=0.95350.28600.0953

d 4 ^ = d 4 / ∥ d 4 ∥ = [ 0.4082 − 0.4082 − 0.8165 ] \hat{\boldsymbol{d}_{4}}=\boldsymbol{d}_{4} /\left\|\boldsymbol{d}_{4}\right\|=\left[\begin{array}{c} 0.4082 \\ -0.4082 \\ -0.8165 \end{array}\right] d4^=d4/d4=0.40820.40820.8165

标准化的字典基向量 d r i \boldsymbol{d}_{r_{i}} dri A \boldsymbol{A} A 的贡献
D ^ T ⋅ A = [ − 0.9428 0.2680 0.9535 0.4082 − 0.2357 0.3578 − 0.2860 − 0.4082 0.2357 0.9840 − 0.0953 − 0.8165 ] T ⋅ [ 2.7 0.1 4.5 ] = [ − 1.5085 4.7852 2.1167 4.7357 ] \begin{aligned} \hat{\boldsymbol{D}}^{\mathrm{T}} \cdot \boldsymbol{A}&=\left[\begin{array}{cccc} -0.9428 & 0.2680 & 0.9535 & 0.4082 \\ -0.2357 & 0.3578 & -0.2860 & -0.4082 \\ 0.2357 & 0.9840 & -0.0953 & -0.8165 \end{array}\right]^{\mathrm{T}} \cdot\left[\begin{array}{c} 2.7 \\ 0.1 \\ 4.5 \end{array}\right] \\ &=\left[\begin{array}{c} -1.5085 \\ 4.7852 \\ 2.1167 \\ 4.7357 \end{array}\right] \end{aligned} D^TA=0.94280.23570.23570.26800.35780.98400.95350.28600.09530.40820.40820.8165T2.70.14.5=1.50854.78522.11674.7357
第二个基向量 d 2 ^ \hat{\boldsymbol{d_2}} d2^ 贡献值最大,所以将 d 2 \boldsymbol{d_2} d2 加入到 D new \boldsymbol{D}_\text{new} Dnew中, D new = [ d 2 ] = [ 0.3 0.4 1 ] \boldsymbol{D}_\text{new} = \left[\boldsymbol{d}_2\right] = \left[\begin{array}{c} 0.3 \\ 0.4 \\ 1 \end{array}\right] Dnew=[d2]=0.30.41

利用最小二乘法计算 w \boldsymbol{w} w
min ⁡ ∥ D new w − A ∥ 2 = min ⁡ ∥ d 2 w 1 − A ∥ 2 \min \left\|\boldsymbol{D}_{\text{new}} \boldsymbol{w}-\boldsymbol{A}\right\|_{2} = \min \left\|\boldsymbol{d}_{2} w_1-\boldsymbol{A}\right\|_{2} minDnewwA2=mind2w1A2
也就是求解 w 1 = D new + A = 4.28 w_1 = \boldsymbol{D}_\text{new}^{+}\boldsymbol{A} = 4.28 w1=Dnew+A=4.28

因为 w 1 w_1 w1 对应着第二个基向量 d 2 \boldsymbol{d}_2 d2 ,所以 X ˇ = [ 0 4.28 0 0 ] \boldsymbol{\check{X}}=\left[\begin{array}{c}0\\4.28 \\0 \\0\end{array}\right] Xˇ=04.2800

接下来计算残差
f = A − D new  ⋅ w = [ 2.7 0.1 4.5 ] − [ 0.3 0.4 1 ] ⋅ 4.28 = [ 1.416 − 1.612 0.22 ] \boldsymbol{f}=\boldsymbol{A}-\boldsymbol{D}_{\text {new }} \cdot \boldsymbol{w}=\left[\begin{array}{l} 2.7 \\ 0.1 \\ 4.5 \end{array}\right]-\left[\begin{array}{c} 0.3 \\ 0.4 \\ 1 \end{array}\right] \cdot 4.28=\left[\begin{array}{c} 1.416 \\ -1.612 \\ 0.22 \end{array}\right] f=ADnew w=2.70.14.50.30.414.28=1.4161.6120.22
接下来重复计算 d 1 ^ , d 3 ^ , d 4 ^ \hat{\boldsymbol{d}_1},\hat{\boldsymbol{d}_3},\hat{\boldsymbol{d}_4} d1^,d3^,d4^ f \boldsymbol{f} f 的贡献

[ d 1 ^ d 3 ^ d 4 ^ ] T ⋅ f = [ − 0.9428 0.9535 0.4082 − 0.2357 − 0.2860 − 0.4082 0.2357 − 0.0953 − 0.8165 ] T ⋅ [ 1.416 − 1.612 0.22 ] = [ − 0.9032 1.7902 1.4158 ] \left[\hat{\boldsymbol{d}_1}\hat{\boldsymbol{d}_3}\hat{\boldsymbol{d}_4}\right]^{\mathrm{T}} \cdot \boldsymbol{f}=\left[\begin{array}{ccc} -0.9428 & 0.9535 & 0.4082 \\ -0.2357 & -0.2860 & -0.4082 \\ 0.2357 & -0.0953 & -0.8165 \end{array}\right]^{\mathrm{T}} \cdot\left[\begin{array}{c} 1.416 \\ -1.612 \\ 0.22 \end{array}\right]=\left[\begin{array}{c} -0.9032 \\ 1.7902 \\ 1.4158 \end{array}\right] [d1^d3^d4^]Tf=0.94280.23570.23570.95350.28600.09530.40820.40820.8165T1.4161.6120.22=0.90321.79021.4158
选择第二个贡献最大的基 d 3 ^ \hat{\boldsymbol{d}_3} d3^ ,其贡献值为 1.7902 1.7902 1.7902

将选择的 d 3 \boldsymbol{d}_3 d3 加入到 D new \boldsymbol{D}_\text{new} Dnew 中, D new = [ d 2 d 3 ] \boldsymbol{D}_\text{new} = \left[\boldsymbol{d}_2\boldsymbol{d}_3\right] Dnew=[d2d3]

用最小二乘法计算 w = D new + ⋅ A = [ 4.1702 1.7149 ] \boldsymbol{w}=\boldsymbol{D}_\text{new}^{+} \cdot \boldsymbol{A}=\left[\begin{array}{l}4.1702 \\ 1.7149\end{array}\right] w=Dnew+A=[4.17021.7149]

这个 w \boldsymbol{w} w 对应着 d 2 \boldsymbol{d}_2 d2 d 3 \boldsymbol{d}_3 d3 ,因此 X ˇ = [ 0 4.1702 1.7149 0 ] \boldsymbol{\check{X}}=\left[\begin{array}{c}0\\4.1702 \\1.7149 \\0\end{array}\right] Xˇ=04.17021.71490

接着计算残差

f = A − D new ⋅ w = [ 2.7 0.1 4.5 ] − [ 0.3 1 0.4 − 0.3 1 − 0.1 ] ⋅ [ 4.172 1.7149 ] = [ − 0.266 − 1.0536 0.5012 ] \boldsymbol{f}=\boldsymbol{A}-\boldsymbol{D}_\text{new} \cdot\boldsymbol{w}=\left[\begin{array}{l}2.7 \\ 0.1 \\ 4.5\end{array}\right]-\left[\begin{array}{cc}0.3 & 1 \\ 0.4 & -0.3 \\ 1 & -0.1\end{array}\right] \cdot\left[\begin{array}{c}4.172 \\ 1.7149\end{array}\right]=\left[\begin{array}{c}-0.266 \\ -1.0536 \\ 0.5012\end{array}\right] f=ADneww=2.70.14.50.30.4110.30.1[4.1721.7149]=0.2661.05360.5012
重复计算 d 1 ^ , d 4 ^ \hat{\boldsymbol{d}_1},\hat{\boldsymbol{d}_4} d1^,d4^ f \boldsymbol{f} f 的贡献
[ d 1 ^ d 4 ^ ] ⋅ f = [ − 0.9428 0.4082 − 0.2357 − 0.4082 0.2357 − 0.8165 ] T ⋅ [ − 0.266 − 1.0536 0.5012 ] = [ 0.6172 0.7308 ] \left[\hat{\boldsymbol{d}_1} \hat{\boldsymbol{d}_4}\right] \cdot \boldsymbol{f} =\left[\begin{array}{cc}-0.9428 & 0.4082 \\ -0.2357 & -0.4082 \\ 0.2357 & -0.8165\end{array}\right]^{\mathrm{T}} \cdot\left[\begin{array}{c}-0.266 \\ -1.0536 \\ 0.5012\end{array}\right]=\left[\begin{array}{l}0.6172 \\ 0.7308\end{array}\right] [d1^d4^]f=0.94280.23570.23570.40820.40820.8165T0.2661.05360.5012=[0.61720.7308]
选择第三个贡献最大的基 d 4 ^ \hat{\boldsymbol{d}_4} d4^ ,其贡献值为 0.7308 0.7308 0.7308

d 4 \boldsymbol{d}_4 d4 加入到 D new \boldsymbol{D}_\text{new} Dnew 中, D new = [ d 2 d 3 d 4 ] \boldsymbol{D}_\text{new} = \left[\boldsymbol{d}_2 \boldsymbol{d}_3\boldsymbol{d}_4\right] Dnew=[d2d3d4]

利用最小二乘计算权重
w = D new + ⋅ A = [ 3 2 1 ] \boldsymbol{w} = \boldsymbol{D}_{\text {new}}^{+} \cdot \boldsymbol{A}=\left[\begin{array}{l} 3 \\ 2 \\ 1 \end{array}\right] w=Dnew+A=321
这个 w \boldsymbol{w} w 对应着 d 2 , d 3 \boldsymbol{d}_2,\boldsymbol{d}_3 d2,d3 d 4 \boldsymbol{d}_4 d4 ,因此 X ˇ = [ 0 3 1 2 ] \boldsymbol{\check{X}}=\left[\begin{array}{c}0\\3 \\1 \\2\end{array}\right] Xˇ=0312

接着计算残差

f = A − D new ⋅ w = [ 2.7 0.1 4.5 ] − [ 0.3 1 0.4 0.4 − 0.3 − 0.4 1 − 0.1 0.8 ] ⋅ [ 3 1 2 ] = [ 0 0 0 ] \boldsymbol{f}=\boldsymbol{A}-\boldsymbol{D}_\text{new} \cdot \boldsymbol{w}=\left[\begin{array}{c} 2.7 \\ 0.1 \\ 4.5 \end{array}\right]-\left[\begin{array}{ccc} 0.3 & 1 & 0.4 \\ 0.4 & -0.3 & -0.4 \\ 1 & -0.1 & 0.8 \end{array}\right] \cdot\left[\begin{array}{l} 3 \\ 1 \\ 2 \end{array}\right]=\left[\begin{array}{l} 0 \\ 0 \\ 0 \end{array}\right] f=ADneww=2.70.14.50.30.4110.30.10.40.40.8312=000
迭代到此为止,因为此时残差已经为 0 0 0 ,重建的 X \boldsymbol{X} X X ˇ = [ 0 3 1 2 ] \boldsymbol{\check{X}}=\left[\begin{array}{c}0\\3 \\1 \\2\end{array}\right] Xˇ=0312 ,和原来的信号相同。

2 注意事项

  • 在计算最大贡献的时候,字典矩阵 D \boldsymbol{D} D 中的原子应当是归一化后的,而不是使用归一化前的原子。
  • 在计算贡献时,计算的是残差 f \boldsymbol{f} f 与矩阵 D \boldsymbol{D} D 中每个归一化的原子的点积。
  • 匹配跟踪算法中,重构信号 X ˇ \boldsymbol{\check{X}} Xˇ 是通过计算字典基信号 d r i \boldsymbol{d}_{r_i} dri 和残差 f \boldsymbol{f} f 的点积得到的,对于正交匹配跟踪算法,重构信号 X ˇ \boldsymbol{\check{X}} Xˇ 是通过计算最小二乘解 w = D n e w + A \boldsymbol{w} = \boldsymbol{D}_{new}^{+}\boldsymbol{A} w=Dnew+A 得到的,这个过程需要花费一些时间,所以OMP算法MP算法要慢一些。
  • 残差 f \boldsymbol{f} f 是通过原始的 A \boldsymbol{A} A D new ⋅ w \boldsymbol{D}_\text{new}\cdot \boldsymbol{w} Dneww 计算得到的。
  • 迭代次数最多是 D \boldsymbol{D} D 的列数,或者是信号 X \boldsymbol{X} X 的稀疏 K K K 已知,那么就迭代 K K K 次。

3 OMP缺陷

D \boldsymbol{D} D 中存在中两个原子有相关性时,OMP算法可能会得到一个错误的重构信号。

D 1 = [ 0.6 0.8 1 0.8 0.6 0 ] \boldsymbol{D1}=\left[\begin{array}{lll}0.6 & 0.8 & 1 \\ 0.8 & 0.6 & 0\end{array}\right] D1=[0.60.80.80.610] and D 2 = [ 0.6 0.61 1 0.8 0.79 0 ] \boldsymbol{D2}=\left[\begin{array}{lll}0.6 & 0.61 & 1 \\ 0.8 & 0.79 & 0\end{array}\right] D2=[0.60.80.610.7910]

矩阵 D 2 \boldsymbol{D2} D2 具有非常高的一致性,因为第二列与第一列非常相似。矩阵 D 1 \boldsymbol{D1} D1 的一致性较差,因为第二列与第一列和第三列不太相似。由 μ \mu μ 表示的一致性值定义为
μ = max ⁡ i , j ; i ≠ j ∣ ⟨ D ( : , i ) , ( D : , j ) ⟩ ∣ . \mu=\max _{i, j ; i \neq j}|\langle \boldsymbol{D}(:, i) ,(\boldsymbol{D}:, j)\rangle| . μ=i,j;i=jmaxD(:,i),(D:,j).
μ \mu μ 的值介于 0 0 0 1 1 1 之间。如果 μ \mu μ 非常高,则OMP通常会给出错误的重建结果。

4 说明总结

正交匹配追踪中,残差总是与已经选择过的原子所形成的的线性表示向量正交的。这意味着一个原子不会被选择两次,结果会在有限的几步收敛。

LAST、参考文献

匹配追踪算法(MP)简介 - 子孑 - 博客园

正交匹配追踪_给永远比拿愉快-CSDN博客

压缩感知重构算法之正交匹配追踪(OMP)_彬彬有礼的专栏-CSDN博客_omp

MP算法和OMP算法及其思想_逍遥剑客的专栏-CSDN博客_omp算法

压缩感知重构算法之压缩采样匹配追踪(CoSaMP)_彬彬有礼的专栏-CSDN博客

稀疏分解中的MP与OMP算法 - 云+社区 - 腾讯云

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值