前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言实现UMAP降维模型

R语言实现UMAP降维模型

作者头像
一粒沙
发布2019-07-31 14:34:56
8.6K0
发布2019-07-31 14:34:56
举报
文章被收录于专栏:R语言交流中心R语言交流中心

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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档