一、前言
稀疏表示是自上世纪90年代开始,从人眼的视觉感受野获得启示,逐渐被人们所研究。现在已经发展为一种重要的信息表示方法。所谓稀疏表示是指,一个信号在过完备字典中,可以由少数个原子线性表达,
其数学模型可以表达如下:
这个数学模型解算是一个NP-hard问题,也就是说只能通过穷举去获得最优解,其时间复杂度很大,几乎无法获得其精确的解算。在这种情况下,我们常用贪婪算法去获得该模型的次最优解。本文介绍一种主流的贪婪算法——
正交匹配追踪(OMP)。
二、OMP算法
贪婪算法的核心是每次从字典的原子中选择一个最优原子来表示原始的信号。贪婪算法最大的缺点是,在贪婪算法的思想里,认为全局最优是每个局部最优得到的,这实际上很容易进入局部最优解,无法得到数据的全局最优解。
OMP作为贪婪算法中比较具有代表性的算法,其主要思想在于以下两点:
1 认为字典原子在信号投影中的越大,对信号的描述越好;
2 每一次选择的原子都与之前的原子正交。
介于以上两点,OMP算法的描述如下:
上图是从网上摘抄下来的。大概就是那样。但是值得注意的是:这样的OMP算法在解算的时候其效果往往没有ORMP算法好,目前好多人说的OMP算法其实质往往是ORMP算法。
比如:开源的工具箱SPAMS上的OMP算法解算部分,其核心就是ORMP算法。ORMP算法相比如OMP算法的不同在于,在计算完残差后对字典原子进行了另一个的拉伸(具体拉伸见后面代码部分),如下图:
三、SOMP算法
SOMP算法又叫同步OMP算法,主要思想为:相似的原子具有相同的稀疏特性。因此在对相似原子进行稀疏表示时,假设稀疏原子位于相同的位置,及其在过完备字典的选择的原子相同,OMP算法是SOMP算法在原始信号为一个原子
时的特殊情况。OMP算法可以统一到SOMP算法当中,其解算流程几乎同OMP算法部分。
四、代码实现
代码如下:
cv::Mat ormpSparseRepresentation::ompSparseL2(const cv::Mat Dict, const cv::Mat Y, const int K)
{
int r = Dict.rows;
int c = Dict.cols;
int n = Y.cols;
cv::Mat ERR(r,,CV_32F);
ERR = Y;
int size[] = {c,n};
cv::Mat A = cv::Mat(,size,CV_32F,cv::Scalar(.f));
QVector
cv::Mat U = cv::Mat::ones(,c,CV_32F);
cv::Mat tmpA;
for(int i = ;i { cv::Mat S = ERR.t()*Dict; cv::pow(S,,S); if(S.rows != ) cv::reduce(S,S,,CV_REDUCE_SUM); cv::sqrt(S,S); S = S/U; if(i!=) { for(int j = ;j { S.at } } cv::Point maxLoc; cv::minMaxLoc(S,NULL,NULL,NULL,&maxLoc); int pos = maxLoc.x; index.append(pos); cv::Mat subDict; getColDictFormIndex(Dict,index,subDict); cv::Mat invSubDict; cv::invert(subDict,invSubDict,cv::DECOMP_SVD); tmpA = invSubDict*Y; ERR = Y - subDict*tmpA; cv::Mat Dict_T_Dict; cv::mulTransposed(subDict,Dict_T_Dict,); cv::Mat invDict_T_Dict; cv::invert(Dict_T_Dict,invDict_T_Dict,cv::DECOMP_SVD); cv::Mat P = (cv::Mat::eye(r,r,CV_32F) - subDict*invDict_T_Dict*subDict.t())*Dict; cv::pow(P,,P); cv::reduce(P,P,,CV_REDUCE_SUM); cv::sqrt(P,U); } for(int i = ;i { int tmpC = index[i]; const float *inP=tmpA.ptr float *outP=A.ptr for(int j = ;j { outP[j] = inP[j]; } } return A; } void ormpSparseRepresentation::getColDictFormIndex(const cv::Mat Dict, const QVector { if(index.size() == ) return; if(!Dict.data) return; int r = Dict.rows; int c = index.size(); cv::Mat Dict_T; cv::transpose(Dict,Dict_T); cv::Mat res_T = cv::Mat(c,r,Dict.type()); for(int i = ;i { int tmpC = index[i]; const float *inP=Dict_T.ptr float *outP=res_T.ptr for(int j = ;j { outP[j] = inP[j]; } } cv::transpose(res_T,res); res_T.release(); Dict_T.release(); } 7. 稀疏表示之OMP,SOMP算法及openCV实现的更多相关文章 稀疏自动编码之反向传播算法(BP) 假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数: 那么整个训练集的损失函数定义如下: 第一项是所有样本的方差的均值.第二项是一个归一化项( ... (转载)利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 置顶 原文链接:https://blog.csdn.net/qq_25352981/article/details/46914837#commentsedit 本文目标是通过使用SIFT和RANSAC算法, ... SLAM: 图像角点检测的Fast算法(OpenCV文档) 官方链接:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ... SAD算法在opencv上的实现代码(c++) #include 稀疏分解中的MP与OMP算法 MP:matching pursuit匹配追踪 OMP:正交匹配追踪 主要介绍MP与OMP算法的思想与流程,解释为什么需要引入正交? !!今天发现一个重大问题,是在读了博主的正交匹配追踪(OMP)在稀 ... OMP算法代码学习 正交匹配追踪(OMP)算法的MATLAB函数代码并给出单次测试例程代码 测量数M与重构成功概率关系曲线绘制例程代码 信号稀疏度K与重构成功概率关系曲线绘制例程代码 参考来源:http://blog ... 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP) 主要内容: OMP的算法流程 OMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.OMP的算法流程 二.OMP的MATL ... MP算法、OMP算法及其在人脸识别的应用 主要内容: 1.MP算法 2.OMP算法 3.OMP算法的matlab实现 4.OMP在压缩感知和人脸识别的应用 一.MP(Matching Pursuits)与OMP(Orthogonal Matc ... scikit-learn 线性回归算法库小结 scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ... 随机推荐 vsim仿真VHDL输出fsdb格式文件 vsim(modelsim)仿真VHDL输出fsdb格式文件 1.Dump准备 (1) 将下列设置放到顶层testbench tb.vhd文件中[注意放置的位置:关系如图] library novas ... sql 表名为关键字 user在sql server中时一个关键字,如上面说所的,有时候我们无意中将其作为表的名称,当我们在sql语句中要使用该名称时例如:select *from user这是会提示user附近有语法错误 ... FineUI布局应用(二) 一.FineUI页面布局分为 1.Fit布局 XML配置silverlight ,wcf 解析xml XML 代码: 一个很简单的jQuery插件实例教程(菜鸟级) 很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ... WordPress插件制作教程(五): 创建新的数据表 上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ... 查看Linux系统相关版本信息 1.“uname -a” 查看电脑以及操作系统的相关信息 2.“cat /proc/version” 查看运行的内核版本 3."cat /etc/redhat-release", ... python保留两位小数 python保留两位小数: In [1]: a = 5.026 In [2]: b = 5.000 In [3]: round(a,2) Out[3]: 5.03 In [4]: round(b,2) ... MySql增加字段、删除字段、修改字段 MySql增加字段.删除字段.修改字段名称.修改字段类型 1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; / ... Google谷歌推出goo.gl缩短网址服务 - Blog透视镜 Blog部落格文章的网址,例如本篇文章:http://blog.openyu.org/2014/01/google-goo.gl.html,通常都很冗长,分享到社群网站上,容易使得讯息内容过多,同时也 ...