本文目录导读:

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维技术,主要用于高维数据的可视化,它本身不是一种聚类算法,而是将高维数据映射到低维空间(通常是 2D 或 3D),使得在低维空间中,相似的数据点更接近,不相似的点更远。
当我们说“t-SNE 聚类”时,通常是指:
- 先用 t-SNE 降维以观察数据的自然分离情况。
- 再在 t-SNE 结果上应用聚类算法(如 K-means、DBSCAN)。
t-SNE 的核心原理(简略)
t-SNE 通过以下两步来保持数据的局部结构:
- 高维空间:计算点之间的条件概率(高斯分布),表示点 i 会选择点 j 作为邻居的概率。
- 低维空间:使用t 分布(而不是高斯分布)计算相似度,目的是让低维空间中的点更分散,缓解“拥挤问题”。
- 优化:通过梯度下降最小化两个概率分布之间的 KL 散度(Kullback-Leibler divergence),使得低维空间的布局尽量反映高维空间的邻居关系。
t-SNE 与聚类的区别
| 特性 | t-SNE | 聚类(如 K-means) |
|---|---|---|
| 目标 | 降维、可视化 | 分组、发现簇 |
| 输出 | 低维坐标(2D/3D) | 簇标签 |
| 是否保留全局结构 | ❌ 不保留(只保留局部) | 通常保留全局距离 |
| 是否可重复 | 每次运行结果可能不同 | 通常可重复(给定种子) |
⚠️ 重要警告:t-SNE 会破坏数据点之间的全局距离和簇大小关系,两个远离的簇在 t-SNE 图中看起来可能很近,只是因为局部结构相似。
常见工作流程:t-SNE + 聚类
步骤
- 数据预处理:标准化/归一化。
- t-SNE 降维:设置合适的
perplexity(5-50)。 - 可视化:画出 2D 散点图,观察是否有自然分离的团块。
- 运行聚类算法:在 t-SNE 结果上运行 K-means、DBSCAN 等。
- 分析聚类结果:检查聚类是否合理(注意 t-SNE 可能引入伪影)。
代码示例(Python)
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_digits from sklearn.manifold import TSNE from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 加载数据 digits = load_digits() X, y = digits.data, digits.target # 标准化 X_scaled = StandardScaler().fit_transform(X) # 1. t-SNE 降维 tsne = TSNE(n_components=2, perplexity=30, random_state=42) X_tsne = tsne.fit_transform(X_scaled) # 2. 可视化(用真实标签着色) plt.figure(figsize=(5,5)) plt.scatter(X_tsne[:,0], X_tsne[:,1], c=y, cmap='tab10', s=20)"t-SNE visualization (true labels)") plt.show() # 3. 在 t-SNE 结果上聚类 kmeans = KMeans(n_clusters=10, random_state=42) labels = kmeans.fit_predict(X_tsne) # 可视化聚类结果 plt.figure(figsize=(5,5)) plt.scatter(X_tsne[:,0], X_tsne[:,1], c=labels, cmap='tab10', s=20)"K-means on t-SNE output") plt.show()
关键参数与注意事项
主要参数
perplexity(困惑度):控制平衡局部 vs 全局结构,5-50,越大,考虑邻居越多。learning_rate:10-1000,太大太小都可能导致不收敛。n_iter:迭代次数,通常至少 250。random_state:固定随机种子可重复结果。
使用注意事项
- t-SNE 结果不稳定:不同
random_state或参数会产生不同布局。 - 簇的大小、距离、密度无意义:t-SNE 图上的簇大小和距离不能反映真实数据中的簇大小或分离程度。
- 不适合用于特征提取:t-SNE 是可视化工具,不应用于后续模型训练(因为它是非参数化、不可逆的)。
- 计算复杂度高:对大数据集(>10 万样本)较慢,可用
optics或Barnes-Hut近似(sklearn 默认已用)。 - 可能产生伪影:t-SNE 有时会人为地将随机噪声点分成明显的簇——不要仅凭视觉判断就相信存在真实簇。
何时使用 t-SNE + 聚类?
- 你想探索高维数据中是否存在自然分离。
- 你需要向非技术人员展示数据分布。
- 你准备对比不同聚类算法的视觉效果。
不推荐的场景:
- 需要保留全局距离关系(用 PCA 或 UMAP)。
- 需要在降维后做特征提取(用 Autoencoder)。
- 需要可重复、稳定的聚类结果(直接在原始数据上聚类)。
常见误区
| 误区 | 解释 |
|---|---|
| “t-SNE 图上的距离代表真实距离” | ❌ t-SNE 只保留局部邻居关系,全局距离不可靠 |
| “t-SNE 图上分开的簇就是不同的类别” | ❌ 可能只是参数设置导致的假簇 |
| “t-SNE 图上的簇大小代表真实簇大小” | ❌ t-SNE 会拉伸或压缩不同区域 |
| “t-SNE 聚类比原始空间聚类更好” | ❌ 不一定,可能引入偏差 |
- t-SNE 不是聚类算法,而是降维可视化工具。
- 它可以辅助观察数据的自然分组,但不能代替严谨的聚类验证。
- 如果在 t-SNE 结果上做聚类,务必在原始特征空间验证聚类结果的有效性(如轮廓系数、外部标签比对等)。
- 推荐替代:对于需要保持全局结构的情况,考虑 UMAP(Uniform Manifold Approximation and Projection)或 PCA(主成分分析)。