OMP learning algorithm code

      版权声明:本文为博主原创文章,转载请注明出处,谢谢!          https://blog.csdn.net/jbb0523/article/details/45130793        </div>
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
                          <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
      <div class="htmledit_views" id="content_views">

Title: Compressed Sensing reconstruction algorithm of orthogonal matching track (OMP)

        After several bedding foundation of the front herein, this gives the MATLAB function codes orthogonal matching pursuit (OMP) algorithm, and the code is given a single test routines, the number M of measurement and reconstruction success probability plots drawing routine code K signal sparsity and reconstruction success probability plots drawing routine code.

0, symbols as follows:

        Compression observation y = Φx , where y is the resulting observation vector. 1 × M, X is the original signal N × 1 (M << N) . x generally not sparse, but in a transform domain Ψ is sparse, i.e., x = Ψθ , where θ is K sparse, i.e. θ only K non-zero entries. At this time, Y = ΦΨθ , so that A = ΦΨ , then Y = .

        (. 1) Y is the resulting observation vector of size M × 1

        (2) X is the original signal, of size N × 1

        (. 3) [theta] is K sparse, is a signal x represented in a transform domain sparse

        (. 4) [Phi] is called the observation matrix, measurement matrix , measurement basis, a size of M × N

        (. 5) [Psi] is called the transformation matrix, the transformation group, sparse sparse group, an orthogonal matrix group dictionary, a size of N × N

        (. 6) A called a measurement matrix, the sensor matrix , the CS operator information, a size of M × N

In the above formula, generally we have K << M << N, the back of each document is called mixed matrix of three, then I will Φ called the measurement matrix , the Ψ called sparse matrix , the A called sensor matrix .

1, OMP reconstruction algorithm processes:



2, orthogonal matching pursuit (OMP) MATLAB Code (CS_OMP.m)

function [ theta ] = CS_OMP( y,A,t )
%CS_OMP Summary of this function goes here
%Version: 1.0 written by jbb0523 @2015-04-18
%   Detailed explanation goes here
%   y = Phi * x
%   x = Psi * theta
%	y = Phi*Psi * theta
%   令 A = Phi*Psi, 则y=A*theta
%   现在已知y和A,求theta
    [y_rows,y_columns] = size(y);
    if y_rows<y_columns
        y = y';%y should be a column vector
    end
    [M,N] = size(A);%传感矩阵A为M*N矩阵
    theta = zeros(N,1);%用来存储恢复的theta(列向量)
    At = zeros(M,t);%用来迭代过程中存储A被选择的列
    Pos_theta = zeros(1,t);%用来迭代过程中存储A被选择的列序号
    r_n = y;%初始化残差(residual)为y
    for ii=1:t%迭代t次,t为输入参数
        product = A'*r_n;%传感矩阵A各列与残差的内积
        [val,pos] = max(abs(product));%找到最大内积绝对值,即与残差最相关的列
        At(:,ii) = A(:,pos);%存储这一列
        Pos_theta(ii) = pos;%存储这一列的序号
        A(:,pos) = zeros(M,1);%清零A的这一列,其实此行可以不要,因为它与残差正交
        %y=At(:,1:ii)*theta,以下求theta的最小二乘解(Least Square)
        theta_ls = (At(:,1:ii)'*At(:,1:ii))^(-1)*At(:,1:ii)'*y;%最小二乘解
        %At(:,1:ii)*theta_lsyAt(:,1:ii)列空间上的正交投影
        r_n = y - At(:,1:ii)*theta_ls;%更新残差        
    end
    theta(Pos_theta)=theta_ls;%恢复出的theta
end


3, OMP reconstructed single test code (CS_Reconstuction_Test.m)

        Code configured to direct a K-sparse signals, the sparse matrix is ​​a unit matrix.

%压缩感知重构算法测试
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 = CS_OMP(y,A,K);
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)%恢复残差

Results are as follows :( signal is randomly generated, so the results are not the same every time)

1) Figure:


2)Command Windows

Elapsed time is 0.849710 seconds.
Recover residual:
ANS =
  5.5020e-015

4, the number M of the measurement and reconstruction success probability plots drawing routine Code

%压缩感知重构算法测试CS_Reconstuction_MtoPercentage.m
%   绘制参考文献中的Fig.1
%   参考文献:Joel A. Tropp and Anna C. Gilbert 
%   Signal Recovery From Random Measurements Via Orthogonal Matching
%   Pursuit,IEEE TRANSACTIONS ON INFORMATION THEORY, VOL. 53, NO. 12,
%   DECEMBER 2007.
%   Elapsed time is 1171.606254 seconds.(@20150418night)
clear all;close all;clc;
%% 参数配置初始化
CNT = 1000;%对于每组(K,M,N),重复迭代次数
N = 256;%信号x的长度
Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
K_set = [4,12,20,28,36];%信号x的稀疏度集合
Percentage = zeros(length(K_set),N);%存储恢复成功概率
%% 主循环,遍历每组(K,M,N)
tic
for kk = 1:length(K_set)
    K = K_set(kk);%本次稀疏度
    M_set = K:5:N;%M没必要全部遍历,每隔5测试一个就可以了
    PercentageK = zeros(1,length(M_set));%存储此稀疏度K下不同M的恢复成功概率
    for mm = 1:length(M_set)
       M = M_set(mm);%本次观测值个数
       P = 0;
       for cnt = 1:CNT %每个观测值个数均运行CNT次
            Index_K = randperm(N);
            x = zeros(N,1);
            x(Index_K(1:K)) = 5*randn(K,1);%x为K稀疏的,且位置是随机的                
            Phi = randn(M,N);%测量矩阵为高斯矩阵
            A = Phi * Psi;%传感矩阵
            y = Phi * x;%得到观测向量y
            theta = CS_OMP(y,A,K);%恢复重构信号theta
            x_r = Psi * theta;% x=Psi * theta
            if norm(x_r-x)<1e-6%如果残差小于1e-6则认为恢复成功
                P = P + 1;
            end
       end
       PercentageK(mm) = P/CNT*100;%计算恢复概率
    end
    Percentage(kk,1:length(M_set)) = PercentageK;
end
toc
save MtoPercentage1000 %运行一次不容易,把变量全部存储下来
%% 绘图
S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
figure;
for kk = 1:length(K_set)
    K = K_set(kk);
    M_set = K:5:N;
    L_Mset = length(M_set);
    plot(M_set,Percentage(kk,1:L_Mset),S(kk,:));%绘出x的恢复信号
    hold on;
end
hold off;
xlim([0 256]);
legend('K=4','K=12','K=20','K=28','K=36');
xlabel('Number of measurements(M)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

        本程序在联想ThinkPadE430C笔记本(4GB DDR3内存,i5-3210)上运行共耗时1171.606254秒,程序中将所有数据均通过“save MtoPercentage1000”存储了下来,以后可以再对数据进行分析,只需“load MtoPercentage1000”即可。

        程序运行结果比文献[1]的Fig.1要好,原因不详。

本程序运行结果:


文献[1]中的Fig.1:


5、信号稀疏度K与重构成功概率关系曲线绘制例程代码

%压缩感知重构算法测试CS_Reconstuction_KtoPercentage.m
%   绘制参考文献中的Fig.2
%   参考文献:Joel A. Tropp and Anna C. Gilbert 
%   Signal Recovery From Random Measurements Via Orthogonal Matching
%   Pursuit,IEEE TRANSACTIONS ON INFORMATION THEORY, VOL. 53, NO. 12,
%   DECEMBER 2007.
%   Elapsed time is 1448.966882 seconds.(@20150418night)
clear all;close all;clc;
%% 参数配置初始化
CNT = 1000;%对于每组(K,M,N),重复迭代次数
N = 256;%信号x的长度
Psi = eye(N);%x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
M_set = [52,100,148,196,244];%测量值集合
Percentage = zeros(length(M_set),N);%存储恢复成功概率
%% 主循环,遍历每组(K,M,N)
tic
for mm = 1:length(M_set)
    M = M_set(mm);%本次测量值个数
    K_set = 1:5:ceil(M/2);%信号x的稀疏度K没必要全部遍历,每隔5测试一个就可以了
    PercentageM = zeros(1,length(K_set));%存储此测量值M下不同K的恢复成功概率
    for kk = 1:length(K_set)
       K = K_set(kk);%本次信号x的稀疏度K
       P = 0;
       for cnt = 1:CNT %每个观测值个数均运行CNT次
            Index_K = randperm(N);
            x = zeros(N,1);
            x(Index_K(1:K)) = 5*randn(K,1);%x为K稀疏的,且位置是随机的                
            Phi = randn(M,N);%测量矩阵为高斯矩阵
            A = Phi * Psi;%传感矩阵
            y = Phi * x;%得到观测向量y
            theta = CS_OMP(y,A,K);%恢复重构信号theta
            x_r = Psi * theta;% x=Psi * theta
            if norm(x_r-x)<1e-6%如果残差小于1e-6则认为恢复成功
                P = P + 1;
            end
       end
       PercentageM(kk) = P/CNT*100;%计算恢复概率
    end
    Percentage(mm,1:length(K_set)) = PercentageM;
end
toc
save KtoPercentage1000test %运行一次不容易,把变量全部存储下来
%% 绘图
S = ['-ks';'-ko';'-kd';'-kv';'-k*'];
figure;
for mm = 1:length(M_set)
    M = M_set(mm);
    K_set = 1:5:ceil(M/2);
    L_Kset = length(K_set);
    plot(K_set,Percentage(mm,1:L_Kset),S(mm,:));%绘出x的恢复信号
    hold on;
end
hold off;
xlim([0 125]);
legend('M=52','M=100','M=148','M=196','M=244');
xlabel('Sparsity level(K)');
ylabel('Percentage recovered');
title('Percentage of input signals recovered correctly(N=256)(Gaussian)');

        本程序在联想ThinkPadE430C笔记本(4GB DDR3内存,i5-3210)上运行共耗时1448.966882秒,程序中将所有数据均通过“save KtoPercentage1000”存储了下来,以后可以再对数据进行分析,只需“load KtoPercentage1000”即可。

        程序运行结果比文献[1]的Fig.2要好,原因不详。

本程序运行结果:


文献[1]中的Fig.2:


6、参考文献

【1】Joel A. Tropp and Anna C. Gilbert. Signal Recovery From Random Measurements Via Orthogonal Matching Pursuit[J]. IEEETransactions on Information Theory, VOL. 53, NO. 12, DECEMBER 2007.

【2】Y.C.Pati, R.Rezaiifar,and P.S.Krishnaprasad. Orthogonal Matching Pursuit-Recursive FunctionApproximation with Applications to wavelet decomposition, Proc. 27thAnnu. Asilomar Conf. Signals, Systems, and Computers, Pacific Grove, CA, Nov.1993,vol.1,pp40-44.

【3】沙威.CS_OMP,http://www.eee.hku.hk/~wsha/Freecode/Files/CS_OMP.zip

      版权声明:本文为博主原创文章,转载请注明出处,谢谢!          https://blog.csdn.net/jbb0523/article/details/45130793        </div>
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
                          <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
      <div class="htmledit_views" id="content_views">

Guess you like

Origin blog.csdn.net/zhipao6108/article/details/91490894