均匀流形逼近和投影
项目描述
UMAP
统一流形逼近和投影 (UMAP) 是一种降维技术,可用于类似于 t-SNE 的可视化,但也可用于一般的非线性降维。该算法基于对数据的三个假设:
数据均匀分布在黎曼流形上;
黎曼度量是局部常数(或可以近似);
歧管是本地连接的。
根据这些假设,可以用模糊拓扑结构对流形进行建模。通过搜索具有最接近的等效模糊拓扑结构的数据的低维投影来找到嵌入。
基础数学的详细信息可以在 我们关于 ArXiv 的论文中找到:
McInnes, L, Healy, J, UMAP:统一流形近似和降维投影,ArXiv 电子版 1802.03426,2018
重要的是您无需担心这一点——您现在可以使用 UMAP 进行降维和可视化,就像替换 scikit-learn 的 t-SNE 一样容易。
新:此软件包现在还提供对 densMAP 的支持。densMAP 算法增强了 UMAP,以保留数据的拓扑结构之外的局部密度信息。此方法的详细信息在以下论文中进行了描述:
Narayan, A, Berger, B, Cho, H,保持密度的数据可视化揭示了单细胞转录组变异的动态模式,bioRxiv,2020
安装
UMAP 依赖于scikit-learn,因此依赖于 scikit- learn的依赖项,例如numpy和scipy。出于性能原因,UMAP 添加了对numba的要求。原始版本使用 Cython,但 Numba 改进的代码清晰度、简单性和性能使得过渡成为必要。
要求:
Python 3.6 或更高版本
麻木的
scipy
scikit-学习
麻木
tqdm
推荐套餐:
- 用于绘图
matplotlib
数据着色器
全息视图
- 对于参数 UMAP
张量流> 2.0.0
安装 pynnescent 可以显着提高性能,在以后的版本中会变成硬依赖。
安装选项
Conda 安装,通过 conda-forge 团队的出色工作:
conda install -c conda-forge umap-learn
conda-forge 软件包可用于 Linux、OS X 和 Windows 64 位。
PyPI 安装,假设您安装了 numba 和 sklearn 及其所有要求(numpy 和 scipy):
pip install umap-learn
如果您想使用绘图功能,您可以使用
pip install umap-learn[plot]
安装所有绘图依赖项。
如果您希望使用 Parametric UMAP,您需要安装 Tensorflow,可以使用https://www.tensorflow.org/install (推荐)上的说明或使用
pip install umap-learn[parametric_umap]
对于仅 CPU 版本的 Tensorflow。
如果 pip 在拉取依赖项时遇到困难,那么我们建议使用 anaconda 手动安装依赖项,然后从 pip 拉取 umap:
conda install numpy scipy
conda install scikit-learn
conda install numba
pip install umap-learn
对于手动安装,请获取此软件包:
wget https://github.com/lmcinnes/umap/archive/master.zip
unzip master.zip
rm master.zip
cd umap-master
安装要求
sudo pip install -r requirements.txt
或者
conda install scikit-learn numba
安装包
python setup.py install
如何使用 UMAP
umap 包继承自 sklearn 类,因此可以整齐地与其他具有相同调用 API 的 sklearn 转换器相邻。
import umap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = umap.UMAP().fit_transform(digits.data)
可以为 UMAP 类设置许多参数;主要的如下:
n_neighbors:这决定了在流形结构的局部近似中使用的相邻点的数量。较大的值将导致在丢失详细的局部结构的情况下保留更多的全局结构。一般来说,这个参数应该经常在 5 到 50 的范围内,选择 10 到 15 是一个合理的默认值。
min_dist:这控制允许嵌入将点压缩在一起的紧密程度。较大的值确保嵌入点分布更均匀,而较小的值允许算法更准确地针对局部结构进行优化。合理的值在 0.001 到 0.5 的范围内,0.1 是合理的默认值。
metric:这决定了用于测量输入空间中距离的度量的选择。已经编码了各种各样的度量标准,并且可以传递用户定义的函数,只要它已经通过 numba 进行了 JITd。
使用这些选项的示例:
import umap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = umap.UMAP(n_neighbors=5,
min_dist=0.3,
metric='correlation').fit_transform(digits.data)
UMAP 还支持拟合稀疏矩阵数据。有关更多详细信息,请参阅UMAP 文档
UMAP 的优势
UMAP 在其当前的化身中取得了一些重大胜利。
首先,UMAP速度很快。它可以毫不费力地处理大型数据集和高维数据,超出大多数 t-SNE 包可以管理的范围。这包括非常高维的稀疏数据集。UMAP 已成功地直接用于超过一百万维的数据。
其次,UMAP 在嵌入维度上的扩展性很好——它不仅仅用于可视化!您可以使用 UMAP 作为通用降维技术,作为其他机器学习任务的初步步骤。稍加注意,它就可以与hdbscan集群库很好地配合(有关更多详细信息,请参阅使用 UMAP 进行集群)。
第三,与大多数 t-SNE 实现相比,UMAP 在保留数据全局结构的某些方面通常表现更好。这意味着它通常可以为您的数据提供更好的“全局”视图,并保留本地邻居关系。
第四,UMAP支持多种距离函数,包括余弦距离和相关距离等非度量距离函数。您终于可以使用余弦距离正确嵌入词向量了!
第五,UMAP 支持通过标准 sklearn变换方法向现有嵌入添加新点。这意味着 UMAP 可以用作 sklearn 管道中的预处理转换器。
第六,UMAP 支持有监督和半监督的降维。这意味着,如果您希望将标签信息用作降维的额外信息(即使它只是部分标签),您可以这样做——就像 在 fit 方法中提供它作为y参数一样简单。
第七,UMAP 支持多种额外的实验特性,包括:“逆变换”,可以逼近一个高维样本,该样本将映射到嵌入空间中的给定位置;嵌入非欧几里得空间的能力,包括双曲嵌入和具有不确定性的嵌入;还存在对嵌入数据帧的非常初步的支持。
最后,UMAP 在流形学习方面具有扎实的理论基础(参见我们关于 ArXiv 的论文)。这既证明了该方法的合理性,又允许将很快添加到库中的进一步扩展。
性能和示例
UMAP 在嵌入大型高维数据集方面非常有效。特别是它在输入维度和嵌入维度上都可以很好地扩展。为了获得最佳性能,我们建议安装最近邻计算库pynndescent。UMAP 可以在没有它的情况下运行,但如果安装它会运行得更快,尤其是在多核机器上。
对于具有 70000 个数据样本的 784 维 MNIST 数字数据集等问题,UMAP 可以在一分钟内完成嵌入(相比之下,scikit-learn 的 t-SNE 实现大约需要 45 分钟)。尽管有这种运行时效率,UMAP 仍然产生高质量的嵌入。
强制性 MNIST 数字数据集,使用 3.1 GHz Intel Core i7 处理器(n_neighbors=10, min_dist=0.001)在 42 秒内嵌入(安装了 pynndescent 并在 numba jit 预热之后):
然而,MNIST 数字数据集相当简单。一个更好的测试是最近的“Fashion MNIST”时尚单品图像数据集(同样是 784 个维度的 70000 个数据样本)。UMAP 在 49 秒内生成了这个嵌入(n_neighbors=5,min_dist=0.1):
UCI 穿梭数据集(8 维的 43500 个样本)在 44 秒内很好地嵌入了 相关距离(注意相关距离计算所需的时间更长):
以下是 MNIST 数字数据集的 densMAP 可视化,具有 784 个特征,基于与上述相同的参数(n_neighbors=10,min_dist=0.001)。densMAP 显示与数字 1 对应的簇明显更密集,这表明与其他数字相比,数字 1 的图像中的自由度更少。
绘图
UMAP 包含一个子包umap.plot,用于绘制 UMAP 嵌入的结果。这个包需要单独导入,因为它有额外的要求(matplotlib、datashader 和 holoviews)。它允许快速和简单的绘图,并尝试做出明智的决定,以避免过度绘图和其他陷阱。使用示例:
import umap
import umap.plot
from sklearn.datasets import load_digits
digits = load_digits()
mapper = umap.UMAP().fit(digits.data)
umap.plot.points(mapper, labels=digits.target)
绘图包提供基本绘图,以及带有悬停工具和各种诊断绘图选项的交互式绘图。有关更多详细信息,请参阅文档。
参数化UMAP
参数 UMAP 为训练神经网络以学习基于 UMAP 的数据转换提供支持。这可用于支持更快地推断新的看不见的数据、更强大的逆变换、UMAP 的自动编码器版本和半监督分类(特别是对于被 UMAP 很好分离的数据和非常有限的标记数据)。有关更多信息,请参阅 Parametric UMAP 文档 或 示例笔记本 。
密度MAP
densMAP 算法增强了 UMAP,除了 UMAP 捕获的拓扑结构外,还保留了局部密度信息。通过设置densmap输入标志,可以使用 umap 包轻松运行 densMAP :
embedding = umap.UMAP(densmap=True).fit_transform(data)
此功能基于 densMAP 开发人员提供的 densMAP实现,他们还为将 densMAP 集成到 umap 包做出了贡献。
densMAP 继承了 UMAP 的所有参数。以下是可为 densMAP 设置的附加参数列表:
dens_frac:这决定了将包括优化目标中的密度保持项的历元分数(介于 0 和 1 之间的值)。此参数默认设置为 0.3。请注意,在使用 UMAP 优化嵌入的初始阶段之后,densMAP 会打开密度优化。
dens_lambda:这决定了密度保持目标的权重。较高的值优先考虑密度保持,较低的值(接近于零)优先考虑 UMAP 目标。将此参数设置为零可将算法减少为 UMAP。默认值为 2.0。
dens_var_shift:正则化项添加到嵌入中局部密度的方差以实现数值稳定性。我们建议将此参数设置为 0.1,这在许多设置中始终有效。
output_dens:当此标志为 True 时,除了嵌入之外,对fit_transform的调用还返回原始数据集和嵌入的局部半径(在densMAP 论文中定义的局部密度的逆测量)。输出是一个元组(embedding, radii_original, radii_embedding)。请注意,半径是对数转换的。如果为 False,则仅返回嵌入。这个标志也可以与 UMAP 一起使用来探索 UMAP 嵌入的局部密度。默认情况下,此标志为 False。
对于 densMAP,我们建议使用较大的n_neighbors值(例如 30)来可靠地估计局部密度。
使用这些选项的示例(基于 mnist_784 数据集的子样本):
import umap
from sklearn.datasets import fetch_openml
from sklearn.utils import resample
digits = fetch_openml(name='mnist_784')
subsample, subsample_labels = resample(digits.data, digits.target, n_samples=7000,
stratify=digits.target, random_state=1)
embedding, r_orig, r_emb = umap.UMAP(densmap=True, dens_lambda=2.0, n_neighbors=30,
output_dens=True).fit_transform(subsample)
有关更多详细信息,请参阅文档。
帮助和支持
文档位于Read the Docs。该文档包含一个常见问题解答,可以回答您的问题。如果您仍有疑问,请 打开一个问题 ,我会尽力提供任何帮助和指导。
引文
如果您在工作中使用该软件,如果您能引用《开源软件杂志》的论文,我们将不胜感激:
@article{mcinnes2018umap-software,
title=<s>{UMAP: Uniform Manifold Approximation and Projection}</s>,
author=<s>{McInnes, Leland and Healy, John and Saul, Nathaniel and Grossberger, Lukas}</s>,
journal=<s>{The Journal of Open Source Software}</s>,
volume=<s>{3}</s>,
number=<s>{29}</s>,
pages=<s>{861}</s>,
year=<s>{2018}</s>
}
如果您想在您的工作中引用此算法,ArXiv 论文是当前参考:
@article{2018arXivUMAP,
author = <s>{{McInnes}, L. and {Healy}, J. and {Melville}, J.}</s>,
title = <s>"{UMAP: Uniform Manifold Approximation
and Projection for Dimension Reduction}"</s>,
journal = <s>{ArXiv e-prints}</s>,
archivePrefix = <s>"arXiv"</s>,
eprint = <s>{1802.03426}</s>,
primaryClass = <s>"stat.ML"</s>,
keywords = <s>{Statistics - Machine Learning,
Computer Science - Computational Geometry,
Computer Science - Learning}</s>,
year = 2018,
month = feb,
}
此外,如果您在工作中使用 densMAP 算法,请引用以下参考:
@article {NBC2020,
author = <s>{Narayan, Ashwin and Berger, Bonnie and Cho, Hyunghoon}</s>,
title = <s>{Density-Preserving Data Visualization Unveils Dynamic Patterns of Single-Cell Transcriptomic Variability}</s>,
journal = <s>{bioRxiv}</s>,
year = <s>{2020}</s>,
doi = <s>{10.1101/2020.05.12.077776}</s>,
publisher = <s>{Cold Spring Harbor Laboratory}</s>,
URL = <s>{https://www.biorxiv.org/content/early/2020/05/14/2020.05.12.077776}</s>,
eprint = <s>{https://www.biorxiv.org/content/early/2020/05/14/2020.05.12.077776.full.pdf}</s>,
}
如果您在工作中使用参数 UMAP 算法,请引用以下参考:
@article {NBC2020,
author = <s>{Sainburg, Tim and McInnes, Leland and Gentner, Timothy Q.}</s>,
title = <s>{Parametric UMAP: learning embeddings with deep neural networks for representation and semi-supervised learning}</s>,
journal = <s>{ArXiv e-prints}</s>,
archivePrefix = <s>"arXiv"</s>,
eprint = <s>{2009.12981}</s>,
primaryClass = <s>"stat.ML"</s>,
keywords = <s>{Statistics - Machine Learning,
Computer Science - Computational Geometry,
Computer Science - Learning}</s>,
year = 2020,
}
执照
umap 包是 3-clause BSD 许可的。
我们想指出,umap 包大量使用了 NumFOCUS 赞助的项目,如果没有他们对这些项目的支持,这将是不可能的,所以请考虑为 NumFOCUS 做出贡献。
贡献
贡献是非常受欢迎的!有很多潜在项目的机会,所以如果您想帮忙,请与我们联系。从代码到笔记本再到示例和文档的所有内容都同样有价值,所以请不要觉得自己不能做出贡献。要做出贡献,请 fork 项目 进行更改并提交拉取请求。我们将尽最大努力与您一起解决任何问题,并将您的代码合并到主分支中。