张芷铭的个人博客

t-SNE 是一种非线性降维技术,擅长将高维数据映射到二维或三维空间进行可视化,特别适合揭示数据的聚类结构。

核心思想

t-SNE 的目标:在低维空间中,保持高维空间中相似点的邻近关系。

形象比喻:

  • PCA:绘制世界地图,保持全局结构(大洲位置),但可能扭曲局部
  • t-SNE:绘制城市街区地图,精确保持局部结构(邻近建筑),牺牲全局位置

工作原理

  1. 高维空间度量相似性:使用高斯分布计算点对之间的条件概率
  2. 低维空间构建相似性:使用 t 分布(尾部更厚重,解决"拥挤问题")
  3. 最小化分布差异:通过梯度下降最小化 KL 散度

特点与参数

特性说明
优势保留局部结构,能发现复杂聚类模式
局限计算成本高,结果有随机性,坐标轴无明确含义,不能处理新数据

关键参数:

参数说明建议值
perplexity每个点考虑的近邻数5-50
learning_rate优化步长需调试
n_iter迭代次数足够大确保收敛

与 PCA 对比

特性t-SNEPCA
核心思想非线性,保留局部结构线性,保留全局结构
最佳用途数据可视化,探索聚类数据压缩、去噪、特征提取
计算效率较慢非常快
可解释性坐标轴无明确含义主成分有方差贡献度

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

def visualize_clusters(features, labels, max_points=1000):
    # 抽样避免内存问题
    if len(features) > max_points:
        indices = np.random.choice(len(features), max_points, replace=False)
        features = features[indices]
        labels = labels[indices]

    reducer = TSNE(n_components=2, random_state=42, perplexity=30)
    embeddings_2d = reducer.fit_transform(features)

    plt.figure(figsize=(12, 10))
    scatter = plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1],
                          c=labels, cmap='Spectral', alpha=0.7, s=10)
    plt.colorbar(scatter)
    plt.title('t-SNE Visualization')
    plt.show()

结果解读

  • 同色点聚集清晰、异色点分离良好 → 聚类效果好
  • 不同颜色混杂 → 聚类效果不理想,需调整参数

perplexity=30 对中等规模数据(约 1000 点)通常合理,可视效果不佳时可调整该参数和 learning_rate

Comments