当前位置: 首页 > article >正文

Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码)

Sinkhorn算法实战用Python手把手教你解决最优传输问题附完整代码最优传输理论在机器学习领域正掀起一场静默的革命。想象一下这样的场景你需要将一组资源从A地运往B地同时希望运输成本最低或者你需要将一幅图像的颜色分布调整为另一幅图像的风格。这些看似不同的问题背后都隐藏着同一个数学框架——最优传输。而Sinkhorn算法正是让这个理论走出数学殿堂、走进工程师电脑的魔法钥匙。1. 最优传输与Sinkhorn算法基础最优传输问题最早由法国数学家蒙日(Gaspard Monge)在1781年提出核心思想是如何以最小的成本将一个概率分布转换为另一个概率分布。这里的成本可以是我们熟悉的欧式距离也可以是任何自定义的度量标准。传统的最优传输解法面临两大挑战计算复杂度高精确解法的时间复杂度通常为O(n³)数值不稳定当分布中存在零值时容易产生数值问题Sinkhorn算法通过引入熵正则化巧妙地解决了这些问题。其核心公式可以表示为P diag(u) K diag(v) # 运输矩阵分解形式其中K exp(-C/ε)是经过指数变换的成本矩阵u和v是通过迭代更新的缩放向量ε是控制正则化强度的超参数提示熵正则化参数ε的选择至关重要——较大的ε使问题更平滑但结果更模糊较小的ε更精确但计算更困难2. Python实现详解让我们从零开始实现Sinkhorn算法。首先确保安装必要的库pip install numpy matplotlib POT2.1 算法核心实现import numpy as np def sinkhorn(a, b, C, epsilon0.1, max_iter1000, tol1e-9): Sinkhorn算法实现 参数: a: (n,) 源分布 b: (m,) 目标分布 C: (n,m) 成本矩阵 epsilon: 正则化参数 max_iter: 最大迭代次数 tol: 收敛阈值 返回: P: (n,m) 最优传输矩阵 # 初始化 u np.ones_like(a) v np.ones_like(b) K np.exp(-C / epsilon) # 迭代更新 for _ in range(max_iter): u_prev, v_prev u.copy(), v.copy() u a / (K v) v b / (K.T u) # 检查收敛 if (np.max(np.abs(u - u_prev)) tol and np.max(np.abs(v - v_prev)) tol): break return np.diag(u) K np.diag(v)2.2 可视化分析理解算法行为的最佳方式是可视化。我们创建两个高斯分布并观察它们的传输过程import matplotlib.pyplot as plt from ot.datasets import make_1D_gauss # 生成数据 n 100 x np.arange(n) a make_1D_gauss(n, m20, s5) # 源分布 b make_1D_gauss(n, m70, s10) # 目标分布 # 成本矩阵 C (x.reshape(-1,1) - x.reshape(1,-1))**2 / n**2 # 计算传输 P sinkhorn(a, b, C, epsilon0.05) # 可视化 plt.figure(figsize(12,8)) plt.subplot(2,2,1) plt.plot(x, a, r, labelSource) plt.plot(x, b, b, labelTarget) plt.legend() plt.subplot(2,2,2) plt.imshow(P, cmapviridis) plt.title(Transport Matrix) plt.subplot(2,2,3) plt.plot(P.sum(1), r--, labelMarginal a) plt.plot(a, r, alpha0.3) plt.plot(P.sum(0), b--, labelMarginal b) plt.plot(b, b, alpha0.3) plt.legend() plt.tight_layout()3. 参数调优与性能优化3.1 正则化参数ε的影响ε的选择直接影响结果的质量和计算效率ε值计算速度结果精度适用场景较大(0.1)快低初步探索/可视化中等(0.01-0.1)中等中等一般应用较小(0.01)慢高精确计算# 测试不同ε值 epsilons [0.5, 0.1, 0.05, 0.01] results {} for eps in epsilons: results[eps] sinkhorn(a, b, C, epsiloneps)3.2 加速技巧实际应用中可以采用以下优化策略对数域计算避免数值下溢批处理同时计算多个传输对GPU加速使用CuPy替代NumPy改进后的对数域实现def sinkhorn_log(a, b, C, epsilon0.1, max_iter1000): 对数域实现 log_a np.log(a) log_b np.log(b) log_K -C / epsilon u np.zeros_like(a) v np.zeros_like(b) for _ in range(max_iter): u log_a - np.log(np.exp(log_K v).sum(1)) v log_b - np.log(np.exp(log_K.T u).sum(1)) return np.exp(u[:,None] log_K v)4. 实战应用案例4.1 图像颜色迁移将一张图像的色彩分布迁移到另一张图像from skimage import data, transform import cv2 # 加载图像 src_img data.astronaut() tgt_img data.chelsea() # 预处理 src cv2.cvtColor(src_img, cv2.COLOR_RGB2LAB).reshape(-1,3)/255. tgt cv2.cvtColor(tgt_img, cv2.COLOR_RGB2LAB).reshape(-1,3)/255. # 采样 n_samples 1000 src_samples src[np.random.choice(len(src), n_samples)] tgt_samples tgt[np.random.choice(len(tgt), n_samples)] # 计算成本矩阵 C np.sum(src_samples**2, 1)[:,None] np.sum(tgt_samples**2, 1)[None,:] - 2*src_samples tgt_samples.T # 计算传输 P sinkhorn(np.ones(n_samples)/n_samples, np.ones(n_samples)/n_samples, C, epsilon0.01) # 应用传输 transported tgt_samples[np.argmax(P, axis1)]4.2 文档嵌入对齐对齐不同语言模型的词嵌入空间from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer # 加载双语语料 en_data fetch_20newsgroups(subsettrain, categories[sci.space]).data[:100] fr_data [...] # 假设有对应的法语翻译 # 创建嵌入 en_vec TfidfVectorizer(max_features500).fit_transform(en_data) fr_vec TfidfVectorizer(max_features500).fit_transform(fr_data) # 计算分布 en_dist np.array(en_vec.mean(axis0)).flatten() fr_dist np.array(fr_vec.mean(axis0)).flatten() # 计算词-词成本矩阵 en_emb [...] # 英语词向量 fr_emb [...] # 法语词向量 C np.linalg.norm(en_emb[:,None] - fr_emb[None,:], axis2) # 对齐 P sinkhorn(en_dist, fr_dist, C, epsilon0.1) aligned_emb P fr_emb / en_dist[:,None]5. 高级技巧与问题排查5.1 常见问题解决方案问题现象可能原因解决方案结果全为NaNε太小导致数值溢出使用对数域实现或增大ε收敛慢成本矩阵尺度不一致标准化成本矩阵边缘约束不满足迭代次数不足增加max_iter或降低tol5.2 扩展到不平衡传输当总质量不相等时可以使用部分传输def unbalanced_sinkhorn(a, b, C, epsilon0.1, tau1.0): 不平衡传输 K np.exp(-C / epsilon) u np.ones_like(a) v np.ones_like(b) for _ in range(1000): u (a / (K v)) ** tau v (b / (K.T u)) ** tau return np.diag(u) K np.diag(v)5.3 多尺度加速对于大规模问题可以采用多尺度方法对分布进行粗粒度化在粗粒度上计算传输将结果作为细粒度初始值逐步细化def multiscale_sinkhorn(a, b, C, levels3): 多尺度Sinkhorn # 构建金字塔 a_pyramid [a] b_pyramid [b] C_pyramid [C] for _ in range(levels-1): a_pyramid.append(a_pyramid[-1][::2] a_pyramid[-1][1::2]) b_pyramid.append(b_pyramid[-1][::2] b_pyramid[-1][1::2]) C_pyramid.append(C_pyramid[-1][::2,::2] C_pyramid[-1][1::2,::2] C_pyramid[-1][::2,1::2] C_pyramid[-1][1::2,1::2]) # 从粗到细计算 P np.ones_like(C_pyramid[-1]) for l in reversed(range(levels)): a_l, b_l, C_l a_pyramid[l], b_pyramid[l], C_pyramid[l] if l levels-1: P np.kron(P, np.ones((2,2))) # 上采样 P P * (a_l.sum() / P.sum()) # 重新归一化 P sinkhorn(a_l, b_l, C_l, initialP) return P在实际项目中我发现多尺度方法可以将计算时间从数小时缩短到几分钟特别是在处理高分辨率图像或大规模嵌入时效果显著。另一个实用技巧是预热初始化——先用较大的ε值计算然后逐步减小ε并使用前一次结果作为初始值这样通常能获得更好的收敛性。

相关文章:

Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码)

Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码) 最优传输理论在机器学习领域正掀起一场静默的革命。想象一下这样的场景:你需要将一组资源从A地运往B地,同时希望运输成本最低;或者你需要…...

Webcam-Pulse-Detector实战应用:构建远程健康监测系统

Webcam-Pulse-Detector实战应用:构建远程健康监测系统 【免费下载链接】webcam-pulse-detector A python application that detects and highlights the heart-rate of an individual (using only their own webcam) in real-time. 项目地址: https://gitcode.com…...

Playwright浏览器上下文全解析:如何用Python实现多账号同时登录测试?

Playwright浏览器上下文全解析:如何用Python实现多账号同时登录测试? 在当今复杂的Web应用生态中,自动化测试工程师经常面临一个核心挑战:如何高效模拟真实用户的多账号并行操作场景?无论是电商平台的促销活动测试、社…...

ComfyUI-Easy-Use:如何高效管理GPU资源并优化深度学习推理性能

ComfyUI-Easy-Use:如何高效管理GPU资源并优化深度学习推理性能 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.c…...

VSCode里玩转Qt Designer:手把手教你可视化设计PyQt5界面并自动生成Python代码

VSCode高效开发PyQt5:可视化设计与自动化代码生成实战 在Python GUI开发领域,PyQt5凭借其强大的功能和跨平台特性成为众多开发者的首选。然而,传统的手写界面布局代码不仅耗时耗力,还难以实时预览效果。本文将带你探索如何在VSCod…...

OpenClaw技能扩展:用GLM-4.7-Flash实现Markdown文档自动整理

OpenClaw技能扩展:用GLM-4.7-Flash实现Markdown文档自动整理 1. 为什么需要文档自动化整理 作为一个长期使用Markdown写作的技术博主,我的文档库已经积累了超过2000篇笔记和草稿。曾经有整整三个月,我每周都要花3-4小时手动整理这些文档——…...

AudioSeal Pixel Studio实战教程:与LangChain音频处理Agent集成

AudioSeal Pixel Studio实战教程:与LangChain音频处理Agent集成 1. 工具介绍与核心价值 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的专业音频水印工具。它能够在保持原始音质几乎不变的情况下,为音频文件嵌入隐形数字水印&#xf…...

回溯法与剪枝优化:高效求解n位逐位整除数的实战解析

1. 什么是n位逐位整除数? n位逐位整除数是一种特殊的数字序列,它满足从最高位开始,前k位组成的数字必须能被k整除(k从1到n)。举个例子,数字102450就是一个6位整除数: 第1位1能被1整除前2位10能被…...

FastAPI速率限制:Redis分布式实现的终极指南

FastAPI速率限制:Redis分布式实现的终极指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为高性能的现代Web框…...

SeqGPT-560M开源可部署安全实践:SELinux策略配置与容器最小权限原则

SeqGPT-560M开源可部署安全实践:SELinux策略配置与容器最小权限原则 1. 引言:为什么企业级AI部署必须关注安全? 当你把像SeqGPT-560M这样强大的智能信息抽取系统部署到生产环境时,兴奋之余,一个严肃的问题必须摆在首…...

前端面试高频考点总结(不仅有考点,还有对应解答)

2026年 AI面试 经验分享 前端面试核心要点 技术考察转向实际场景与新兴技术,重点包括: JavaScript/TypeScript核心机制与编码能力React/Vue3的高阶特性与原理工程化与性能优化体系网络/安全与综合性场景题 3-5年经验者需突出: 技术原理深度&a…...

Swin2SR进阶使用:通过HTTP链接实现远程增强

Swin2SR进阶使用:通过HTTP链接实现远程增强 1. 引言:从本地工具到远程服务 如果你用过Swin2SR这个AI图像超分工具,一定会被它“化腐朽为神奇”的能力震撼——一张模糊的小图,经过AI的“脑补”,瞬间变成细节丰富的高清…...

3个秘诀让AI成为你的象棋教练:Vin象棋智能助手完全指南

3个秘诀让AI成为你的象棋教练:Vin象棋智能助手完全指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 你是否曾遇到这样的象棋困境&#xff1…...

如何快速上手Archivy:5分钟搭建个人知识管理系统

如何快速上手Archivy:5分钟搭建个人知识管理系统 【免费下载链接】archivy Archivy is a self-hostable knowledge repository that allows you to learn and retain information in your own personal and extensible wiki. 项目地址: https://gitcode.com/gh_mi…...

80+款Android UI模板深度解析:从零到一构建专业级应用界面的实战指南

80款Android UI模板深度解析:从零到一构建专业级应用界面的实战指南 【免费下载链接】Android-ui-templates Download free android app templates free and paid. 项目地址: https://gitcode.com/gh_mirrors/an/Android-ui-templates 在当今移动应用开发领域…...

革命性智能求职助手:AI驱动的多平台简历投递解决方案

革命性智能求职助手:AI驱动的多平台简历投递解决方案 【免费下载链接】get_jobs 💼【找工作最强助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、拉勾、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs 你是否还…...

存储性能指标全解析:从IOPS到响应时间的实战指南

1. 存储性能指标入门:从买菜到地铁的日常类比 刚接触存储性能指标时,那些英文缩写就像天书一样让人头疼。其实这些概念在我们生活中随处可见,只是换了个马甲而已。想象一下早高峰的地铁站:IOPS就像每分钟通过闸机的人数&#xff0…...

QT5集成libmodbus:多线程优化主从机通信的实践指南

1. 为什么需要多线程优化libmodbus通信 在工业监控软件开发中,我们经常遇到一个典型场景:上位机需要实时采集多个下位机的数据,同时还要保证用户界面的流畅响应。使用QT5集成libmodbus时,很多开发者会直接在主线程中实现数据采集逻…...

电机控制进阶:从增量式与位置式PID到现代复合控制策略

1. PID控制的前世今生:从工业革命到智能时代 第一次接触PID控制器时,我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机,系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条:"试…...

2026最新!AI论文软件测评:这几款让你写作更高效

2026年真正好用的AI论文软件,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...

BongoCat:重新定义桌面体验的互动工具

BongoCat:重新定义桌面体验的互动工具 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 你是否曾觉得日复一日的…...

OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术

OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler OptiScaler是一…...

MATLAB实时绘图卡顿?优化串口通信与图形刷新的几个实用技巧

MATLAB实时绘图性能优化:突破串口通信与图形刷新的瓶颈 当你在实验室里盯着屏幕上跳动的数据曲线,却发现它像老式幻灯片一样一卡一顿时,那种挫败感简直让人抓狂。特别是在处理高速ADC采样或长时间运行的实验时,MATLAB默认的绘图方…...

避坑指南:glmnet做lasso回归时分类变量的3个常见错误及解决方法

避坑指南:glmnet做lasso回归时分类变量的3个常见错误及解决方法 在生物信息学和临床数据分析领域,lasso回归因其出色的变量选择能力而广受欢迎。R语言中的glmnet包是实现lasso回归的利器,但许多初学者在处理分类变量时频频踩坑。本文将揭示三…...

从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比

从MATLAB到Python:脑网络连通性分析之PLI/wPLI的跨平台实现与结果对比 神经科学研究中,脑网络连通性分析正成为理解认知功能与疾病机制的重要工具。其中,相位滞后指数(PLI)及其加权版本(wPLI)因…...

Pipfile vs requirements.txt:10个关键差异对比分析

Pipfile vs requirements.txt:10个关键差异对比分析 【免费下载链接】pipfile 项目地址: https://gitcode.com/gh_mirrors/pi/pipfile 在Python开发中,依赖管理是项目成功的关键环节。Pipfile和requirements.txt作为两种主流的依赖管理方式&…...

从“触觉神经”到“智能反射”:六维力传感器如何重塑人形机器人的交互范式

1. 六维力传感器:人形机器人的"触觉神经" 想象一下你闭着眼睛伸手去拿桌上的水杯。在指尖接触杯壁的瞬间,你的皮肤会感知压力变化,神经信号以毫秒级速度传递到大脑,手指肌肉随即调整力度——既不会捏碎杯子,…...

AnythingLLM文档处理革命:如何用统一接口解析20+文件格式构建智能知识库

AnythingLLM文档处理革命:如何用统一接口解析20文件格式构建智能知识库 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型…...

PFC 2D二维直剪代码解析与源文件分享

PFC 2D 二维直剪,代码逐行解释,提供源文件。 。 嘿,各位岩土工程或者离散元爱好者们!今天咱来唠唠PFC 2D里二维直剪的事儿,顺便把代码给大家扒一扒,逐行解释清楚,最后源文件也双手奉上&#xff…...

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品

如何用Pollinations.ai在5分钟内创建专业级AI艺术作品 【免费下载链接】pollinations Generate Art 项目地址: https://gitcode.com/gh_mirrors/po/pollinations Pollinations.ai是一款强大的开源AI艺术生成工具,能让你在短短5分钟内从零开始创建令人惊叹的专…...