UMAP(Uniform Manifold Approximation and Projection)
UMAP(均匀流形逼近与投影,Uniform Manifold Approximation and Projection) 是一种 降维算法,用于 数据可视化、特征提取,特别适用于 高维数据的非线性降维,与 t-SNE 类似,但计算速度更快,保留全局结构更好。
1. 为什么使用 UMAP?
在数据分析、机器学习和深度学习任务中,数据通常是 高维的(如 100 维、1000 维),直接分析或可视化较困难。UMAP 可以将高维数据降维至 2D/3D,便于可视化和理解数据结构。
UMAP 主要用于:
- 数据可视化(将高维数据映射到 2D 或 3D)
- 降维(减少特征维度,加速机器学习)
- 聚类前处理(降维后进行 K-Means 等聚类)
- 异常检测(降维后分析数据分布)
2. UMAP vs. t-SNE
UMAP 与 t-SNE 都是常用的降维方法,但 UMAP 更快、可扩展性更强,适用于更大规模数据。
对比项 | UMAP | t-SNE |
---|---|---|
降维方式 | 拟合流形结构 | 近邻概率映射 |
速度 | 快(适用于大数据集) | 慢(计算复杂度高) |
保留全局结构 | 好(较少丢失全局信息) | 较差(容易丢失全局结构) |
超参数少 | 是 | 否(需要调整 perplexity 等参数) |
适用于聚类 | 是(保持局部和全局结构) | 较差(点簇可能不稳定) |
3. UMAP 代码示例
3.1 安装 umap-learn
pip install umap-learn
3.2 UMAP 处理 MNIST(手写数字)
import umap
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
# 加载 MNIST 手写数字数据(64 维)
digits = load_digits()
X, y = digits.data, digits.target # X 是特征,y 是标签
# UMAP 降维到 2D
umap_2d = umap.UMAP(n_components=2, random_state=42)
X_umap = umap_2d.fit_transform(X)
# 可视化 2D 降维结果
plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y, cmap="Spectral", alpha=0.5)
plt.colorbar(label="Digit Label")
plt.title("UMAP on MNIST Digits")
plt.show()
结果
UMAP 可以 将 64 维的手写数字数据映射到 2D 空间,颜色代表不同的数字类别,降维后数据仍然保持了较好的 类别分离性。
4. UMAP 主要参数
参数 | 作用 |
---|---|
n_neighbors | 近邻数(控制局部 vs. 全局结构,默认 15 ) |
n_components | 降维目标维度(如 2D 或 3D ) |
metric | 距离度量(默认 "euclidean" ,支持 "cosine" 、"manhattan" ) |
min_dist | 最小距离(控制嵌入数据点之间的密集程度) |
random_state | 随机种子(保证结果可复现) |
5. 调整超参数影响
5.1 n_neighbors
控制局部 vs. 全局结构
- 小值(如
5
):保留 局部结构(适合聚类) - 大值(如
50
):保留 全局结构(适合可视化)
umap_5 = umap.UMAP(n_neighbors=5).fit_transform(X)
umap_50 = umap.UMAP(n_neighbors=50).fit_transform(X)
5.2 min_dist
控制嵌入点的密集程度
- 小值(如
0.1
):数据点更紧密 - 大值(如
0.8
):数据点更分散
umap_dense = umap.UMAP(min_dist=0.1).fit_transform(X)
umap_sparse = umap.UMAP(min_dist=0.8).fit_transform(X)
6. UMAP 在深度学习中的应用
6.1 处理高维特征(BERT 句向量降维)
import umap
import numpy as np
# 假设我们有 768 维的 BERT 句向量
X_bert = np.random.rand(1000, 768) # 1000 句子,每个 768 维
# UMAP 降维到 2D
X_umap = umap.UMAP(n_components=2, metric="cosine").fit_transform(X_bert)
UMAP 可以 将 BERT 句向量降维,用于 可视化和聚类任务。
7. UMAP 在机器学习中的应用
- 数据可视化:高维数据映射到 2D/3D 进行分析
- 降维加速计算:降低数据维度,加快训练速度
- 特征提取:提取有用特征,提高模型性能
- 聚类前处理:降维后进行 K-Means 聚类
8. 结论
- UMAP 是一种降维算法,适用于高维数据可视化和特征提取。
- 比 t-SNE 更快,适用于大规模数据集,并且能更好地保留全局和局部结构。
- 广泛用于 NLP(BERT)、计算机视觉(MNIST)和聚类任务。
- 可调整超参数
n_neighbors
和min_dist
以优化降维效果。
如果你需要在高维数据上进行降维,可尝试 UMAP 代替 t-SNE 以提高速度和效果。