R语言实现UMAP降维模型

2019-07-31 14:34:56 浏览数 (1)

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训练好的参数。

那么介绍这么参数,怎么取自定义呢。看下实例:

代码语言:javascript复制
custom.settings = umap.defaults
custom.settings$n_neighbors = 5
custom.settings

我们再看下核心训练函数umap。

其中主要的就是method参数,有两个:naïve纯R语言编写;umap-learn需要调用python包。

我们看下它自带的实例:

代码语言:javascript复制
# embedd iris dataset using defaultsettings
iris.umap = umap(iris[,1:4])
 
# display object summary
iris.umap
head(iris.umap$layout)#获取数据矩阵

 

最后就是它的预测,其实她并没有什么预测功能,主要就是用来将为,那既然提供了,那我们就简单提下它是怎么实现的。其实就是基于前面计算的参数,将新的数据与原始数据合并,然后计算出新的降维结果,看是否可以和元模型一样。

看下实例:

代码语言:javascript复制
# 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)

0 人点赞