压缩感知重构算法之基追踪(Basis Pursuit, BP)

  原文地址    :http://blog.csdn.net/jbb0523/article/details/51986554#comments

  在此对作者表示深深的谢意!!

除匹配追踪类贪婪迭代算法之外,压缩感知重构算法另一大类就是凸优化算法或最优化逼近方法,这类方法通过将非凸问题转化为凸问题求解找到信号的逼近,其中最常用的方法就是基追踪(Basis Pursuit, BP),该方法提出使用l1范数替代l0范数来解决最优化问题,以便使用线性规划方法来求解[1]。本篇我们就来讲解基追踪方法。

        理解基追踪方法需要一定的最优化知识基础,可参见最优化方法分类中的内容。

1、l1范数和l0范数最小化的等价问题

        在文献【2】的第4部分,较为详细的证明了l1范数与l0范数最小化在某条件下等价。证明过程是一个比较复杂的数学推导,这里尽量引用文献中的原文来说明。

        首先,在文献【2】的4.1节,给出了(P1)问题,并给出了(P1)的线性规划等价形式(LP),这个等价关系后面再详叙。

        然后在文献【2】的4.2节直接谈到l1l0最小化的关系,先是定义了压缩感知要解决的(P0)问题,然后指出“当(P0)有一个稀疏解,(P1)会找到这个解”,若并在Theorem 8中以定理形式指出“(P0)和(P1)都有相同的惟一解”。

        接下来是一段为了证明Theorem 8过渡性的描述,里面提到l1l0最小化的等价问题已经有很多文献了。


        为了证明Theorem 8,引入了一个引理Lemma4.1 :

        证明完Lemma 4.1后,开始证明Theorem 8 :


        证明过程还是比较复杂的,有兴趣的好好学习研究一下吧。

2、基追踪实现工具箱l1-MAGIC

        若要谈基追踪方法的实现,就必须提到l1-MAGIC工具箱(工具箱主页:http://users.ece.gatech.edu/~justin/l1magic/),在工具箱主页有介绍:L1-MAGIC is a collection of MATLAB routines for solving the convexoptimization programs central to compressive sampling. The algorithms are basedon standard interior-point methods, and are suitable for large-scale problems.

        另外,该工具箱专门有一个说明文档《l1-magic: Recovery of Sparse Signals via Convex Programming》,可以在工具箱主页下载。

        该工具箱一共解决了七个问题,其中第一个问题即是Basis Pursuit :

        工具箱中给出了专门针对(P1)的代码l1eq_pd.m,使用方法可以参见l1eq_example.m,说明文档的3.1节也进行了介绍。

        在附录A中,给出了将(P1)问题转化为线性规划问题的过程,但这个似乎并不怎么容易看明白:


3、如何将(P1)转化为线性规划问题?

        尽管在l1-MAGIC给出了一种基追踪的实现,但需要基于它的l1eq_pd.m文件,既然基追踪是用线性规划求解,那么就应该可以用MATLAB自带的linprog函数求解,究竟该如何将(P1)转化为标准的线性规划问题呢?我们来看文献【3】的介绍:


        这里,文献【3】的转化说明跟文献【2】中4.1节的说明差不多,但对初学者来说仍然会有一定的困难,下面我们就以文献【3】中的符号为准来解读一下。

        首先,式(3.1)中的变量a没有非负约束,所以要将a变为两个非负变量u和v的差a=u-v,由于u可以大于也可以小于v,所以a可以是正的也可以是负的[4]。也就是说,约束条件Φa=s要变为Φ(u-v)=s,而这个还可以写为[Φ,-Φ][u;v]=s,更清晰的写法如下:

        然后,根据范数的定义,目标函数可进一点写为:

        目标函数中有绝对值,怎么去掉呢?这里得看一下文献【5】:

        到现在一切应该都清晰明白了,总结如下:

        问题可以转化为线性规划问题,其中:

求得最优化解x0后可得变量a的最优化解a0=x0(1:p)-x0(p+1:2p) 。

4、基于linprog的基追踪MATLAB代码(BP_linprog.m)

[plain] view plain copy
print ?
  1. function [ alpha ] = BP_linprog( s,Phi )  
  2. %BP_linprog(Basis Pursuit with linprog) Summary of this function goes here  
  3. %Version: 1.0 written by jbb0523 @2016-07-21   
  4. %Reference:Chen S S, Donoho D L, Saunders M A. Atomic decomposition by  
  5. %basis pursuit[J]. SIAM review, 2001, 43(1): 129-159.(Available at:   
  6. %http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.4272&rep=rep1&type=pdf)  
  7. %   Detailed explanation goes here  
  8. %   s = Phi * alpha (alpha is a sparse vector)    
  9. %   Given s & Phi, try to derive alpha  
  10.     [s_rows,s_columns] = size(s);    
  11.     if s_rows
  12.         s = s';%s should be a column vector    
  13.     end   
  14.     p = size(Phi,2);  
  15.     %according to section 3.1 of the reference  
  16.     c = ones(2*p,1);  
  17.     A = [Phi,-Phi];  
  18.     b = s;  
  19.     lb = zeros(2*p,1);  
  20.     x0 = linprog(c,[],[],A,b,lb);  
  21.     alpha = x0(1:p) - x0(p+1:2*p);  
  22. end  
function [ alpha ] = BP_linprog( s,Phi )
%BP_linprog(Basis Pursuit with linprog) Summary of this function goes here
%Version: 1.0 written by jbb0523 @2016-07-21 
%Reference:Chen S S, Donoho D L, Saunders M A. Atomic decomposition by
%basis pursuit[J]. SIAM review, 2001, 43(1): 129-159.(Available at: 
%http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.4272&rep=rep1&type=pdf)
%   Detailed explanation goes here
%   s = Phi * alpha (alpha is a sparse vector)  
%   Given s & Phi, try to derive alpha
    [s_rows,s_columns] = size(s);  
    if s_rows

5、基追踪单次重构测试代码(CS_Reconstuction_Test.m)

        测试代码与OMP测试单码相同,仅仅是修改了重构函数。

[plain] view plain copy
print ?
  1. %压缩感知重构算法测试    
  2. clear all;close all;clc;    
  3. M = 64;%观测值个数    
  4. N = 256;%信号x的长度    
  5. K = 10;%信号x的稀疏度    
  6. Index_K = randperm(N);    
  7. x = zeros(N,1);    
  8. x(Index_K(1:K)) = 5*randn(K,1);%x为K稀疏的,且位置是随机的    
  9. Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta    
  10. Phi = randn(M,N);%测量矩阵为高斯矩阵    
  11. A = Phi * Psi;%传感矩阵    
  12. y = Phi * x;%得到观测向量y    
  13. %% 恢复重构信号x    
  14. tic    
  15. theta = BP_linprog(y,A);    
  16. x_r = Psi * theta;% x=Psi * theta    
  17. toc    
  18. %% 绘图    
  19. figure;    
  20. plot(x_r,'k.-');%绘出x的恢复信号    
  21. hold on;    
  22. plot(x,'r');%绘出原信号x    
  23. hold off;    
  24. legend('Recovery','Original')    
  25. fprintf('\n恢复残差:');    
  26. norm(x_r-x)%恢复残差   
%压缩感知重构算法测试  
clear all;close all;clc;  
M = 64;%观测值个数  
N = 256;%信号x的长度  
K = 10;%信号x的稀疏度  
Index_K = randperm(N);  
x = zeros(N,1);  
x(Index_K(1:K)) = 5*randn(K,1);%x为K稀疏的,且位置是随机的  
Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta  
Phi = randn(M,N);%测量矩阵为高斯矩阵  
A = Phi * Psi;%传感矩阵  
y = Phi * x;%得到观测向量y  
%% 恢复重构信号x  
tic  
theta = BP_linprog(y,A);  
x_r = Psi * theta;% x=Psi * theta  
toc  
%% 绘图  
figure;  
plot(x_r,'k.-');%绘出x的恢复信号  
hold on;  
plot(x,'r');%绘出原信号x  
hold off;  
legend('Recovery','Original')  
fprintf('\n恢复残差:');  
norm(x_r-x)%恢复残差 

        运行结果如下:(信号为随机生成,所以每次结果均不一样)

         1)图:

2)Command Windows

Optimization terminated.

Elapsed time is 0.304111 seconds.

恢复残差:

ans =

  6.5455e-010

6、结束语

        值得一提的是,基追踪并不能称为一个具体的算法,而是一种最优化准则,文献【3】对此进行了明确的说明,基追踪实现方法可以使用单纯形法(simplex algorithm),也可以使用内点法(interior-pointmethods), 因此,有些文献里说凸松弛算法包括基追踪、内点法等,个人感觉这是不恰当的,因为内点法只是基追踪的一种实现形式而己,再说了,内点法也有很多种实现方法……

        本文实现方法基于MATLAB自带的线性规划函数linprog,当然也可以采用l1-magic中的l1eq_pd.m,有兴趣的可以做一下对比。

7、参考文献

【1】李珅, 马彩文, 李艳, 等. 压缩感知重构算法综述[J]. 红外与激光工程, 2013, 42(S01): 225-232.

【2】Donoho D L. Compressedsensing[J]. IEEE Transactions on information theory, 2006, 52(4):1289-1306. (Available at: http://www.signallake.com/innovation/CompressedSensing091604.pdf)

【3】Chen S S, Donoho D L,Saunders M A.Atomicdecomposition by basis pursuit[J]. SIAM review, 2001, 43(1): 129-159. (Availableat:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.4272&rep=rep1&type=pdf)

【4】孙文瑜, 徐成贤, 朱德通.最优化方法(第二版)[M]. 北京:高等教育出版社, 2010:49-51.

【5】L1范数优化的线性化方法如何证明? 链接:http://www.zhihu.com/question/21427075

你可能感兴趣的:(语音信号处理与matlab编程)