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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Codeur/article/details/70808907

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

本文部分参考[0]

目录

贪婪算法

正交匹配追踪法是信号处理中拟合稀疏模型的一种贪婪分布最小二乘法(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最强相关的列
jkargmaxj|<rk1,ϕj>|,Ωk=Ωk1jk
Step 3 估计 最小化问题 minxyAΩkx的解由
xk=(AHΩkAΩk)1AHΩky给出,其中
AΩk=[aω1,...,aωk],ω1,...,ωkΩk
Step 4 更新残差
rk=yAΩkxk
Step 5k=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]: 矩阵分析与应用 第二版 张贤达

展开阅读全文

没有更多推荐了,返回首页