l1范数最小化求解系数方程_正交匹配追踪法(orthogonal matching pursuit)

l1范数最小化求解系数方程:正交匹配追踪法(orthogonal matching pursuit)

本文部分参考[0]

目录

  • l1范数最小化求解系数方程正交匹配追踪法orthogonal matching pursuit
      • 目录
    • 贪婪算法
      • 匹配追踪法
      • 正交匹配追踪
    • 正交匹配追踪算法
      • Matlab 实现

贪婪算法

正交匹配追踪法是信号处理中拟合稀疏模型的一种贪婪分布最小二乘法(greedy stepwise least squares)法。

贪婪算法(greedy algorithm)的基本思想是:不求整体最优解,而是试图尽快找到某种意义上的局部最优解。贪婪法虽然不能对所有问题得到整体最优解,但对范围相当广泛的许多问题能产生整体最优解或者整体最优解的近似解。和使用凸优化算法的l1范数相比,贪婪算法在速度上具有很大优势。典型的贪婪算法有匹配追踪法和正交匹配追踪法:

匹配追踪法

匹配追踪法(matching pursuit, MP) 是由法兰西大牛Mallat于1993年提出。其基本思想是,不针对某个代价函数进行最小化,而是考虑迭代地构造一个稀疏解 x : 只使用字典矩阵 A 的少数列向量的线性组合对观测向量 x 实现稀疏逼近 Ax=y ,其中字典矩阵 A 被选择的列向量所组成的集合是以逐列的方式建立的。在每一步迭代,字典矩阵中通当前残差向量 r=Axy 中最相似的列向量被选择作为作用集的新一列。如果残差随着迭代的进行递减,则可以保证算法的收敛。

正交匹配追踪

匹配追踪只能保证残差向量与每一步迭代所选的字典矩阵列向量正交,但与以前选择的列向量一般不正交。正交匹配追踪(orthogonal matching pursuit, OMP)则能保证每步迭代后残差向量与以前选择的所有列向量正交,以保证迭代的最优性,从而减少了迭代次数,性能也更稳健。


正交匹配追踪算法

输入 观测数据向量 yRm 和字典矩阵 ARm×n .
输出 稀疏系数向量 xRn .
Step 1 初始化 令标签集 Ω0= ,初始残差向量 r0=y ,令 k=1 .
Step 2 辨识 求矩阵 A 中与残差向量 rk1 最强相关的列
jk argmax j|<rk1,ϕj>|,Ωk=Ωk1jk
Step 3 估计 最小化问题 min xyAΩkx 的解由
xk=(AHΩkAΩk)1AHΩky 给出,其中
AΩk=[aω1,...,aωk],ω1,...,ωkΩk
Step 4 更新残差
rk=yAΩkxk
Step 5 k=k+1 ,并重复Step 2Step 4。若某个停止判据满足,则停止迭代。
Step 6 输出系数向量
x(i)=xk(i), if iΩk
x(i)=0, otherwise

注: AH 为共轭转置

下面是三种常用的停止判据
1. 运行到某个固定的迭代步数后停止。
2. 残差能量小于某个预先给定值 ε
rk2ε
3. 当字典矩阵 A 的任何一列都没有残差向量 rk 的明显能量时
AHrkε

Matlab 实现

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]: 矩阵分析与应用 第二版 张贤达

你可能感兴趣的:(压缩感知)