正交匹配追踪算法(Orthogonal Matching Pursuit)实现过程及Python模拟

正交匹配追踪(Orthogonal Matching Pursuit,OMP)是一种用于寻找稀疏信号的贪婪算法,用于求解压缩感知问题中的稀疏近似问题。在压缩感知的背景下,通常我们有一个欠定的线性系统Ax = y,其中A是一个已知的测量矩阵,y是观测到的信号,而x是未知的稀疏信号。OMP 试图找到一个稀疏信号x的解,使得Ax尽可能接近y

定义

OMP算法的目标是解决下面的优化问题:在已知观测向量y和测量矩阵A的情况下,找到一个稀疏的系数向量x,使得Ax尽可能接近于y。这个问题可以用下面的公式表示:

minimize ||x||_0 subject to ||Ax - y||_2 < ε

其中||x||_0x向量的0-范数(即非零元素的数量),而||Ax - y||_2Axy之间的2-范数(即欧几里得距离)。ε是一个容差值,代表了在重构y时所能接受的最大误差。

OMP算法的优点是简单易用、实现快捷,并且相对容易理解。然而由于它是一种贪婪算法,因此有时可能不会找到全局最优解。

应用领域

正交匹配追踪的应用非常广泛,以下是一些主要的应用领域:

  1. 压缩感知:在这个领域中,OMP用于从少量的非自适应线性测量中重构稀疏或压缩的信号。应用包括图像恢复、医学成像(如MRI)、雷达信号处理和无线通信等。

  2. 信号处理:在音频和语音处理、图像处理以及其他信号处理领域中,OMP用于去除噪声、数据压缩、特征提取等任务,特别是在处理信号的稀疏表示时。

  3. 机器学习与数据挖掘:OMP可以作为特征选择方法,帮助从大量特征中选择出对模型影响最为重要的一部分,从而减少模型的复杂性和过拟合的风险。

  4. 计算机视觉:在计算机视觉中,OMP用于目标跟踪、图像分类、图像超分辨率重建和其他图像相关问题。

  5. 生物信息学和遗传学:OMP可以用来识别具有显著生物学作用的基因,通过分析基因表达数据来解析出对某种疾病或条件具有重要影响的生物标志物。

综上所述,正交匹配追踪(OMP)因其在处理稀疏信号重建问题上的简洁性和有效性而被广泛应用于许多科学和工程学科领域。

OMP实现步骤

OMP按以下步骤工作:

  1. 初始化:将解向量x设置为零向量,残差r设置为观测信号y

  2. 迭代直到满足稀疏性要求或残差足够小:

    • 找到与当前残差r最相关的列(原子)从矩阵A中。
    • 更新支持集(包含已选择原子的索引集合)。
    • 求解一个最小二乘问题以更新当前的解x,使Ax最好地拟合y(但只在支持集上的列中)。
    • 计算新的残差r = y - Ax
  3. 输出稀疏解x

Python代码实现

下面是一个使用Python语言实现的OMP算法的例子:

Python

具体代码如下:

# -*- coding: utf-8 -*-
"""
创建于 2024年2月20日 星期二 21:28:40作者:李立宗公众号:计算机视觉之光知识星球:计算机视觉之光"""import numpy as npdef omp(A, y, sparsity):"""正交匹配追踪(OMP)算法。参数:A: 测量矩阵y: 观测信号k: 近似解的期望稀疏度返回:x: 稀疏解向量"""# 初始化m, n = A.shapex = np.zeros(n)residual = yidx = []for _ in range(sparsity):# 找到A的列与残差之间最大相关性的索引correlations = A.T @ residuali = np.argmax(np.abs(correlations))idx.append(i)# 更新支撑集合并构造限制矩阵As = A[:, idx]# 解决限制为支持集合中索引的A列的最小二乘问题x_temp = np.linalg.lstsq(As, y, rcond=None)[0]# 更新近似解x[idx] = x_temp# 重新计算残差residual = y - As @ x_temp# 检查残差是否接近零if np.linalg.norm(residual) < 1e-6:breakreturn x# 示例用法:
# 信号和测量参数
m = 40    # 观测次数
n = 100   # 稀疏信号的长度
k = 10    # 信号的稀疏级别# 生成一个随机测量矩阵
A = np.random.randn(m, n)# 生成一个稀疏信号
x_true = np.zeros(n)
x_true[np.random.choice(n, k, replace=False)] = np.random.randn(k)# 生成观测信号
y = A @ x_true# 使用OMP算法
x_pred = omp(A, y, sparsity=k)# 检查恢复结果
print("原始信号:", x_true)
print("恢复信号:", x_pred)
print("恢复误差:", np.linalg.norm(x_pred - x_true))

在上述代码中,我们首先定义了一个omp函数,该函数接收测量矩阵A,观测到的信号y以及所需的稀疏性水平sparsity。函数返回一个稀疏向量x,它是y的近似解。然后,我们通过一个小例子来描述OMP的应用过程,其中我们先随机生成一个稀疏信号,然后通过OMP算法重构该信号。最后,输出原始信号、重构信号和它们之间的误差。

输出结果

输出结果如下所示:

原始信号: [ 0.          0.          0.          0.          0.          0.0.         -1.0476138   0.         -1.16136095  0.          0.0.          0.          0.          0.          0.          0.0.          0.         -1.03891447  0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.5169007   0.0.          0.          0.          0.          0.          0.0.         -0.58272861  0.          0.          0.         -0.0918172-0.26531238  0.          0.          0.          0.          0.0.          0.         -0.30563939  0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          1.918143350.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          1.90061899]
恢复信号: [ 0.          0.          0.          0.          0.          0.0.         -1.0476138   0.         -1.16136095  0.          0.0.          0.          0.          0.          0.          0.0.          0.         -1.03891447  0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.5169007   0.0.          0.          0.          0.          0.          0.0.         -0.58272861  0.          0.          0.         -0.0918172-0.26531238  0.          0.          0.          0.          0.0.          0.         -0.30563939  0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          1.918143350.          0.          0.          0.          0.          0.0.          0.          0.          0.          0.          0.0.          0.          0.          1.90061899]
恢复误差: 2.182124926419888e-15

在这里插入图片描述

相关博文

理解并实现OpenCV中的图像平滑技术

OpenCV中的边缘检测技术及实现

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

我的图书

下面两本书欢迎大家参考学习。

OpenCV轻松入门

李立宗,OpenCV轻松入门,电子工业出版社,2023
本书基于面向 Python 的 OpenCV(OpenCV for Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。

在介绍 OpenCV 函数的使用方法时,提供了大量的程序示例,并以循序渐进的方式展开。首先,直观地展示函数在易于观察的小数组上的使用方法、处理过程、运行结果,方便读者更深入地理解函数的原理、使用方法、运行机制、处理结果。在此基础上,进一步介绍如何更好地使用函数处理图像。在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的实例来说明问题,避免使用过多复杂抽象的公式。

本书适合计算机视觉领域的初学者阅读,包括在校学生、教师、专业技术人员、图像处理爱好者。
本书第1版出版后,深受广大读者朋友的喜爱,被很多高校选为教材,目前已经累计重印9次。为了更好地方便大家学习,对本书进行了修订。
在这里插入图片描述

计算机视觉40例

李立宗,计算机视觉40例,电子工业出版社,2022
近年来,我深耕计算机视觉领域的课程研发工作,在该领域尤其是OpenCV-Python方面积累了一点儿经验。因此,我经常会收到该领域相关知识点的咨询,内容涵盖图像处理的基础知识、OpenCV工具的使用、深度学习的具体应用等多个方面。为了更好地把所积累的知识以图文的形式分享给大家,我将该领域内的知识点进行了系统的整理,编写了本书。希望本书的内容能够对大家在计算机视觉方向的学习有所帮助。
本书以OpenCV-Python(the Python API for OpenCV)为工具,以案例为载体,系统介绍了计算机视觉从入门到深度学习的相关知识点。
本书从计算机视觉基础、经典案例、机器学习、深度学习、人脸识别应用等五个方面对计算机视觉的相关知识点做了全面、系统、深入的介绍。书中共介绍了40余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信奥一本通:2022:【例4.7】最小n值

这个题目的难点在于他让你输入1 2 3&#xff0c;不等的数&#xff0c;意思就是你不知道循环要执行几次&#xff0c;用户输入几次就是几次&#xff0c;那就只有这样写 while (cin >> num) #include <iostream> # include <iomanip> using namespace std;…

第三百五十九回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

【C++杂货铺】模板

&#x1f308;前言&#x1f308; 欢迎观看本期【C杂货铺】&#xff0c;本期内容将讲解模板的初阶&#xff0c;即了解模板&#xff0c;熟练掌握模板的使用方法&#xff0c;了解模板的工作原理等内容。 &#x1f4c1; 函数模板 &#x1f4c2; 概念 函数模板代表了一个函数家族&am…

如何在Windows系统中检测和结束运行中的程序(任务管理器显示运行程序可能有bug)

如何在Windows系统中检测和结束运行中的程序 在Windows系统的日常使用和管理过程中&#xff0c;我们经常需要检测某个程序是否正在运行&#xff0c;并在必要时结束它。本文将详细介绍如何在Windows系统中检测运行中的程序&#xff0c;并提供多种方法来结束这些程序。 检测运行…

通俗易懂的双亲委派机制

当你超过别人一点点&#xff0c;别人会嫉妒你&#xff1b;当你超过别人一大截&#xff0c;别人就会羡慕你 据说给我点关注的都成了大佬&#xff0c;点关注的我都会私发一份好东西 ​​​​你得先知道 在介绍双亲委派机制的时候&#xff0c;不得不提ClassLoader&#xff08;类…

Java字符串转整数的超简单方法!

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 问题描述 当你把一个字符串值和一个整数加在一起而不进行任何形式的转换时会发生什么呢&#…

聚合支付,聚合系统,聚合程序或将成为主流

支付市场的变化对用户、代理商和运营商产生了重大影响。 随着政策监管的日益严格&#xff0c;支付行业逐渐朝着标准化和合理化的方向发展&#xff0c;日益增强其安全性。在这个背景下&#xff0c;聚合平台已经成为未来支付行业发展的重要趋势。特别是在“一机一码”政策实施后&…

前端进度条组件NProgress

nprogress 安装 npm install --save nprogress使用 import NProgress from nprogress // 引入nprogress插件 import nprogress/nprogress.css // 这个nprogress样式必须引入// axios请求拦截器 axios.interceptors.request.use(config > {NProgress.start() // 设置加载进…

【学习心得】编程小白该如何学好C语言(✨新手推荐阅读)

前言 对于刚刚踏入编程领域的小白来说&#xff0c;C语言可能是一个既神秘又充满挑战的领域。但只要你掌握了正确的学习方法&#xff0c;C语言的学习之旅也可以是充满乐趣和成就感的。 一、明确学习目标 对于初学者来说&#xff0c;明确学习目标是学好C语言的第一步。一个清晰…

BIG DATA —— 大数据时代

大数据时代 [英] 维克托 迈尔 — 舍恩伯格 肯尼斯 库克耶 ◎ 著 盛杨燕 周涛◎译 《大数据时代》是国外大数据研究的先河之作&#xff0c;本书作者维克托迈尔舍恩伯格被誉为“大数据商业应用第一人”&#xff0c;他在书中前瞻性地指出&#xff0c;大数据带来的信息…

扩散模型+轨迹预测

目录 1. 基础知识2. 轨迹预测相关2.1 Leapfrog Diffusion Model2.2 MID2.3 中科院2.4 DICE2.5 MotionDiffuser2.6 DiffTraj 3. 练手时可参考4. 扩展&#xff1a;扩散模型RL 1. 基础知识 Stable diffusion扩散模型相关 Diffusion相关二 Diffusers是hugging face发起的用于专门…

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

单片机03--按键--寄存器版

GPIO端口相关寄存器&#xff08;STM32F40x芯片&#xff09; 目标&#xff1a; 开关KEY1控制开灯。 分析&#xff1a; KEY1---PA0--->输入---->浮空输入/下拉输入 KEY1不导通时&#xff0c;PA0输入为低电平&#xff0c;KEY1导通时&#xff0c;PA0输入为高电平。 实现…

Vue中 Runtime-Only和Runtime + Compiler的区别

在 Vue 项目中&#xff0c;Runtime-Only 和 Runtime Compiler 是两种不同的构建方式。 Runtime-Only&#xff08;仅运行时&#xff09;&#xff1a;在 Runtime-Only 构建中&#xff0c;Vue 库只包含运行时的代码&#xff0c;不包含模板编译器。。Runtime Compiler&#xff08…

Vue3-组合式Api(重点)

阅读文章你可以收获的知识 1.知道setup语法糖的使用和如何实现的 2.知道在vue3中如何定义响应式数据 3.知道在vue3中如何定义一个计算属性&#xff08;computed&#xff09; 4.知道如何在vue3中使用watch来监听数据 5.知道在vue3如何实现父子通信 6.知道vue3如何使用ref函…

BIM工程师认证相关信息

目录 背景 一、中国图学学会颁发的全国BIM技能等级考试证书 二、中国建设教育协会颁发的BIM证书 背景 BIM工程师证书是建筑信息模型证书&#xff0c;英文全称是Building Information Modeling。对于建筑工程从业人员来说&#xff0c;BIM证书可以证明个人的工作能力&#xf…

软件测试工程师linux学习之系统层面相关命令总结

1 linux系统重启和关机的命令 重启命令&#xff1a;reboot 关机命令&#xff1a;shutdown 这两个命令一般很少用到&#xff0c;我们了解即可。 2 查看日志信息命令 什么是日志&#xff0c;日志就是一个一个普通的文本文件&#xff0c;文件里面记录的是软件运行过程中的信息…

一、初始 Vue

1、Vue 1.1 Vue简介 1.1.1 Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…

Stable Diffusion 绘画入门教程(webui)-ControlNet

ControlNet可以说在SD里有着举足轻重的地位&#xff0c;如果没有ControlNet&#xff0c;sd的可玩性和实用性将大大降低。 前面几篇文章介绍了 提示词 和 lora&#xff0c;本篇文章介绍sd里最关键的第三个要素–ControlNet 文章目录 一、它具体能干啥1、艺术字2、改变姿态3、其…