当前位置:   article > 正文

单细胞RNA降维之UMAP_umap降维原理

umap降维原理

单细胞RNA降维之UMAP

UMAP

首先,UMAP是一种非线性降维的算法,相对于t-SNE,UMAP算法更加快速
该方法的原理是利用流形学投影技术,达到降维目的
首先计算高维空间中的点之间的距离,将它们投影到低维空间,并计算该低维空间中的点之间的距离。然后,它使用随机梯度下降来最小化这些距离之间的差异。

比方说,图中两个黑点,若考虑直线距离,那么这两个黑点之间距离很相近
如果放到流形学上,那么这两个点距离就得沿着图中曲线绕两圈

那么UMAP先计算高维的流形结构特征,将其中各个点之间的位置关系进行确定,从而构造高维的数据分布结构。然后将它们投影到低维空间,然后根据高维空间点与点之间的相对关系,提取特征值,在低维空间中重新构造这种距离关系,从而达到聚类以及特征提取的效果

R

在单细胞的R包Seurat中自带UMAP这个函数
我们这次介绍umap这个R包

  1. install.packages("umap")
  2. library(umap)
  3. iris.umap = umap(iris[,1:4])#进行降维
  4. # display object summary
  5. iris.umap
  6. head(iris.umap$layout)#获取数据矩阵
  7. # create a dataset with structure likeiris, but with perturbation
  8. iris.perturbed = iris[,1:4] +matrix(rnorm(nrow(iris)*4, 0, 0.1), ncol=4)
  9. # project perturbed dataset
  10. perturbed.embedding = predict(iris.umap,iris.perturbed)#做预测
  11. par(mfrow=c(1,2))
  12. # output is a matrix with embeddingcoordinates
  13. plot(iris.umap$layout)
  14. plot(perturbed.embedding)

输入数据

这是降维的聚类图

iris.umap$layout是降维的数值作为新的坐标,画在二维图上

iris.umap$layout

参考:https://cloud.tencent.com/developer/article/1476996

十二种必须掌握的降维知识(Python代码) - 简书

R语言实现UMAP降维模型

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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/343696
推荐阅读
相关标签
  

闽ICP备14008679号