54·无监督学习进阶

UMAP 降维与可视化

dimensionality-reductionvisualization

第 54 课 - UMAP 降维与可视化

所属模块: 无监督学习
难度: Intermediate
标签: dimensionality-reduction, visualization
上一课: t-SNE 高维数据可视化
下一课: 异常检测方法:Isolation Forest 与 LOF


1. 学习目标

完成本课学习后,你将能够:

  1. 理解 UMAP(统一流形近似与投影)算法的基本原理和核心优势。
  2. 掌握使用 umap-learn 库进行数据降维和可视化的完整流程。
  3. 熟悉 UMAP 的关键超参数(如 n_neighbors, min_dist)及其对结果的影响。
  4. 能够将 UMAP 与 t-SNE 等降维方法进行比较,并为实际问题选择合适的工具。

2. 核心概念

UMAP 是什么?

想象你有一张皱巴巴的世界地图(高维数据),你想把它平整地铺在桌面上(2D/3D),同时尽量保持国家之间的相邻关系和大致的大陆轮廓。UMAP 就像是一个更聪明的“地图平整器”。

它基于数学中的拓扑数据分析黎曼几何,但我们可以用一个更简单的模型来理解:UMAP 认为高维数据点均匀分布在一种“模糊”的拓扑结构上。它的目标是在低维空间中找到一个最能保持这种“模糊拓扑”连接的布局。

核心优势:

  • 速度更快: 相比 t-SNE,UMAP 在处理大型数据集时速度快得多。
  • 更好地保持全局结构: UMAP 不仅关心局部点的邻居关系,也尝试在低维空间中大致保持高维数据的整体形状(如不同簇之间的相对位置和距离)。
  • 理论上更优雅: 它有更扎实的数学理论基础。

UMAP vs t-SNE

  • t-SNE 像一个专注于画好每个街区的细节、但可能把大陆板块扭曲的绘图师。它擅长揭示局部聚类,但不同簇之间的距离意义不大。
  • UMAP 像一个既注重街区细节、又努力保持大洲相对位置的绘图师。它既保留了局部结构,又更可靠地保留了全局结构。

3. 代码示例

我们将使用 scikit-learn 的手写数字数据集(8x8像素,64维)进行演示。

# 1. 安装必要的库 (如果尚未安装)
# !pip install umap-learn matplotlib scikit-learn

# 2. 导入所有需要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
import umap # 注意:导入的是 umap-learn 包

# 3. 加载并预处理数据
digits = load_digits()
X = digits.data # 特征数据 (1797, 64)
y = digits.target # 标签 (0-9)

# 标准化是降维前的关键步骤
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

print(f"原始数据形状: {X.shape}")
print(f"标准化后数据形状: {X_scaled.shape}")

# 4. 使用 UMAP 进行降维
# 创建一个 UMAP 转换器,将数据映射到2维
reducer = umap.UMAP(
    n_components=2,       # 目标维度
    n_neighbors=15,       # 关键参数1:考虑每个点周围的邻居数量
    min_dist=0.1,         # 关键参数2:低维嵌入中点之间的最小距离
    random_state=42       # 保证结果可重现
)

# 拟合模型并转换数据
X_umap = reducer.fit_transform(X_scaled)

print(f"降维后数据形状: {X_umap.shape}")

# 5. 可视化结果
plt.figure(figsize=(12, 10))
scatter = plt.scatter(
    X_umap[:, 0],
    X_umap[:, 1],
    c=y,
    cmap='Spectral',
    s=5,
    alpha=0.8
)
plt.colorbar(boundaries=np.arange(11)-0.5).set_ticks(np.arange(10))
plt.title('UMAP projection of the Digits dataset', fontsize=16)
plt.xlabel('UMAP dimension 1')
plt.ylabel('UMAP dimension 2')
plt.grid(True, alpha=0.3)
plt.show()

# 6. (对比) 使用 t-SNE 进行降维 (回顾上一课)
from sklearn.manifold import TSNE

tsne = TSNE(n_components=2, random_state=42, perplexity=30)
X_tsne = tsne.fit_transform(X_scaled)

plt.figure(figsize=(12, 10))
scatter = plt.scatter(
    X_tsne[:, 0],
    X_tsne[:, 1],
    c=y,
    cmap='Spectral',
    s=5,
    alpha=0.8
)
plt.colorbar(boundaries=np.arange(11)-0.5).set_ticks(np.arange(10))
plt.title('t-SNE projection of the Digits dataset (for comparison)', fontsize=16)
plt.xlabel('t-SNE dimension 1')
plt.ylabel('t-SNE dimension 2')
plt.grid(True, alpha=0.3)
plt.show()

4. 实践练习

练习 1:参数探索

任务: 修改上方 UMAP 的 n_neighborsmin_dist 参数,观察并描述聚类效果的变化。

  1. 尝试 n_neighbors=5n_neighbors=50,分别与默认值 15 进行比较。
  2. 尝试 min_dist=0.0min_dist=0.8,分别与默认值 0.1 进行比较。 预期输出: 4张或更多对比图,并写下你的观察(例如,n_neighbors 较大时聚类更“松散”,min_dist 较大时点更分散)。

练习 2:3D UMAP 可视化

任务: 将 UMAP 的输出维度设置为 3 (n_components=3),并用 matplotlib 的 3D 功能进行交互式可视化。 提示:

from mpl_toolkits.mplot3d import Axes3D
# ... (设置 UMAP 为 3D) ...
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(X_umap_3d[:, 0], X_umap_3d[:, 1], X_umap_3d[:, 2], c=y, ...)

预期输出: 一个可旋转的3D散点图。

练习 3:应用于新数据集

任务: 使用 scikit-learn 中的 iris 数据集 (load_iris()),分别应用 UMAP 和 PCA 降维,并比较它们的可视化结果。 问题: 对于 iris 这样的数据集,UMAP 的优势(保持全局结构)是否明显?为什么?

5. 常见错误

  1. 忘记数据预处理: 高维数据(尤其是特征尺度差异大时)必须先进行标准化StandardScaler)或归一化,否则结果会受尺度大的特征主导。
  2. 过度解读簇间距离: 虽然 UMAP 比 t-SNE 更能保持全局结构,但在降维后的图中,不同簇之间的绝对距离依然不能完全等同于原始高维空间中的距离。它主要用于展示相对关系。
  3. 忽略随机种子: 不设置 random_state 会导致每次运行结果不同,不利于复现和分析。
  4. 将 UMAP 作为聚类算法: UMAP 是一个降维和可视化工具,而非聚类算法。它揭示出的“簇”是视觉上的,要进行严格的聚类分析,应在降维后的数据上应用 K-Means、DBSCAN 等算法,或使用 UMAP 直接输出的监督学习结果。
  5. 参数设置教条化: 没有万能的 n_neighborsmin_dist。通常,n_neighbors 在 5-50 之间,min_dist 在 0.0-0.5 之间,需要根据数据特性和你希望看到的结果(紧密的簇 vs. 松散的流形)进行调优。

6. 小结

  • UMAP 是什么: 一种基于流形学习和拓扑数据分析的强大、快速的降维算法,特别擅长在保持局部细节的同时,更好地保持数据的全局结构。
  • 核心工作流程: 数据标准化 -> 创建 UMAP 转换器 -> fit_transform -> 可视化。
  • 关键参数:
    • n_neighbors:控制算法考虑局部邻域的大小,值越大越关注全局结构。
    • min_dist:控制低维嵌入中点的紧密程度,值越大,点分布越松散。
  • 与 t-SNE 的区别: UMAP 通常更快,并且在理论上能更好地保留数据的全局拓扑特性,使得不同类别簇的相对位置更有意义。
  • 最佳实践: 始终先标准化数据,设置 random_state 以保证可重现性,并谨慎解读降维后的可视化结果,将其视为探索数据结构和特征的起点。

通过本课,你已掌握了 UMAP 这一现代降维利器,它将是你探索高维数据世界的得力助手。下一课,我们将转换视角,学习如何发现数据中的“异常分子”。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「异常检测方法:Isolation Forest 与 LOF」 以巩固所学知识。