本文部分参考[0]
正交匹配追踪法是信号处理中拟合稀疏模型的一种贪婪分布最小二乘法(greedy stepwise least squares)法。
贪婪算法(greedy algorithm)的基本思想是:不求整体最优解,而是试图尽快找到某种意义上的局部最优解。贪婪法虽然不能对所有问题得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者整体最优解的近似解。和使用凸优化算法的l1范数相比,贪婪算法在速度上具有很大优势。典型的贪婪算法有匹配追踪法和正交匹配追踪法:
匹配追踪法(matching pursuit, MP) 是由法兰西大牛Mallat于1993年提出。其基本思想是,不针对某个代价函数进行最小化,而是考虑迭代地构造一个稀疏解 x : 只使用字典矩阵 A 的少数列向量的线性组合对观测向量 x 实现稀疏逼近 Ax=y ,其中字典矩阵 A 被选择的列向量所组成的集合是以逐列的方式建立的。在每一步迭代,字典矩阵中通当前残差向量 r=Ax−y 中最相似的列向量被选择作为作用集的新一列。如果残差随着迭代的进行递减,则可以保证算法的收敛。
匹配追踪只能保证残差向量与每一步迭代所选的字典矩阵列向量正交,但与以前选择的列向量一般不正交。正交匹配追踪(orthogonal matching pursuit, OMP)则能保证每步迭代后残差向量与以前选择的所有列向量正交,以保证迭代的最优性,从而减少了迭代次数,性能也更稳健。
输入 观测数据向量 y∈Rm 和字典矩阵 A∈Rm×n .
输出 稀疏系数向量 x∈Rn .
Step 1 初始化 令标签集 Ω0=∅ ,初始残差向量 r0=y ,令 k=1 .
Step 2 辨识 求矩阵 A 中与残差向量 rk−1 最强相关的列
jk∈ argmax j|<rk−1,ϕj>|,Ωk=Ωk−1∪jk
Step 3 估计 最小化问题 min x∥y−AΩkx∥ 的解由
xk=(AHΩkAΩk)−1AHΩky 给出,其中
AΩk=[aω1,...,aωk],ω1,...,ωk∈Ωk
Step 4 更新残差
rk=y−AΩkxk
Step 5 令 k=k+1 ,并重复Step 2 至Step 4。若某个停止判据满足,则停止迭代。
Step 6 输出系数向量
x(i)=xk(i), if i∈Ωk
x(i)=0, otherwise
注: AH 为共轭转置
下面是三种常用的停止判据
1. 运行到某个固定的迭代步数后停止。
2. 残差能量小于某个预先给定值 ε 。
∥rk∥2≤ε
3. 当字典矩阵 A 的任何一列都没有残差向量 rk 的明显能量时
∥AHrk∥∞≤ε
function [x, Out] = OMP(A,y,varargin)
% This is a l1 minimization solver for orthogonal matching pursuit:
% minimize ||x||_1
% subject to y = Ax,
% -----------------------------------------------------------------
% Author: Beier ZHU
% Tsinghua University
% -----------------------------------------------------------------
%
% =========================Required inputs=========================
% A -- an m x n matrix
% y -- an m x 1 vector
% =========================Optional inputs=========================
% 'maxIter' -- maximum number of iterations
% 'StopTolerance' -- stopping tolerance
% ===========================Outputs===============================
% x -- last iterate (hopefully an approximate solution)
% Out.iter -- # of iterations taken
% Test for number of required parametres
if (nargin-length(varargin)) ~= 2
error('Wrong number of required parameters');
end
%--------------------------------------------------------------
% Set parameters to their defaults
%--------------------------------------------------------------
opts.tol = 1e-3;
opts.maxIter = 1e3;
%--------------------------------------------------------------
% Set parameters to user specified values
%--------------------------------------------------------------
if (rem(length(varargin),2)==1)
error('Options should be given in pairs');
else
for i=1:2:(length(varargin)-1)
switch upper(varargin{i})
case 'STOPTOLERANCE'
opts.tol = varargin{i+1};
case 'MAXITER'
opts.maxit = varargin{i+1};
otherwise
error(['Unrecognized option: ''' varargin{i} '''']);
end
end
[m_A, n] = size(A);
[m_y, n_y] = size(y);
if n_y ~= 1
error(['y must be a column vector']);
end
if m_A ~= m_y
error(['A and y must have same # of row'])
end
% --------------------------------------------------------------
x = zeros(n,1);
Omega = [];
A_Omega = [];
r = y;
iter = 1;
varepsilon = 1e-3; % step 1
while true
[~, max_index] = max(abs(A'*r));
Omega = [Omega max_index];
A_Omega = [A_Omega A(:,max_index)]; % step 2
x_k = A_Omega\y; % step 3
r = y - A_Omega*x_k; % step 3
iter = iter + 1; % step 4
if (iter > opts.maxIter) || (norm(r) <= opts.tol) || (norm(A'*r, inf) <= varepsilon)
break; % 终止条件
end
end
x(Omega) = x_k; %step 5
Out.iter = iter;
end
'''
[0]: 矩阵分析与应用 第二版 张贤达