关键词:
Uniform Manifold Approximation and Projection (UMAP):均匀流形近似与投影

一、说明

对于降维,首先看数据集是否线性,如果是线性的用pca降维;如果是非线性数据,t-SNE或者UMAP,本文针对UMAP的实验代码进行记录,但没有说UMAP的原理,原理在其它文档论述。

二、UMAP的基本概念

2.1 首先看什么是流形

流形(manifold)是一种数学概念,它描述了在局部看起来像欧几里得空间的拓扑空间。换句话说,流形是一个可以在局部范围内近似为欧几里得空间的空间。流形在几何、拓扑学、微分几何以及物理学中有广泛的应用。流形的基本概念包括连续性、局部坐标转移性和可微性,常见的例子有闭合曲面和克莱因瓶等。
一般来说,微分几何是建立在流形理论上的,学习这方面的理论可以参照微分几何相关书籍。

2.2 UMAP

均匀流形近似与投影 (UMAP) 是一种降维技术,类似于 t-SNE,可用于可视化,也可用于一般的非线性降维。该算法基于以下三个关于数据的假设:

数据在黎曼流形上均匀分布;
黎曼度量是局部常数(或可以近似为局部常数);
流形是局部连通的。

基于这些假设,可以用模糊拓扑结构对流形进行建模。通过寻找具有最接近等效模糊拓扑结构的数据低维投影来找到嵌入。

2.3 UMAP 安装

在conda上安装umap

conda install -c conda-forge umap-learn

在pip安装

pip install umap-learn

三、基本 UMAP 参数

UMAP 是一种相当灵活的非线性降维算法。它旨在学习数据的流形结构,并找到一个能够保留该流形基本拓扑结构的低维嵌入。在本笔记中,我们将生成一些可可视化的四维数据,演示如何使用 UMAP 提供其二维表示,然后研究各种 UMAP 参数如何影响最终的嵌入。本文档基于 Philippe Rivière 为 visionscarto.net 撰写的研究成果。

首先,我们需要一些基础库。首先numpy,我们需要 来进行基本的数组操作。由于我们要可视化结果,因此需要matplotlib和seaborn。最后,我们需要 umap来进行维度缩减本身。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import umap
%matplotlib inline
sns.set(style='white', context='poster', rc={'figure.figsize':(14,10)})

接下来,我们需要一些数据来嵌入到低维表示中。为了使四维数据“可视化”,我们将从一个四维立方体中均匀随机地生成数据,以便我们可以将样本解释为指定颜色(和透明度)的 (R,G,B,a) 值的元组。这样,当我们绘制低维表示时,每个点都可以根据其四维值进行着色。为此,我们可以使用numpy。为了保持一致性,我们将固定一个随机种子。

np.random.seed(42)
data = np.random.rand(800, 4)

现在我们需要找到数据的低维表示。正如基础用法文档中所述,我们可以通过 在对象fit_transform()上使用方法来做到这一点UMAP。

fit = umap.UMAP()
%time u = fit.fit_transform(data)

CPU times: user 7.73 s, sys: 211 ms, total: 7.94 s
Wall time: 6.8 s
结果值u是数据的二维表示。我们可以用matplotlib绘制散点图来可视化结果u。我们可以使用源数据中关联的四维颜色为散点图的每个点着色。

plt.scatter(u[:,0], u[:,1], c=data)
plt.title('UMAP embedding of random colours');

在这里插入图片描述
正如你所见,结果是数据被放置在二维空间中,使得四维空间中相邻的点(即颜色相似的点)保持紧密相连。由于我们在颜色立方体中随机抽取了一些点,因此在颜色空间中,这些随机点恰好聚集在一起,从而产生了一定程度的诱导结构。

UMAP 有几个超参数会对最终的嵌入产生重大影响。在本笔记中,我们将介绍其中四个主要参数:

n_neighbors
min_dist
n_components
metric

每个参数都有不同的效果,我们将依次进行讨论。为了简化探索,我们首先编写一个简短的效用函数,该函数可以在给定一组参数选择的情况下使用 UMAP 拟合数据,并绘制结果图。

def draw_umap(n_neighbors=15, min_dist=0.1, n_components=2, metric='euclidean', title=''):fit = umap.UMAP(n_neighbors=n_neighbors,min_dist=min_dist,n_components=n_components,metric=metric)u = fit.fit_transform(data);fig = plt.figure()if n_components == 1:ax = fig.add_subplot(111)ax.scatter(u[:,0], range(len(u)), c=data)if n_components == 2:ax = fig.add_subplot(111)ax.scatter(u[:,0], u[:,1], c=data)if n_components == 3:ax = fig.add_subplot(111, projection='3d')ax.scatter(u[:,0], u[:,1], u[:,2], c=data, s=100)plt.title(title, fontsize=18)
  • n_neighbors
    此参数控制 UMAP 如何平衡数据的局部结构与全局结构。它通过限制 UMAP 在尝试学习数据流形结构时所关注的局部邻域的大小来实现这一点。这意味着,较低的 值n_neighbors 将迫使 UMAP 专注于非常局部的结构(可能会损害全局);而较大的 值将迫使 UMAP 在估计数据的流形结构时关注每个点的更大邻域,从而为了获取更广泛的数据而丢失精细的细节结构。

在实践中,我们可以通过使用一系列n_neighbors值来拟合数据集,从而看到这一点。UMAP 的默认值n_neighbors (如上所述)为 15,但我们将研究从 2(流形的局部视图)到 200(数据的四分之一)范围内的值。

for n in (2, 5, 10, 20, 50, 100, 200):draw_umap(n_neighbors=n, title='n_neighbors = {}'.format(n))

在这里插入图片描述
在这里插入图片描述
当值为 时,n_neighbors=2我们可以看到 UMAP 仅仅将一些小的链粘合在一起,但由于视角狭窄/局部,无法看到它们是如何连接的。它还留下了许多不同的组成部分(甚至是单点)。这表明,从细节的角度来看,数据在整个空间中非常不连贯且分散。

随着n_neighborsUMAP 的增加,它能够更好地洞察数据的整体结构,将更多组件粘合在一起,并更好地覆盖数据的整体结构。到这个阶段, n_neighbors=20我们对数据有了相当好的整体视图,展示了各种颜色在整个数据集中是如何相互关联的。

随着n_neighbors数据的整体结构越来越受到关注。结果,虽然 n_neighbors=200图中能够很好地捕捉到整体结构(蓝色、绿色和红色;高亮度与低亮度),但却丢失了一些更精细的局部结构(单个颜色不再必然与其最接近的颜色匹配)。

这种效果很好地体现了所提供的局部/全局权衡 n_neighbors。

  • min_dist

该min_dist参数控制 UMAP 将点打包的紧密程度。它实际上规定了低维表示中允许点之间的最小距离。这意味着较低的 值min_dist将导致嵌入更加块状。如果您对聚类或更精细的拓扑结构感兴趣,这将非常有用。较大的 值 min_dist将阻止 UMAP 将点打包在一起,而是专注于保留大致的拓扑结构。

min_dist(如上所述)的默认值为0.1。我们将查看从 0.0 到 0.99 的值范围。

for d in (0.0, 0.1, 0.25, 0.5, 0.8, 0.99):draw_umap(min_dist=d, title='min_dist = {}'.format(d))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们看到,min_dist=0.0UMAP 能够找到数据中较小的连通分量、团块和字符串,并在生成的嵌入中强调这些特征。随着 的min_dist增加,这些结构被分解成更柔和、更通用的特征,从而在损失更详细的拓扑结构的情况下,提供更好的数据总体视图。

  • n_components

scikit-learn与许多降维算法一样, UMAP 提供了一个n_components参数选项,允许用户确定我们将数据嵌入到的降维空间的维数。与其他一些可视化算法(例如 t-SNE)不同,UMAP 在嵌入维度上具有良好的扩展性,因此您不仅可以将其用于二维或三维可视化,还可以将其用于其他领域。

为了演示的目的(以便我们可以看到参数的效果),我们将只研究一维和三维嵌入,我们希望将其可视化。

首先,我们将设置n_components为 1,强制 UMAP 将数据嵌入到一条线中。为了便于可视化,我们将在 y 轴上随机分布数据,以便在点之间提供一定的分隔。

draw_umap(n_components=1, title='n_components = 1')

在这里插入图片描述
现在我们来尝试一下n_components=3。为了实现可视化,我们将利用的matplotlib基本三维绘图。

draw_umap(n_components=3, title='n_components = 3')

在这里插入图片描述
在这里我们可以看到,有了更多的工作维度,UMAP 可以更轻松地以尊重数据拓扑结构的方式分离出颜色。

如上所述,实际上没有必要止步于n_components=3。如果您对(基于密度的)聚类或其他机器学习技术感兴趣,那么选择一个更大的嵌入维度(例如 10 或 50)并使其更接近数据所在的底层流形的维度可能会有所帮助。

  • metric(度量)

我们将在本笔记本中考虑的最后一个 UMAP 参数是 metric参数。它控制如何在输入数据的环境空间中计算距离。默认情况下,UMAP 支持多种指标,包括:

闵可夫斯基风格度量

欧几里得

曼哈顿

切比雪夫

闵可夫斯基

其他空间指标

堪培拉

布雷柯蒂斯

半正矢

规范化空间度量

马哈拉诺比斯

明科夫斯基

塞克利德

角度和相关性指标

余弦

相关性

二进制数据的指标

汉明
雅卡德
骰子
罗素·拉奥
库尔辛斯基
罗杰斯塔尼莫托
索卡尔米切纳
索卡尔斯尼斯
圣诞节

四、预先计算

以上所有指标都假设你的输入数据是某个 N 维空间中的“原始”数据。有时,你已经计算了点之间的成对距离,并且输入数据是一个距离/相似度矩阵。在这种情况下,你可以执行以下操作。

UMAP(metric='precomputed').fit_transform(<distance matrix>)

其中任何一个都可以通过设置。metric=''metric='cosine’来指定;例如使用余弦距离作为您将使用的度量

然而,UMAP 提供的远不止这些——它支持自定义用户指标,只要这些指标能够nopython通过 numba 编译即可。在本笔记中,我们将研究此类自定义指标。要定义此类指标,我们需要 numba……

import numba

对于我们的第一个自定义指标,我们将距离定义为红色通道中差异的绝对值。

@numba.njit()
def red_channel_dist(a,b):return np.abs(a[0] - b[0])

为了更具冒险精神,进行一些色彩空间转换会很有用——为了简单起见,我们只需使用 HSL 公式从 (R,G,B) 元组中提取色调、饱和度和亮度。

@numba.njit()
def hue(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)delta = cmax - cminif cmax == r:return ((g - b) / delta) % 6elif cmax == g:return ((b - r) / delta) + 2else:return ((r - g) / delta) + 4@numba.njit()
def lightness(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)return (cmax + cmin) / 2.0@numba.njit()
def saturation(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)chroma = cmax - cminlight = lightness(r, g, b)if light == 1:return 0else:return chroma / (1 - abs(2*light - 1))

有了这些,我们可以定义三个额外的距离。第一个简单地测量色调的差异,第二个测量饱和度和亮度组合空间中的欧氏距离,第三个测量完整 HSL 空间中的距离。

@numba.njit()
def hue_dist(a, b):diff = (hue(a[0], a[1], a[2]) - hue(b[0], b[1], b[2])) % 6if diff < 0:return diff + 6else:return diff@numba.njit()
def sl_dist(a, b):a_sat = saturation(a[0], a[1], a[2])b_sat = saturation(b[0], b[1], b[2])a_light = lightness(a[0], a[1], a[2])b_light = lightness(b[0], b[1], b[2])return (a_sat - b_sat)**2 + (a_light - b_light)**2@numba.njit()
def hsl_dist(a, b):a_sat = saturation(a[0], a[1], a[2])b_sat = saturation(b[0], b[1], b[2])a_light = lightness(a[0], a[1], a[2])b_light = lightness(b[0], b[1], b[2])a_hue = hue(a[0], a[1], a[2])b_hue = hue(b[0], b[1], b[2])return (a_sat - b_sat)**2 + (a_light - b_light)**2 + (((a_hue - b_hue) % 6) / 6.0)

有了这些自定义指标,我们就可以让 UMAP 使用这些指标来嵌入数据,以测量输入数据点之间的距离。需要注意的是,这numba为我们定义距离函数提供了极大的灵活性。尽管如此,即使使用这些自定义函数,我们仍然能够保持 UMAP 所期望的高性能。

for m in ("euclidean", red_channel_dist, sl_dist, hue_dist, hsl_dist):name = m if type(m) is str else m.__name__draw_umap(n_components=2, metric=m, title='metric = {}'.format(name))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里,我们可以清楚地看到这些指标的效果。纯红色通道正确地将数据视为位于一维流形上,色调指标将数据解释为位于一个圆圈内,而 HSL 指标则根据饱和度和亮度使圆圈变胖。这合理地证明了 UMAP 在理解数据底层拓扑结构以及找到该拓扑结构的合适低维表示方面的强大功能和灵活性。

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

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

相关文章

【Datawhale组队学习202506】YOLO-Master task03 IOU总结

系列文章目录 task01 导学课程 task02 YOLO系列发展线 文章目录 系列文章目录前言1 功能分块1.1 骨干网络 Backbone1.2 颈部网络 Neck1.3 头部网络 Head1.3.1 边界框回归头1.3.2 分类头 2 关键概念3 典型算法3.1 NMS3.2 IoU 总结 前言 Datawhale是一个专注于AI与数据科学的开…

Spring IOC容器核心揭秘:BeanFactory创建、配置加载解析并注册为BeanDefinition

文章目录 一、为何这个阶段如此重要&#xff1f;二、整体流程全景图三、源码级深度解析1. BeanFactory的诞生源码入口&#xff1a;refresh()方法核心方法&#xff1a;obtainFreshBeanFactory()核心实现&#xff1a;refreshBeanFactory()BeanFactory实例化 2. ★ 核心&#xff1…

解锁n8n:开启工作流自动化的无限可能(5/6)

文章摘要&#xff1a;n8n 是一款开源低代码工作流自动化平台&#xff0c;通过可视化拖放节点创建复杂工作流&#xff0c;无需大量代码。具有强大集成能力、数据转换、错误处理等功能&#xff0c;适用于数据同步、客户关系管理、IT 自动化等场景。相比 Zapier、IFTTT 等工具&…

数据赋能(308)——合作共享——数据交流

概述 重要性如下&#xff1a; 信息准确性&#xff1a;数据交流原则确保在数据传递过程中信息的准确性&#xff0c;这是决策和业务活动的基础。决策支持&#xff1a;准确的数据交流为决策提供有力支持&#xff0c;帮助组织做出更明智的决策。业务效率&#xff1a;有效的数据交…

TCP流量控制与拥塞控制:核心机制与区别

一、TCP流量控制&#xff08;Flow Control&#xff09; 定义&#xff1a;通过调节发送方的发送速率&#xff0c;确保接收方能够及时处理数据&#xff0c;避免缓冲区溢出。 本质&#xff1a;解决发送方与接收方之间的"端到端"速率匹配问题。 1. 实现机制&#xff1a…

iOS多端兼容性调试:一次iOS性能优化分工具协作排查过程

在多技术栈混合开发日益普及的今天&#xff0c;iOS应用中越来越多地集成了WebView、Flutter、React Native甚至小程序模块。而这些模块带来的复杂性&#xff0c;不仅体现在UI适配&#xff0c;还包括数据同步、系统权限管理、线程调度等方面的问题。 本文记录的是我们在处理一个…

秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率&#xff1f; 索引可以理解为目录&#xff0c;通过索引可以快速定位数据&#xff0c;避免全表扫描 一般是B树结构&#xff0c;查找效率是O(log n)。 索引还能加速排序、分组、连接等操作。 create index idx_name on students(name); 能简…

第5天:LSTM预测火灾温度

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前&#xff0c;确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》&#xff1a; 数据目录结构&#xff1a; yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分&#xff0c;比如求物体在流场中所受的总流体牵引力&#xff0c;又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时&#xff0c;物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…

Python 多版本治理理念(Windows 平台 · 零基础友好)

&#x1f9e0; Python 多版本治理理念&#xff08;Windows 平台 零基础友好&#xff09; &#x1f310; 核心原则&#xff1a;三维治理、四级隔离、五项自治 以下是基于人工智能深度学习环境搭建实践&#xff0c;总结出的"零基础入门 Conda工具链 全隔离项目环境"…

Python文件管理利器之Shutil库详解

Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作&#xff0c;还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil&#xff0c;我们可以更加轻松地实现文件系统的管理和维护&#xff0c;本文…

学习华为 ensp 的学习心得体会

引言​ 在信息技术日新月异的今天&#xff0c;网络技术作为连接世界的桥梁&#xff0c;其重要性不言而喻。作为一名对网络技术充满热情的大一新生&#xff0c;我选择了 eNSP&#xff08;Enterprise Network Simulation Platform&#xff0c;企业网络模拟平台&#xff09;作为我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一个小案例讲解:控制面板(GUI)

# 好吧&#xff0c;每天更新实在有点艰巨&#xff0c;我尽量少量多次 代码仓 所有代码都会上传到这里&#xff0c;可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 运行效果图 ​ 知识要点 一、安装dat.gui npm i dat.gui 二、使用步骤&a…

飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究

以下是一篇关于飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究的论文 ,涵盖理论分析、数学模型构建、控制策略设计及仿真验证等内容,适用于电气工程、新能源技术等领域的研究参考。 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究 摘要 随着风电在电力…

一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题&#xff0c;只要按照下面的步骤回答肯定不会有大问题。 1.先告诉面试官垃圾回收分为两大步&#xff1a; a.识别哪些对象是"垃圾"(不再被使用的对象) b.回收这些垃圾对象占用的内存空间 2. 接下来分别介绍标记阶段和回收阶段的细节…

XML映射文件-辅助配置

如果你没有按照同包同名来&#xff0c;就要下面的配置&#xff0c;指定好路径 1.把路径改为类下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路径和

题目 解答&#xff1a; 直接按照空间复杂度O(n)来做了。这种明显是动态规划&#xff0c;每一层用到上一层的信息。 观察数据形状&#xff0c;如下&#xff1a; (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 设dp[n],定义为本层第n…