正交匹配追踪算法OMP

article/2025/4/30 15:15:24

浅谈压缩感知(九):正交匹配追踪算法OMP

        </h1><div class="clear"></div><div class="postBody">

主要内容:

  1. OMP算法介绍
  2. OMP的MATLAB实现
  3. OMP中的数学知识

一、OMP算法介绍

来源:http://blog.csdn.net/scucj/article/details/7467955

1、信号的稀疏表示(sparse representation of signals)

给定一个过完备字典矩阵,其中它的每列表示一种原型信号的原子。给定一个信号y,它可以被表示成这些原子的稀疏线性组合。信号 y 可以被表达为 y = Dx ,或者。字典矩阵中所谓过完备性,指的是原子的个数远远大于信号y的长度(其长度很显然是n),即n<<k。

2、MP算法(匹配追踪算法)

2.1 算法描述

作为对信号进行稀疏分解的方法之一,将信号在完备字典库上进行分解。

假定被表示的信号为y,其长度为n。假定H表示Hilbert空间,在这个空间H里,由一组向量构成字典矩阵D,其中每个向量可以称为原子(atom),其长度与被表示信号 y 的长度n相同,而且这些向量已作为归一化处理,即|,也就是单位向量长度为1。MP算法的基本思想:从字典矩阵D(也称为过完备原子库中),选择一个与信号 y 最匹配的原子(也就是某列),构建一个稀疏逼近,并求出信号残差,然后继续选择与信号残差最匹配的原子,反复迭代,信号y可以由这些原子来线性和,再加上最后的残差值来表示。很显然,如果残差值在可以忽略的范围内,则信号y就是这些原子的线性组合。如果选择与信号y最匹配的原子?如何构建稀疏逼近并求残差?如何进行迭代?我们来详细介绍使用MP进行信号分解的步骤:[1] 计算信号 y 与字典矩阵中每列(原子)的内积,选择绝对值最大的一个原子,它就是与信号 y 在本次迭代运算中最匹配的。用专业术语来描述:令信号,从字典矩阵中选择一个最为匹配的原子,满足,r0 表示一个字典矩阵的列索引。这样,信号 y 就被分解为在最匹配原子的垂直投影分量和残值两部分,即:。[2]对残值R1f进行步骤[1]同样的分解,那么第K步可以得到:

, 其中 满足。可见,经过K步分解后,信号 y 被分解为:,其中

2.2 继续讨论

(1)为什么要假定在Hilbert空间中?Hilbert空间就是定义了完备的内积空。很显然,MP中的计算使用向量的内积运算,所以在在Hilbert空间中进行信号分解理所当然了。什么是完备的内积空间?篇幅有限就请自己搜索一下吧。

(2)为什么原子要事先被归一化处理了,即上面的描述。内积常用于计算一个矢量在一个方向上的投影长度,这时方向的矢量必须是单位矢量。MP中选择最匹配的原子是,是选择内积最大的一个,也就是信号(或是残值)在原子(单位的)垂直投影长度最长的一个,比如第一次分解过程中,投影长度就是,三个向量,构成一个三角形,且正交(不能说垂直,但是可以想象二维空间这两个矢量是垂直的)。

(3)MP算法是收敛的,因为正交,由这两个可以得出,得出每一个残值比上一次的小,故而收敛。

2.3 MP算法的缺点

如上所述,如果信号(残值)在已选择的原子进行垂直投影是非正交性的,这会使得每次迭代的结果并不少最优的而是次最优的,收敛需要很多次迭代。举个例子说明一下:在二维空间上,有一个信号 y 被 D=[x1, x2]来表达,MP算法迭代会发现总是在x1和x2上反复迭代,即,这个就是信号(残值)在已选择的原子进行垂直投影的非正交性导致的。再用严谨的方式描述[1]可能容易理解:在Hilbert空间H中,,定义,就是它是这些向量的张成中的一个,MP构造一种表达形式:;这里的Pvf表示 f在V上的一个正交投影操作,那么MP算法的第 k 次迭代的结果可以表示如下(前面描述时信号为y,这里变成f了,请注意):

如果  是最优的k项近似值,当且仅当。由于MP仅能保证,所以一般情况下是次优的。这是什么意思呢?是k个项的线性表示,这个组合的值作为近似值,只有在第k个残差和正交,才是最优的。如果第k个残值与正交,意味这个残值与fk的任意一项都线性无关,那么第k个残值在后面的分解过程中,不可能出现fk中已经出现的项,这才是最优的。而一般情况下,不能满足这个条件,MP一般只能满足第k个残差和xk正交,这也就是前面为什么提到"信号(残值)在已选择的原子进行垂直投影是非正交性的"的原因。如果第k个残差和fk不正交,那么后面的迭代还会出现fk中已经出现的项,很显然fk就不是最优的,这也就是为什么说MP收敛就需要更多次迭代的原因。不是说MP一定得到不到最优解,而且其前面描述的特性导致一般得到不到最优解而是次优解。那么,有没有办法让第k个残差与正交,方法是有的,这就是下面要谈到的OMP算法。

3、OMP算法

3.1 算法描述

OMP算法的改进之处在于:在分解的每一步对所选择的全部原子进行正交化处理,这使得在精度要求相同的情况下,OMP算法的收敛速度更快。

那么在每一步中如何对所选择的全部原子进行正交化处理呢?在正式描述OMP算法前,先看一点基础思想。

先看一个 k  阶模型,表示信号 f 经过 k 步分解后的情况,似乎很眼熟,但要注意它与MP算法不同之处,它的残值与前面每个分量正交,这就是为什么这个算法多了一个正交的原因,MP中仅与最近选出的的那一项正交。

(1)

 k + 1 阶模型如下:

(2)

应用 k + 1阶模型减去k 阶模型,得到如下:

(3)

我们知道,字典矩阵D的原子是非正交的,引入一个辅助模型,它是表示对前k个项的依赖,描述如下:

(4)

和前面描述类似,在span(x1, ...xk)之一上的正交投影操作,后面的项是残值。这个关系用数学符号描述:

请注意,这里的 a 和 b 的上标表示第 k 步时的取值。

将(4)带入(3)中,有:

(5)

如果一下两个式子成立,(5)必然成立。

(6)

(7)

,有

其中

ak的值是由求法很简单,通过对(7)左右两边添加作内积消减得到:

后边的第二项因为它们正交,所以为0,所以可以得出ak的第一部分。对于,在(4)左右两边中与作内积,可以得到ak的第二部分。

对于(4),可以求出,求的步骤请参见参考文件的计算细节部分。为什么这里不提,因为后面会介绍更简单的方法来计算。

3.2 收敛性证明

通过(7),由于正交,将两个残值移到右边后求二范的平方,并将ak的值代入可以得到:

可见每一次残差比上一次残差小,可见是收敛的。

3.3 算法步骤

整个OMP算法的步骤如下:

由于有了上面的来龙去脉,这个算法就相当好理解了。

到这里还不算完,后来OMP的迭代运算用另外一种方法可以计算得知,有位同学的论文[2]描述就非常好,我就直接引用进来:

对比中英文描述,本质都是一样,只是有细微的差别。这里顺便贴出网一哥们写的OMP算法的代码,源出处不得而知,共享给大家。

二、OMP的MATLAB实现

 1、一维信号重建

代码:

复制代码
%  1-D信号压缩传感的实现(正交匹配追踪法Orthogonal Matching Pursuit)
%  测量数M>=K*log(N/K),K是稀疏度,N信号长度,可以近乎完全重构
%  编程人--香港大学电子工程系 沙威  Email: wsha@eee.hku.hk
%  编程时间:2008年11月18日
%  文档下载: http://www.eee.hku.hk/~wsha/Freecode/freecode.htm 
%  参考文献: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.

clc;clear

%% 1. 时域测试信号生成
K=7; % 稀疏度(做FFT可以看出来)
N=256; % 信号长度
M=64; % 测量数(M>=Klog(N/K),至少40,但有出错的概率)
f1=50; % 信号频率1
f2=100; % 信号频率2
f3=200; % 信号频率3
f4=400; % 信号频率4
fs=800; % 采样频率
ts=1/fs; % 采样间隔
Ts=1:N; % 采样序列
x=0.3cos(2pif1Ts
ts)+0.6cos(2pif2Tsts)+0.1cos(2pif3Tsts)+0.9cos(2pif4Ts*ts); % 完整信号,由4个信号叠加而来

%% 2. 时域信号压缩传感
Phi=randn(M,N); % 测量矩阵(高斯分布白噪声)64256的扁矩阵,Phi也就是文中说的D矩阵
s=Phi
x.’; % 获得线性测量 ,s相当于文中的y矩阵

%% 3. 正交匹配追踪法重构信号(本质上是L_1范数最优化问题)
%匹配追踪:找到一个其标记看上去与收集到的数据相关的小波;在数据中去除这个标记的所有印迹;不断重复直到我们能用小波标记“解释”收集到的所有数据。

m=2K; % 算法迭代次数(m>=K),设x是K-sparse的
Psi=fft(eye(N,N))/sqrt(N); % 傅里叶正变换矩阵
T=Phi
Psi’; % 恢复矩阵(测量矩阵*正交反变换矩阵)

hat_y=zeros(1,N); % 待重构的谱域(变换域)向量
Aug_t=[]; % 增量矩阵(初始值为空矩阵)
r_n=s; % 残差值

for times=1:m; % 迭代次数(有噪声的情况下,该迭代次数为K)
for col=1:N; % 恢复矩阵的所有列向量
product(col)=abs(T(:,col)’*r_n); % 恢复矩阵的列向量和残差的投影系数(内积值)
end
[val,pos]=max(product); % 最大投影系数对应的位置,即找到一个其标记看上去与收集到的数据相关的小波
Aug_t=[Aug_t,T(:,pos)]; % 矩阵扩充

T(:,pos)</span>=zeros(M,<span style="color: #800080;">1</span>);                          %<span style="color: #000000;">  选中的列置零(实质上应该去掉,为了简单我把它置零),在数据中去除这个标记的所有印迹
aug_y</span>=(Aug_t<span style="color: #800000;">'</span><span style="color: #800000;">*Aug_t)^(-1)*Aug_t</span><span style="color: #800000;">'</span>*s;           %<span style="color: #000000;">  最小二乘,使残差最小
r_n</span>=s-Aug_t*aug_y;                            %<span style="color: #000000;">  残差
pos_array(times)</span>=pos;                         %<span style="color: #000000;">  纪录最大投影系数的位置

end
hat_y(pos_array)=aug_y; % 重构的谱域向量
hat_x=real(Psi’*hat_y.’); % 做逆傅里叶变换重构得到时域信号

%% 4. 恢复信号和原始信号对比
figure(1);
hold on;
plot(hat_x,‘k.-’) % 重建信号
plot(x,‘r’) % 原始信号
legend(‘Recovery’,‘Original’)
norm(hat_x.’-x)/norm(x) % 重构误差

复制代码

结果:

2、二维信号重建

代码:

复制代码
%  本程序实现图像LENA的压缩传感
%  程序作者:沙威,香港大学电气电子工程学系,wsha@eee.hku.hk
%  算法采用正交匹配法,参考文献 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.
%  该程序没有经过任何优化

function Wavelet_OMP

clc;clear

% 读文件
X=imread(‘lena256.bmp’);
X=double(X);
[a,b]=size(X);

% 小波变换矩阵生成
ww=DWT(a);

% 小波变换让图像稀疏化(注意该步骤会耗费时间,但是会增大稀疏度)
X1=ww*sparse(X)*ww’;
% X1=X;
X1=full(X1);

% 随机矩阵生成
M=190;
R=randn(M,a);
% R=mapminmax(R,0,255);
% R=round®;

% 测量值
Y=R*X1;

% OMP算法
% 恢复矩阵
X2=zeros(a,b);
% 按列循环
for i=1:b
% 通过OMP,返回每一列信号对应的恢复值(小波域)
rec=omp(Y(:,i),R,a);
% 恢复值矩阵,用于反变换
X2(:,i)=rec;
end

% 原始图像
figure(1);
imshow(uint8(X));
title(‘原始图像’);

% 变换图像
figure(2);
imshow(uint8(X1));
title(‘小波变换后的图像’);

% 压缩传感恢复的图像
figure(3);
% 小波反变换
X3=ww’*sparse(X2)*ww;
% X3=X2;
X3=full(X3);
imshow(uint8(X3));
title(‘恢复的图像’);

% 误差(PSNR)
% MSE误差
errorx=sum(sum(abs(X3-X).^2));
% PSNR
psnr=10log10(255255/(errorx/a/b))

% OMP的函数
% s-测量;T-观测矩阵;N-向量大小
function hat_y=omp(s,T,N)
Size=size(T); % 观测矩阵大小
M=Size(1); % 测量
hat_y=zeros(1,N); % 待重构的谱域(变换域)向量
Aug_t=[]; % 增量矩阵(初始值为空矩阵)
r_n=s; % 残差值

for times=1:M; % 迭代次数(稀疏度是测量的1/4)
for col=1:N; % 恢复矩阵的所有列向量
product(col)=abs(T(:,col)’*r_n); % 恢复矩阵的列向量和残差的投影系数(内积值)
end
[val,pos]=max(product); % 最大投影系数对应的位置
Aug_t=[Aug_t,T(:,pos)]; % 矩阵扩充
T(:,pos)=zeros(M,1); % 选中的列置零(实质上应该去掉,为了简单我把它置零)
aug_y=(Aug_t’*Aug_t)^(-1)*Aug_t’s; % 最小二乘,使残差最小
r_n=s-Aug_t
aug_y; % 残差
pos_array(times)=pos; % 纪录最大投影系数的位置

</span><span style="color: #0000ff;">if</span> (norm(r_n)&lt;<span style="color: #800080;">0.9</span>)                            %<span style="color: #000000;">  残差足够小</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
end

end
hat_y(pos_array)=aug_y; % 重构的向量

复制代码

结果:

三、OMP算法中的数学知识

算法会有一些线性代数中的概念和知识,主要是关于子空间、最小二乘、投影矩阵等,详情请参考

最小二乘的几何意义及投影矩阵

分类: 压缩感知compressive sensing, 数学Mathematics
<div id="blog_post_info">
好文要顶 关注我 收藏该文
AndyJee
关注 - 0
粉丝 - 324
+加关注
4
0
<div class="clear"></div>
<div id="post_next_prev"><a href="https://www.cnblogs.com/AndyJee/p/5045668.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/AndyJee/p/5045668.html" title="发布于 2015-12-14 16:29">浅谈压缩感知(八):两篇科普文章</a>
<br>
<a href="https://www.cnblogs.com/AndyJee/p/5048235.html" class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/AndyJee/p/5048235.html" title="发布于 2015-12-15 14:30">浅谈压缩感知(十):范数与稀疏性</a>
posted @ 2015-12-15 09:29  AndyJee 阅读( 28779) 评论( 1) 编辑 收藏
</div><!--end: topics 文章、评论容器-->

			</div>

#1楼

    <span id="comment-maxId" style="display:none">3718412</span><span id="comment-maxDate" style="display:none">2017/6/20 下午12:59:28</span>

2017-06-20 12:59

        <a id="a_comment_author_3718412" href="https://home.cnblogs.com/u/1178954/" target="_blank">数理小先生</a></div><div class="feedbackCon">
楼主在吗?急需要求助
支持(0) 反对(0)
		</div></div>
刷新评论 刷新页面 返回顶部
【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码
【推荐】零基础轻松玩转华为云产品,获壕礼加返百元大礼
【推荐】新手上天翼云,数十款云产品、新一代主机0元体验
【推荐】华为IoT平台开发者套餐9.9元起,购买即送免费课程
相关博文:
· MP和OMP算法
· MP算法和OMP算法及其思想
· MP算法和OMP算法及其思想
· MP算法和OMP算法及其思想
· MP算法和OMP算法及其思想
    <div id="google_ads_iframe_/1090369/C2_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/C2_0" title="3rd party ad content" name="google_ads_iframe_/1090369/C2_0" width="468" height="60" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" srcdoc="" style="border: 0px; vertical-align: bottom;" data-google-container-id="2" data-load-complete="true"></iframe></div></div>
</div>
<div id="under_post_kb">
最新 IT 新闻:
· Windows 10终于拿下操作系统市场半壁江山
· 藏在1.85亿人体内的隐形致癌病毒,有人确诊即是晚期
· 嘀嗒出行:用户突破1.3亿,车主突破1500万
· 无人机泡沫破裂:创企纷纷关门 风投遭重创
· 基因编辑明星动物遇挫:无角牛体内发现细菌基因污染 | 专访 ​
» 更多新闻...

http://chatgpt.dhexx.cn/article/mk2Ag9ld.shtml

相关文章

OMP算法代码学习

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; https://blog.csdn.net/jbb0523/article/details/45130793 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/…

美团饿了么返利公众号小程序搭建(付源码)

外卖返利小程序源码; 轻松部署搭建&#xff0c;小程序服务号数据互通&#xff1b; 对接美团官方; 佣金比例自定义分配; 三级分佣&#xff0c;所有资金数据一目了然&#xff1b; 拉新立减最低4.9元购月卡&#xff1b; 签到20天免费领取会员卡&#xff1b; 提现秒到账&#xff01…

OMP算法笔记

OMP算法笔记 OMP算法整理&#xff08;以备自己后期查阅&#xff0c;集合了几篇博主的文章&#xff09; &#xff08;1&#xff09;数理知识基础–投影矩阵 详见&#xff1a; 作者&#xff1a;nineheaded_bird 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/teng…

使用python实现微信小程序自动签到2.0

微信小程序自动签到 功能描述目标输出包管理 程序的结构设计步骤1步骤2步骤3步骤4 代码实现使用findler抓包工具查看请求类型再次使用findler抓包&#xff0c;查看请求内容使用多线程完成多用户提交的功能使用itchat第三方库实现微信自动回复 将程序部署到服务器中使用scp命令将…

并行程序设计——OMP编程

并行程序设计——OMP编程 实验一 实验内容 分别实现课件中的梯形积分法的Pthread、OpenMP版本&#xff0c;熟悉并掌握OpenMP编程方法&#xff0c;探讨两种编程方式的异同。 实验代码 OpenMP编程 #include <stdio.h> #include <stdlib.h> #include <omp.h&g…

利用中国知网快速自动生成参考文献

1.打开知网 2.输入引用的文献名称 3.点击文章 4.点击“导出/参考文献” 5.自动生成参考文献

知网导出外文参考文献格式和下载文章(2019.5)

如果不弹出页面&#xff0c;是网络的原因&#xff0c;等一等

谷歌学术、中国知网生成参考文献

谷歌学术 step1.登陆谷歌学术 step2.查找需要的文献 step3.点击引用标志 step4.生成相关引用 step5.选择不同的标准复制粘贴 中国知网 step1.在知网搜索需要的论文 step2.点击导出参考文献 step3.生成参考文献引用

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

文章目录 一、EndNote导入文献的以下几种格式1.1 中国知网1.2web of science1.3 谷歌学术 一、EndNote导入文献的以下几种格式 all as we konow&#xff0c;引用参考文献也就是如下三个&#xff0c;那么分别导入endnote改怎么使用呢&#xff1f; 1.1 中国知网 在你想要的文献里…

在CNKI上导出TXT文件

在使用CiteSpace之前要先下载数据源&#xff0c;今天就来讲一讲从CNKI上导出txt文件。 1、从学校官网进入中国知网CNKI&#xff0c;单击高级检索 2、输入关键字&#xff0c;可以选择组合输入&#xff0c;单击搜索 3、在每页显示处选择50 4、勾选所有所有记录&#xff08;每次导…

EndNote20导入知网文献和导出BibTeX于TexStudio

第一步&#xff1a;在知网官网中找到一篇论文并点击引号键 第二步&#xff1a;点击EndNote下载该txt文件 第三步&#xff1a;在EndNote20中点击File->Import->File&#xff0c;引入刚刚下载的txt文件 注意Import Option选择的是EndNote Import&#xff0c;点击import导入…

知网导出之Excel

背景&#xff1a;需要整理知网XX方向的论文&#xff0c;包括题目&#xff0c;内容&#xff0c;发表时间等等信息。但是一个个写也太麻烦了&#xff0c;所以&#xff0c;一些不需要人总结的东西&#xff0c;就直接导出好了。 流程&#xff1a; 选择好文献之后&#xff0c;选择自…

知网如何快速引用参考文献

1.在知网搜索界面&#xff0c;搜索自己想搜的内容&#xff0c;然后点击下图引号位置 2.在弹框中选择你要引用的格式 复制粘贴到自己论文中即可

知网 BibTeX自动生成(使用BibTeX引用中文参考文献)

前言 谷歌学术具备生成英文文献的bibtex文献引用代码的功能&#xff0c;而知网里不具备生成中文文献的bibtex引用代码的功能。因此&#xff0c;本文将生成中文文献bibtex引用代码的操作过程简单记录便于自己再次翻阅&#xff0c;操作方法源自知乎作者 上官无忌 &#xff0c;具…

知网导出引用文件,插入到Endnote管理文献

直接选endnote是txt格式 改格式也没用&#xff0c;endnote改也不行 这里选择refworks 导出txt之后 选择refworks import即可

Web of Science如何导出参考文献

Web of Science&#xff08;WOS&#xff09;是大型综合性、多学科、核心期刊引文索引数据库。 Endnote是一款可以有效管理参考文献的软件&#xff0c;并且在论文写作时&#xff0c;利用endnote可以很方便的修改引用格式。 1.进入论文界面 2.点击查看PDF,然后点击红圈 3. 可以…

Endnote导出目标期刊的参考文献的格式

Endnote导出目标期刊的参考文献的格式 1、知网文献与endnote的操作流程2、其他的参考文件来源&#xff08;如bib、ris等&#xff09;及导出格式选择 1、知网文献与endnote的操作流程 导出的格式为txt格式&#xff0c;这时候打开endnote&#xff0c;导入choose你的txt文件就可以…

知网论文参考文献导入到Endnote方法

第一步下载参考文献文件第二步&#xff1a;右键->打开方式->选择endnote 3. 导入结果

知网获取论文参考文献

知网获取论文参考文献 进入知网搜索相应材料普通检索高级检索 选择相应的文献点击右上角左边双引号“凑”参考文献 进入知网 中国知网官方网址&#xff1a;https://www.cnki.net/ 搜索相应材料 搜素一般可分为普通检索和高级检索。 一般而言&#xff0c;普通检索即可完成我…

Endnote 导出英文、中文(知网)参考文献进入Word

1、英文文献 从Google Scholar 搜索需要的参考文献&#xff0c;然后点击“引用”按钮&#xff0c;导出Endnote的格式&#xff0c;例如scholar.enw。 在Endnote中File-->Import-->File...-->Import File-->Import 参考文献导入完毕 进行参考文献在word中的导出…