
在现代科研中,我们越来越容易遇到“高维数据”。一项单细胞 RNA 测序实验可以同时测量成千上万个基因;代谢组学实验可能检测数百甚至上千种代谢物;蛋白质组学、空间转录组学以及机器学习研究同样会产生大量变量。
面对这样的数据,研究者经常会遇到一个非常现实的问题:当一个样本同时具有几百、几千甚至上万个特征时,我们如何把这些高维数据“画出来”?
PCA(Principal Component Analysis,主成分分析)是最经典的解决方案之一。但当数据具有复杂的非线性结构时,仅仅依靠线性降维可能并不能充分展示数据中的局部结构。这也是 UMAP 越来越受到关注的原因。
UMAP,全称 Uniform Manifold Approximation and Projection,中文通常译为“均匀流形逼近与投影”,是一种基于流形学习(manifold learning)的非线性降维方法。它尤其适合将高维数据转换为二维或三维表示,用于探索数据中的聚类、局部邻域关系和潜在结构。
今天我们在单细胞测序、机器学习、图像分析以及其他组学研究中看到的大量 UMAP 图,实际上就是这种方法的应用结果。那么,UMAP究竟是什么?它和PCA、t-SNE有什么区别?为什么单细胞研究中如此常见?UMAP图上的两个坐标轴应该如何解释?n_neighbors 和 min_dist 到底应该怎么设置?
下面就让AJE系统介绍。
UMAP到底是什么?
假设一个实验有n个样本,每个样本包含 p 个变量。那么我们可以将数据表示为一个矩阵:

例如,在一项基因表达研究中:
- 每一行可以代表一个细胞;
- 每一列可以代表一个基因;
- 每个元素代表该细胞中对应基因的表达量。
如果研究包含10,000个细胞和20,000个基因,那么每个细胞实际上都位于一个 20,000维空间 中。显然,我们无法直接把20,000维空间画在普通的二维坐标系中。
UMAP的基本任务,就是寻找一个低维空间,例如二维空间,使原始高维数据中的重要结构能够尽可能保留下来。可以简单理解为:UMAP试图把高维数据中的“谁和谁比较接近”保留下来,然后把这些复杂关系重新组织到二维或三维空间中。因此,如果原始高维空间中两个样本具有相似的特征,它们在UMAP图中通常也会比较接近。反过来,如果两个样本在原始数据空间中的特征差异较大,那么它们通常会出现在UMAP图中相对不同的位置。
需要特别强调的是,UMAP并不是简单地把原来的坐标轴“压缩”成两个坐标轴,而是在重新构建数据的低维表示。
UMAP的历史
UMAP并不是最早用于高维数据可视化的方法。在它出现之前,研究者已经发展出了许多经典的降维方法,包括PCA、MDS(Multidimensional Scaling)、Isomap、LLE(Locally Linear Embedding)以及t-SNE等。
其中,PCA主要解决的是线性降维问题,而t-SNE则成为高维数据可视化领域非常流行的非线性方法。UMAP则是在这一背景下发展起来的。
2018年,Leland McInnes、John Healy和James Melville发表论文:UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction
提出了UMAP算法。该方法建立在流形学习、黎曼几何和代数拓扑等理论基础上。原始论文提出,UMAP能够用于高维数据的非线性降维,并在可视化质量和计算效率方面与t-SNE具有竞争力。
此后,UMAP逐渐进入Python数据科学和生物信息学工具链。
目前最常用的Python实现是 umap-learn,由UMAP原作者团队维护。官方项目同时支持普通UMAP、densMAP、Parametric UMAP、Supervised UMAP等扩展方法。
2024年,Healy和McInnes又在 Nature Reviews Methods Primers 发表了系统性的 UMAP Primer,对UMAP的原理、应用、参数选择、结果解释和局限性进行了全面总结。因此,如果你希望深入学习UMAP,这篇2024年的综述是目前非常值得参考的资料之一。
UMAP为什么能够实现降维?
理解UMAP最重要的一个关键词是:邻居。传统的PCA主要寻找能够最大程度解释数据方差的方向。UMAP采取了不同的思路。它更关心:在高维空间中,一个数据点周围有哪些“邻居”?
假设我们有1000个细胞。对于其中一个细胞A,我们可以寻找与它最相似的若干个细胞,例如:
A的邻居:
A1、A2、A3、A4、A5……
如果细胞A与A1、A2、A3之间具有非常相似的基因表达模式,那么UMAP就希望在低维空间中也尽量保持这种邻近关系。
因此,UMAP首先在高维空间中建立一个邻域图(neighborhood graph)。
然后,它再寻找一个二维或三维空间,使低维空间中的数据点尽可能保持原始数据中的这种邻域结构。
UMAP背后的“流形”思想
UMAP最容易让初学者困惑的地方,是它背后的“流形(manifold)”概念。所谓流形,可以简单理解为:数据虽然存在于非常高维的空间中,但真正决定数据结构的有效维度可能远低于原始维度。
例如,一个三维空间中的纸张实际上只有二维结构。如果把一张纸卷起来、弯曲甚至折叠,它在三维空间中的位置可能非常复杂,但它本质上仍然是一个二维结构。类似地,一个拥有10,000个变量的数据集,并不意味着它真正具有10,000个独立的自由度。许多变量可能彼此相关,数据可能实际上分布在一个更低维的潜在结构上。
UMAP试图发现这种结构。
官方文档将UMAP建立在三个主要假设上:
- 数据均匀分布在一个Riemannian manifold上;
- Riemannian metric在局部可以近似保持不变;
- 流形在局部是连通的。
对于普通科研使用者来说,没有必要一开始就深入代数拓扑和黎曼几何。理解下面这句话更加重要:UMAP不是单纯寻找最大方差方向,而是试图从数据的局部邻域关系中恢复潜在结构。
UMAP的基本计算过程
如果希望进一步理解UMAP,可以把它的计算过程简化为几个步骤。
第一步:计算数据点之间的距离
首先需要定义数据之间的“距离”。
例如最常见的是欧氏距离(Euclidean distance)。
对于两个样本:

和:

欧氏距离可以写成:

但是UMAP并不要求只能使用欧氏距离。根据数据类型的不同,还可以使用:
- cosine distance
- correlation distance
- Manhattan distance
- Hamming distance
- Jaccard distance
- Minkowski distance
等。
这也是UMAP非常灵活的一个特点。
第二步:寻找每个数据点的邻居
UMAP根据 n_neighbors 参数确定每个数据点需要重点考虑多少个邻居。
例如:
umap.UMAP(n_neighbors=15)意味着算法会重点考虑每个数据点周围的邻域结构。
这一步非常重要,因为它实际上决定了UMAP更加关注:局部结构,还是整体结构。
第三步:构建高维空间中的邻域图
找到邻居之后,UMAP会根据距离关系建立一个加权图。
距离越近的数据点,其连接权重通常越高。
因此,原始高维数据最终可以被表示成一种类似:
A和B关系很强
A和C关系较弱
A和D几乎没有关系
这样的图结构。
第四步:寻找低维表示
接下来,UMAP尝试把这些数据点放到二维或三维空间中。
目标是:
让低维空间中的数据点尽可能保持高维空间中的邻域关系。
这个过程涉及优化。
最终得到:

其中每一个样本都由两个坐标表示。于是我们就可以画出最常见的:UMAP1 × UMAP2散点图。
UMAP图应该怎么看?
这是论文中最容易被误读的部分。假设最终得到了一张UMAP图:
图源:https://dimitris-markopoulos.github.io/mnist-image-classification/
图中的每一个点通常代表一个样本、一个细胞或者一个观测对象。
如果研究的是单细胞RNA测序:
一个点通常代表一个细胞。
如果研究的是患者数据:
一个点可以代表一名患者。
如果研究的是代谢组学:
一个点可能代表一个样本。
研究者通常会根据实验组别、细胞类型、疾病状态等信息给点添加不同颜色。
UMAP图上的两个坐标轴代表什么?
这是一个非常重要的问题。
在PCA图中,我们经常看到:
- PC1
- PC2
并且PC1、PC2分别具有明确的方差解释率。
但是UMAP并不是这样。
UMAP图中的:
- UMAP1
- UMAP2
通常没有像PC1、PC2那样可以直接解释的生物学含义或方差解释率。
也就是说,不应该写:
UMAP1解释了35%的数据变异。
这种表述并不适用于标准UMAP。
UMAP的两个轴主要是低维嵌入(embedding)的坐标,用于表达数据点之间的关系。
因此,看到:
UMAP1 = 5.2
UMAP2 = -3.7
并没有必要解释成某种具体的生物学变量。
UMAP图中“距离”应该如何解释?
这是UMAP使用过程中另一个非常容易出现的问题。很多研究者会认为:UMAP图中两个cluster之间距离越远,它们在原始数据中就一定越不同。这个结论并不总是成立。UMAP更加重视局部邻域结构,因此:局部距离和邻域关系通常比整个二维图中的绝对距离更加值得关注。
例如:两个cluster分别位于图的左上角和右下角。我们不能简单地说:这两个cluster之间的生物学差异是其他cluster的10倍。UMAP并没有提供这样的定量解释。因此,在论文中更推荐使用:“The UMAP embedding revealed distinct clusters…”
而不是过度解读二维坐标之间的绝对距离。
UMAP参数怎么设置?
UMAP的优势之一,也是最容易造成误解的地方,就是:参数会明显影响最终的图形。官方文档特别强调了几个重要参数,包括:
- n_neighbors
- min_dist
- n_components
- metric
1. n_neighbors
n_neighbors是UMAP中最重要的参数之一。
它控制每个数据点在构建局部邻域时考虑多少个邻居。
简单来说:
n_neighbors越小,越关注局部结构;n_neighbors越大,越关注更加广泛的结构。
例如:
umap.UMAP(n_neighbors=5)会更加关注局部邻域。
而:
umap.UMAP(n_neighbors=50)则会更多考虑较大范围的数据结构。
官方文档给出的一个经验范围通常是5~50,10~15是一个常见的起点。
可以简单理解:

但这并不是严格规则。不能为了得到“好看”的cluster而不断调整n_neighbors。
2. min_dist
另一个非常重要的参数是:
min_dist
它控制低维空间中数据点能够被压缩得多么紧密。
例如:
umap.UMAP(min_dist=0.1)是常见设置。
如果把它设置得更小,例如:
umap.UMAP(min_dist=0.001)数据点可以形成更加紧密的cluster。
而较大的 min_dist 会让数据点更加分散。
官方文档给出的常见范围大约为0.001~0.5,0.1可以作为合理起点。
因此:n_neighbors主要影响“看多大范围的邻域”,而min_dist主要影响“低维空间中cluster可以压得多紧”。
这两个参数一定要区分开。
3. metric
metric决定UMAP如何定义高维空间中的距离。
最常见的是:
metric='euclidean'但如果你的数据具有不同性质,可以考虑:
metric='cosine'或者:
metric='correlation'例如在文本数据、基因表达数据等情况下,余弦距离(cosine distance)或相关距离(correlation distance)有时可能比简单的欧氏距离更合适。
但这里不能简单地说:
“科研数据都应该使用cosine。”
距离度量应该根据数据性质和分析目的决定。
4. n_components
如果我们希望得到二维图:
n_components=2如果希望得到三维嵌入:
n_components=3事实上,UMAP并不仅仅能够用于二维可视化。
原始UMAP论文特别强调,它并不存在像某些可视化方法那样的固定二维限制,因此也可以用于一般意义上的非线性降维。
UMAP和PCA有什么区别?
这是科研人员最常问的问题之一。简单来说:PCA是线性降维方法,而UMAP是非线性降维方法。二者的基本思路不同。

因此,两者实际上并不是互相替代的关系。在很多生物信息学分析中,研究者甚至会:先进行PCA,再进行UMAP。特别是在单细胞分析中,这是非常常见的工作流程。
UMAP和t-SNE有什么区别?
UMAP最经常被拿来和t-SNE比较。t-SNE(t-distributed Stochastic Neighbor Embedding)同样是一种非线性降维方法。两者都非常擅长展示高维数据中的局部结构,因此都经常用于cluster visualization。但二者仍然存在一些重要差异。
第一,UMAP通常更适合较大数据集
UMAP的一个重要优势是计算效率。
UMAP官方项目给出的示例显示,对于70,000个样本、784维的MNIST数据,UMAP可以在不到一分钟内完成嵌入,而其示例中的scikit-learn t-SNE实现则需要明显更长的时间。这个数字是官方基准示例中的具体结果,不应该理解为所有硬件和数据条件下的固定性能差异。
第二,UMAP能够较好地兼顾局部和部分整体结构
UMAP通常被认为不仅能够展示局部邻域关系,同时也能够在一定程度上保留更加广泛的数据结构。
但需要强调:UMAP并不是“完美保留全局结构”的方法。低维表示必然存在信息损失。
第三,UMAP的参数更加值得关注
例如:
n_neighbors
min_dist
metric
n_components这些参数都会影响最终结果。
因此,在论文中使用UMAP时,最好明确报告关键参数,而不是只写:“UMAP was performed.”
为什么单细胞RNA测序特别喜欢使用UMAP?
如果你经常阅读生物医学论文,可能已经发现:UMAP几乎已经成为单细胞RNA测序领域最常见的可视化方法之一。原因很简单。单细胞RNA测序的数据维度非常高。
假设一个实验:
- 10,000个细胞;
- 20,000个基因。
那么每一个细胞都可以表示为一个20,000维向量。直接观察是不可能的。通常研究者会先进行:质量控制 → 标准化 → 高变基因筛选 → PCA → 邻居图构建 → UMAP
然后使用UMAP把细胞投影到二维空间。
最终得到:
图源:https://dragonmasterx87.github.io/CompBio1-Tulane/docs/day2/3multi.html?
图源:https://support.parsebiosciences.com/hc/en-us/articles/360052794312-Scanpy-Tutorial-65k-PBMCs
在图中:
- 每个点代表一个细胞;
- 相似细胞通常形成相邻区域;
- 不同细胞群体可能形成不同cluster;
- 颜色可以代表细胞类型;
- 也可以代表某个基因的表达水平。
因此,研究者可以快速观察:数据中是否存在明显的细胞亚群?不同细胞类型是否能够分开?某个基因是否主要在某个cluster中表达?某种处理是否改变了细胞群体结构?
Scanpy等单细胞分析工具也直接提供了 sc.tl.umap() 和 sc.pl.umap() 等函数,因此UMAP已经深度融入现代单细胞分析流程。
一个典型的UMAP绘图流程
如果使用Python的 umap-learn,最简单的代码如下:
import umap
import matplotlib.pyplot as plt
reducer = umap.UMAP(
n_neighbors=15,
min_dist=0.1,
metric='euclidean',
random_state=42
)
embedding = reducer.fit_transform(X)
plt.scatter(
embedding[:, 0],
embedding[:, 1],
s=10
)
plt.xlabel("UMAP1")
plt.ylabel("UMAP2")
plt.show()其中:
X就是你的高维数据。
最终:
embedding[:, 0]对应UMAP1,
而:
embedding[:, 1]对应UMAP2。
如果需要根据实验组别着色,则可以进一步加入分组信息。
科研论文中的UMAP图应该怎么画?
如果UMAP用于论文发表,建议注意以下几个方面。首先,不要只追求cluster“好不好看”。如果不断调整参数,直到得到非常漂亮、非常分离的cluster,那么这种做法可能会导致结果解释偏离数据本身。其次,应当报告重要参数。
例如:
“UMAP was performed using the cosine metric with n_neighbors = 15 and min_dist = 0.1.”
这样其他研究者才能理解你的分析过程。
第三,最好固定随机种子。
UMAP本质上是一个具有随机性的算法,不同运行可能产生一定差异。官方文档明确指出,可以通过设置 random_state 来实现可重复结果;不过在多线程情况下,随机性还可能受到线程执行顺序影响,因此完全复现可能涉及性能和并行设置的权衡。
例如:
umap.UMAP(
n_neighbors=15,
min_dist=0.1,
random_state=42
)最后,不建议只展示一张“漂亮的UMAP图”就直接进行生物学结论。UMAP本质上是一种探索性可视化工具。如果你需要证明两个组之间存在统计学差异,还需要使用适当的统计分析。
UMAP最常见的误区
误区一:UMAP的横纵坐标具有明确生物学意义
通常没有。
UMAP1和UMAP2主要是低维嵌入坐标,不应该像基因表达量或者PC1解释率那样进行直接生物学解释。
误区二:cluster越远,生物学差异越大
不能简单这样解释。
UMAP重点关注邻域结构,二维空间中的全局距离不能直接等价于原始高维空间中的生物学距离。
误区三:cluster越紧密,说明细胞越相似
也需要谨慎。
min_dist等参数本身就可以影响cluster的紧密程度。
因此:
“这个cluster特别紧,所以这些细胞生物学上特别一致。”
这样的结论需要额外证据支持。
误区四:UMAP分成几个cluster,就意味着存在几个真实的细胞类型
也不一定。
UMAP只是可视化方法。
真正的cluster identification还需要结合:
- 聚类算法;
- marker genes;
- 差异表达分析;
- 已知生物学知识;
- 独立实验验证。
换句话说:UMAP图中的视觉分离 ≠ 统计学意义上的cluster ≠ 生物学上已经确认的细胞类型。这是阅读单细胞论文时尤其需要注意的一点。
UMAP有哪些优点?
总体来看,UMAP具有几个非常明显的优势。
第一,能够处理高维数据。
它可以用于基因表达、图像、文本、机器学习特征等多种高维数据。
第二,能够发现非线性结构。
相比PCA这样的线性方法,UMAP能够处理更加复杂的数据结构。
第三,计算效率较高。
对于较大数据集,UMAP通常具有很好的实用性。
第四,非常适合可视化。
二维UMAP图非常容易与实验组别、细胞类型、基因表达等信息结合。
第五,参数具有较高的灵活性。
研究者可以通过 n_neighbors、min_dist、metric 等参数调整模型对局部和整体结构的关注程度。
UMAP有哪些局限性?
UMAP当然也不是万能的。最重要的局限之一就是:二维图一定会丢失信息。无论是PCA、t-SNE还是UMAP,只要把高维数据压缩到二维,就不可能完整保留原始信息。此外,UMAP结果受到:
- 参数设置;
- 距离度量;
- 数据预处理;
- 随机初始化;
- 邻域图构建;
等因素影响。因此,同一份数据在不同参数下可能产生不同的可视化结果。更重要的是:UMAP图是数据结构的一种低维表示,而不是原始数据本身。因此,不能把UMAP图当作统计检验结果。
UMAP什么时候适合使用?
如果你的研究具有以下特点,UMAP通常是值得考虑的工具:
高维数据
例如:
- 单细胞RNA测序;
- 空间转录组;
- 蛋白质组学;
- 代谢组学;
- 高维影像数据;
- 机器学习特征。
希望观察样本之间的局部关系
例如:
哪些样本彼此更加相似?
数据中是否存在明显的亚群?
数据可能存在非线性结构
如果数据结构明显不是简单的线性关系,那么UMAP可能比PCA更加合适。
但在正式分析中,通常没有必要在PCA、t-SNE和UMAP之间“选一个”。
更合理的做法是根据研究问题选择方法,甚至将多个方法结合起来。
PCA、t-SNE和UMAP应该怎么选?
可以简单总结为:
PCA:
如果希望获得一个解释相对明确、稳定、快速的线性降维结果,PCA是非常好的起点。
t-SNE:
如果主要关注局部邻域结构和cluster visualization,可以考虑t-SNE。
UMAP:
如果希望进行非线性降维,同时兼顾较好的局部结构表示和计算效率,UMAP通常是非常实用的选择。
在实际科研工作中,我更推荐:
先用PCA理解数据,再根据研究目的使用UMAP或t-SNE进行可视化。
尤其是在单细胞分析中,PCA和UMAP并不是竞争关系,而往往是连续的数据分析步骤。
UMAP进阶方法
随着UMAP的发展,现在它已经不仅仅是一种二维绘图工具。例如,UMAP项目目前还提供了:
densMAP
densMAP是在UMAP基础上进一步考虑局部密度(density)的扩展方法。
普通UMAP可能改变原始数据中的密度关系,而densMAP试图在保持拓扑结构的同时,更好地保留局部密度信息。
Parametric UMAP
Parametric UMAP使用神经网络学习UMAP映射,因此可以用于一些需要对新数据进行快速映射的场景。
Supervised UMAP
如果研究者拥有标签信息,还可以使用监督式UMAP,将标签信息纳入嵌入过程。
这说明UMAP已经从最初的“可视化算法”,逐渐发展为一个更加完整的非线性降维工具体系。
写在最后
如果只记住本文的几个重点,我建议记住下面这些:
第一,UMAP是一种非线性降维方法。
它的全称是 Uniform Manifold Approximation and Projection,中文通常译为均匀流形逼近与投影。
第二,UMAP最重要的思想是邻域结构。
它首先在高维空间中寻找数据点之间的邻域关系,然后尝试在低维空间中尽可能保留这些关系。
第三,UMAP1和UMAP2不能像PC1和PC2一样解释。
UMAP坐标主要用于表示低维嵌入,并没有类似PCA主成分那样直接的方差解释率。
第四,n_neighbors和min_dist非常重要。
前者主要影响UMAP更加关注局部还是更广泛的结构,后者主要影响低维空间中数据点可以被压缩得多么紧密。
第五,UMAP图不能直接等同于统计学结论。
一个漂亮的cluster并不自动意味着一个真实的生物学亚群,最终仍然需要结合统计分析、marker genes以及其他实验和生物学证据。
对于今天大量出现的单细胞、组学和机器学习数据而言,UMAP真正的价值并不是“把图画得更漂亮”,而是帮助研究者从难以直接观察的高维数据中发现潜在结构和模式。这也是它近年来成为科研数据可视化重要工具的原因。
