流形学习
关于流形学习(Manifold Learning)最形象的解释莫过于这幅图:
这幅图又被称为Swiss Roll,瑞士卷,是一种常见的卷状蛋糕,如何计算蛋糕卷起表面上两点距离,就是流行计算中要解决的一个问题。
距离的定义
在欧式几何中,我们将两点的距离定义为两点的直线距离,这个距离也是在欧式空间中A到B的最短距离。由于在瑞士卷上,从A点到B点实际上有无数中路径,那么该如何定义A和B之间的距离呢?与欧式空间中的距离定义类似,我们也可以将其简单地定义为“最短路径”。
那么这个最短距离又如何定义呢?现实生活中测量从北京到纽约的距离也是一个这样的问题。由于地球实际上是球形的,从北京的纽约的距离 不是空间中这两个地点的直线距离,而是通过GIS中称为测地距离(根据球面几何,球体上任意两点的距离就是同时经过这两点的球面大圆的弧长)的度量来计算。在瑞士卷的问题中,类似地,我们也需要找到“测地距离”。
总结一下,这里提到的几个概念:
测地距离:流形上两个点之间的最短测地线的长度。
测地线:流形上两个点之间最短的曲线。
黎曼测度:黎曼流形上某一点的切空间上定义的内积的集合。
黎曼测度的性质:黎曼流形上某一点的切空间上某一切向量的范数等于这个切向量对应的测地线的长度。
UMAP相比 t-SNE 的优势:
- 速度快得多
- 确定性算法
- 保留双结构
基于R的UMAP实现
还是使用USArrests数据来举例,使用t-SNE降维:
#加载包
library(umap)
#由于四个变量的量纲不统一,不方便进行运算,先进行标准化处理
USArrests_scale <- as_tibble(scale(USArrests, scale=TRUE))
#将标准化后的数据使用t-SNE算法进行降维
noteTsne <- Rtsne(USArrests_scale, perplexity = 7, theta = 0, max_iter = 1000, eta = 300, verbose = T)
参数说明:
- n_neighbors:用于构建初始高维图的近似最近邻点的数量。它有效地控制了UMAP如何平衡局部结构和全局结构。低值会促使UMAP在分析高维数据时,通过约束考虑的邻点数量,更加关注局部结构,而高值则会促使UMAP倾向于表示大局结构,同时失去精细的细节。
- min_dist:低维空间中点之间的最小距离。这个参数控制了UMAP将点紧密地聚集在一起的程度,数值越低,嵌入的点就越紧密。更大的min_dist值会使UMAP将点更松散地包装在一起,而专注于保存广泛的拓扑结构。
- metric:选择距离的测度方法:欧氏距离、曼哈顿距离等;
- n_epochs:优化步骤的迭代次数。
可视化数据,观察降维后的效果:
#先将四个变量放到同一列,这样便于画图和比较
USArrestsUMAP <- USArrests_scale %>%
mutate(UMAP1 = arrestsUMAP$layout[,1], UMAP2 = arrestsUMAP$layout[,2]) %>%
pivot_longer(1:4, names_to ="Variable", values_to = "Value")
#画图
ggplot(USArrestsUMAP, aes(UMAP1, UMAP2,col=Value)) +
facet_wrap(~ Variable) +
geom_point(size = 1) +
scale_color_gradient(low = "dark blue", high = "cyan") +
theme_bw()
【参考文献】:
网友评论