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

news2025/3/3 11:49:37

正交匹配追踪(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 np

def omp(A, y, sparsity):
    """
    正交匹配追踪(OMP)算法。
    
    参数:
    A: 测量矩阵
    y: 观测信号
    k: 近似解的期望稀疏度
    
    返回:
    x: 稀疏解向量
    """
    # 初始化
    m, n = A.shape
    x = np.zeros(n)
    residual = y
    idx = []
    
    for _ in range(sparsity):
        # 找到A的列与残差之间最大相关性的索引
        correlations = A.T @ residual
        i = 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:
            break
    
    return 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.91814335
  0.          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.91814335
  0.          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.coloradmin.cn/o/1459526.html

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

相关文章

【蓝桥杯单片机入门记录】Keil C51仿真调试

目录 一、仿真调试/在线调试的意义 二、程序调试 &#xff08;1&#xff09;修改模拟仿真晶振频率&#xff08;和实际使用保持一致&#xff09; &#xff08;2&#xff09;Debug程序界面设置&#xff08;模拟调试&#xff09; &#xff08;3&#xff09;利用工具栏的Debug…

【LeetCode】无权图的最短路精选7题——单源、多源

目录 无权图的单源最短路问题&#xff1a; 1. 迷宫中离入口最近的出口&#xff08;中等&#xff09; 2. 最小基因变化&#xff08;中等&#xff09; 3. 单词接龙&#xff08;困难&#xff09; 4. 为高尔夫比赛砍树&#xff08;困难&#xff09; 无权图的多源最短路问题&a…

HTML元素和属性快速参考指南

​ 以下是几个与HTML元素和属性相关的参考资料网站链接&#xff1a; HTML Reference - 提供所有HTML元素和属性的免费指南。W3Schools HTML Reference - W3Schools 提供一个广泛的HTML标签和属性参考。freeCodeCamp HTML Cheat Sheet - freeCodeCamp 提供了一个HTML元素列表参…

docker (十一)-进阶篇-docker-compos最佳实践部署zabbix

一 部署docker环境 关闭防火墙、selinux、开启docker&#xff0c;并设置开机自启动 注意点&#xff1a;docker部署的时候&#xff0c;bip要指定&#xff0c;不然会导致虚拟机ip和容器ip冲突&#xff0c;ssh连不上虚拟机 部署请参考 docker &#xff08;二&#xff09;-yum…

【机器学习】数据清洗——基于Numpy库的方法删除重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Github 2024-02-16 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-16统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目3Rust项目3Jupyter Notebook项目1JavaScript项目1 Black&#xff1a;不妥协的Pytho…

并发编程-ReentrantLock 与 ReentrantReadWriteLock(可重入锁,独享锁,公平与非公平锁,读写锁)

AQS实现原理 前期准备 AQS&#xff08;全称AbstractQueuedSynchronizer&#xff09;即队列同步器。它是构建锁或者其他同步组件的基础框架&#xff08;如ReentrantLock、ReentrantReadWriteLock、Semaphore等&#xff09;。 整体概览类图 AbstractQueuedSynchronizer类图 …

汽车控制器软件正向开发

需求常见问题: 1.系统需求没有分层,没有结构化,依赖关系不明确 2.需求中没有验证准则 3.对客户需求的追溯缺失,不完整,颗粒度不够 4.系统需求没有相应的系统架构,需求没有分解到硬件和软件 5.需求变更管控不严格,变更频繁,变更纪录描述不准确,有遗漏,客户需求多…

【MySQL】如何处理DB读写分离数据不一致问题?

文章内容 1、前言读写库数据不一致问题我们如何解决&#xff1f;方案一&#xff1a;利用数据库自身特性方案二&#xff1a;不解决方案三&#xff1a;客户端保存法方案四&#xff1a;缓存标记法方案五&#xff1a;本地缓存标记 那DB读写分离情况下&#xff0c;如何解决缓存和数据…

STM32F1X RS485使用DMA发送丢失数据的处理方法。

串口通过DMA发送一帧数据时总是缺少2个字节&#xff0c;且最后一个字节数据为0xff的原因及解决方法 本次记录为采用485串口发送数据&#xff0c;发送模式是循环检测串口数据寄存器为空&#xff08;TXE&#xff09;和发送完成标志位&#xff08;TC&#xff09;。DMA发送串口方式…

基于java,springboot和vue房屋租赁租房销售平台设计

摘要 在现代城市生活中&#xff0c;房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展&#xff0c;基于Spring Boot和Vue的房屋租赁系统应运而生&#xff0c;旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势&#xff0c;后端…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现&#xff1a;

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配&#xff0c;Rust版的模式匹配稍后就端上来&#xff0c;各位先尝尝Java这杯老咖啡还香不香&#x1f604;。 什么是模式匹配&#xff1f; 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞&#xff0c;我们…

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因&#xff0c;系统地阐述智能运维业务所涵盖的各个方面&#xff0c;包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括&#xff1a; 数据不一致或…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

电脑文件msvcr110.dll缺失的多种解决方法,msvcr110.dll文件修复手段

遭遇"程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll"这样的错误提示&#xff0c;是Windows操作系统用户可能会遇到的一种情况。尽管这种现象在一些用户中较为常见&#xff0c;但解决这一问题并非复杂的过程。本文将深入剖析此问题&#xff0c;并分享一些实用的…

2.16日学习打卡----初学Dubbo(一)

2.16日学习打卡 目录: 2.16日学习打卡一. 什么是分布式&#xff1f;二. 什么是RPC?三. Dubbo概念_简介四. Dubbo核心组件五.Dubbo配置开发环境六. Dubbo配置开发环境_管理控制台 一. 什么是分布式&#xff1f; 可以看我的这篇文章–2.14日学习打卡----初学Zookeeper(一) 二.…