赞
踩
首先,UMAP是一种非线性降维的算法,相对于t-SNE,UMAP算法更加快速
该方法的原理是利用流形学和投影技术,达到降维目的
首先计算高维空间中的点之间的距离,将它们投影到低维空间,并计算该低维空间中的点之间的距离。然后,它使用随机梯度下降来最小化这些距离之间的差异。
比方说,图中两个黑点,若考虑直线距离,那么这两个黑点之间距离很相近
如果放到流形学上,那么这两个点距离就得沿着图中曲线绕两圈
那么UMAP先计算高维的流形结构特征,将其中各个点之间的位置关系进行确定,从而构造高维的数据分布结构。然后将它们投影到低维空间,然后根据高维空间点与点之间的相对关系,提取特征值,在低维空间中重新构造这种距离关系,从而达到聚类以及特征提取的效果
在单细胞的R包Seurat中自带UMAP这个函数
我们这次介绍umap这个R包
- install.packages("umap")
- library(umap)
-
- iris.umap = umap(iris[,1:4])#进行降维
-
- # display object summary
- iris.umap
- head(iris.umap$layout)#获取数据矩阵
-
- # create a dataset with structure likeiris, but with perturbation
- iris.perturbed = iris[,1:4] +matrix(rnorm(nrow(iris)*4, 0, 0.1), ncol=4)
-
- # project perturbed dataset
- perturbed.embedding = predict(iris.umap,iris.perturbed)#做预测
-
- par(mfrow=c(1,2))
- # output is a matrix with embeddingcoordinates
- plot(iris.umap$layout)
-
- plot(perturbed.embedding)
输入数据
这是降维的聚类图
iris.umap$layout是降维的数值作为新的坐标,画在二维图上
iris.umap$layout
参考:https://cloud.tencent.com/developer/article/1476996
UMAP算法被认为是与t-SNE相似的原理,都是将高维概率分布映射到低维空间的算法,从而做到降维的效果。主要基于流形理论和拓扑算法的理论,对高维数据进行降维,从而形成其他分类模型的输入特征。
那么,我们首先看下什么是流形理论呢。我们从一个叫做Swiss Roll的可视化模型进行解释,具体意义就是如何将在流形上两个点的距离进行最小化的表示。
如图(来自网络)所示,其中两个黑色的圈之间的距离,可能直接连接的很近,如果上升到流形的理论,其连接距离就不再是直线连接,而是流形表结构上的距离。然后,我们再看下这个拓扑算法,通俗讲就是只考虑物体间的位置关系而不考虑它们的形状和大小。那么,怎么把这两者结合起来构成我们的UMAP呢,其实很简单,就是基于高维的流形结构特征,将其中各个点之间的位置关系进行确定,从而构造高维的数据分布结构。然后在使其降维到低维的分布结构,从而达到聚类以及特征提取的效果,可以用图来表示:
接下来我么看下在R语言是如何实现UMAP的算法的。首先就是安装umap包,具体的就是install.packages(“umap”)。然后是其主要的函数,在包中只有三个函数:umap.defaults,predict, umap。
首先,我们看下umap.defaults,这就是模型的配置函数了。它有有一个默认的配置列表:
其中参数的意义:
n_neighbors:确定相邻点的数量,通常其设置在2-100之间。
n_components:降维的维数大小,默认是2,其范围最好也在2-100之间。
Metric:距离的计算方法,有很多可以选择,具体的需要我们在应用的时候自行筛选。如:euclidean,manhattan,chebyshev,minkowski,canberra,braycurtis,mahalanobis,wminkowski,seuclidean,cosine,correlation,haversine,hamming,jaccard,dice,russelrao,kulsinski,rogerstanimoto,sokalmichener,sokalsneath,yule。这个地方需要注意的是如果需要传参的算法,可以利用metric_kwds设置(此值python有)。
n_epochs:模型训练迭代次数。数据量大时200,小时500。
input:数据的类型,如果是data就会按照数据进行计算;如果dist就会认为是距离矩阵进行训练。
init:初始化用的。其中有这么三种方式: spectral,random,自定义。
min_dist:控制允许嵌入的紧密程度,值越小点越聚集,默认一般是0.1。
set_op_mix_ratio:设置降维过程中,各特征的结合方式,值0-1。0代表取交集,1代表取合集;中间就是比例。
local_connectivity:局部连接的点之间值,默认1,其值越大局部连接越多,导致的结果就是超越固有的流形维数出现改变。
bandwith:用于构造子集参数,具体怎么设,就默认吧。
alpha:相当于在python中的leanging_rate(学习率)参数。
gamma:布局最优的学习率
negative_sample_rate:每一个阳性样本导致的阴性率。其值越大导致高的优化也就是过拟合,预测准确度下降。默认是5.
a,b主要是关联min_dist 和 spread。可以不用设置。
spread:有效的嵌入式降维范围。与min_dist联合使用。
random_state:此值主要是确保模型的可重复性。如果不设置基于np.random,每次将会不同。
transform_seed:此值用于数值转换操作。一般默认42。
verbose: 控制工作日志,防止存储过多。
umap_learn_args:这个参数就牛了,他可以调用python基于umap-learn训练好的参数。
那么介绍这么参数,怎么取自定义呢。看下实例:
custom.settings = umap.defaults custom.settings$n_neighbors = 5 custom.settings
我们再看下核心训练函数umap。
其中主要的就是method参数,有两个:naïve纯R语言编写;umap-learn需要调用python包。
我们看下它自带的实例:
# embedd iris dataset using defaultsettings iris.umap = umap(iris[,1:4]) # display object summary iris.umap head(iris.umap$layout)#获取数据矩阵
最后就是它的预测,其实她并没有什么预测功能,主要就是用来将为,那既然提供了,那我们就简单提下它是怎么实现的。其实就是基于前面计算的参数,将新的数据与原始数据合并,然后计算出新的降维结果,看是否可以和元模型一样。
看下实例:
# create a dataset with structure likeiris, but with perturbation iris.perturbed = iris[,1:4] +matrix(rnorm(nrow(iris)*4, 0, 0.1), ncol=4) # project perturbed dataset perturbed.embedding = predict(iris.umap,iris.perturbed) par(mfrow=c(1,2)) # output is a matrix with embeddingcoordinates plot(iris.umap$layout) plot(perturbed.embedding)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。