UMAP (Uniform Manifold Approximation and Projection ,均匀流形逼近与投影)是一种用于降维的非线性流形学习技术。它旨在将高维数据映射到低维空间(通常是二维或三维)进行可视化或数据压缩,同时尽可能保留数据的全局结构和局部邻域关系。
UMAP 的核心思想是通过构建数据的邻接图(graph),并使用一种优化的方法将这个高维图结构映射到低维空间中,从而保留数据的拓扑结构。与 t-SNE 等其他降维算法相比,UMAP 通常在保持数据的全局结构和局部细节方面有更好的平衡,同时计算效率也更高。
UMAP 的主要特点
非线性降维 :UMAP 是一种非线性降维方法,可以捕捉数据中的复杂结构,而不仅仅是简单的线性关系。
保留局部和全局结构 :UMAP 能够很好地保留数据的局部邻域关系(即相邻点在低维空间中仍然相邻),同时也能较好地保持数据的全局结构(即数据集的整体形状和分布)。
可扩展性 :相比于 t-SNE,UMAP 在处理大规模数据集时具有更高的计算效率,能够更快速地生成降维结果。
参数调节灵活 :UMAP 提供了一些可调参数,例如 n_neighbors
和 min_dist
,允许用户根据具体数据集调整算法的行为,以得到更好的降维效果。
UMAP : 英式音标:/ˈjuːmæp/ 美式音标:/ˈjuːmæp/ 发音类似于:“you-map”
- 记得先给数据标准化⭐
UMAP 的第一个主要步骤是将高维数据点转换为图结构。具体来说,它使用 k-近邻算法(k-nearest neighbors, k-NN) 构建数据点之间的邻接关系。
具体操作:
邻接图的类型:
UMAP 使用了一种加权图,其中边的权重反映了数据点之间的相似性。在构建 k-NN 图时,[[#选择无向图还是有向图?|UMAP 可以选择使用有向图 或无向图 ,具体取决于应用场景]]。
目的:
这一步的目的是捕捉数据在高维空间中的局部邻域关系。通过构建这样的图结构,UMAP 能够以一种灵活的方式处理高维数据的复杂几何形状。
构建好 k-NN 图之后,UMAP 需要进一步优化图中边的权重,使得边的权重能够反映出数据点在高维空间中的相似性。这一步通过一种非线性变换来实现。
具体操作:
相似性度量 :
具体公式如下:
w i , j = exp ( − max ( d i , j − ρ i , 0 ) σ i ) \large w_{i,j}=\exp\left(-\frac{\max(d_{i,j}-\rho_i,0)}{\sigma_i}\right) wi,j=exp(−σimax(di,j−ρi,0))
其中:
目的:
通过这种加权方式,UMAP 可以捕捉到高维空间中的局部结构,并为后续的低维映射提供合适的邻域关系。
在构建并优化好高维空间的图结构之后,UMAP 需要将这个图结构映射到低维空间(通常是二维或三维),并尽可能保持原有的邻域关系。
具体操作:
目标函数 :
低维嵌入的目标函数通常表示为:
L = ∑ i ≠ j − w i , j log ( p i , j ) − ( 1 − w i , j ) log ( 1 − p i , j ) \large \mathcal{L}=\sum_{i\neq j}-w_{i,j}\log(p_{i,j})-(1-w_{i,j})\log(1-p_{i,j}) L=i=j∑−wi,jlog(pi,j)−(1−wi,j)log(1−pi,j)
其中:
经过上述优化过程后,UMAP 输出的低维嵌入可以用于多种分析任务:
UMAP 的核心思想可以概括为以下几个主要步骤:
使用 k-NN 获得点的关系结构 :
优化点的关系权重 :
随机初始化低维的点 :
利用损失函数将低维结果逼近高维结果 :
这个过程的核心是保留数据的局部和全局结构 ,这也是 UMAP 在降维任务中表现优异的原因。通过这种逐步逼近和优化的方式,UMAP 能够有效地将高维数据降维到低维空间,并保留数据的拓扑结构。
- 和 t-SNE 一样,这玩意只能只管的定性,想要定量细节分析,别想啦
umap-learn
库。你可以通过 pip
来安装:pip install umap-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from umap import UMAP
# 加载示例数据集(Iris 数据集)
data = load_iris()
X = data.data
y = data.target
# 标准化数据
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
# 创建 UMAP 模型并进行降维
umap = UMAP(n_components=2, random_state=42)
X_umap = umap.fit_transform(X_std)
# 绘制结果
plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y, cmap='Spectral', s=50, alpha=0.8)
plt.title("UMAP projection of the Iris dataset")
plt.show()
调用
UMAP
需要注意的参数
n_components
:
- 含义 : 降维后的维度数,通常设置为 2 或 3 以进行可视化。
- 默认值 :
2
n_neighbors
:
- 含义 : 控制局部邻域的大小。较小的值会更加关注局部结构,而较大的值会捕捉更多的全局结构。
- 默认值 :
15
在 UMAP 中选择使用有向图 还是无向图 ,主要取决于数据的性质、任务的目标以及对局部与全局结构的关注程度。
在无向图中,如果点 A 和点 B 是彼此的最近邻,那么它们之间会有一条无向边。这意味着 A 和 B 的邻域关系是对称的,即 A 是 B 的邻居,B 也是 A 的邻居。
适用场景:
优点:
缺点:
在有向图中,只有当点 A 是点 B 的最近邻或者点 B 是点 A 的最近邻时,才会有有向边。这意味着邻域关系可能是非对称的,即 A 是 B 的邻居,但 B 不一定是 A 的邻居。
适用场景:
优点:
缺点:
无向图的应用场景 :
有向图的应用场景 :
关注我的唯一微信公众号:码上地球。感谢家人们
* Dimensionality Reduction, Animated