t-SNE的核心作用是可视化聚类结构而非度量距离;其坐标无绝对尺度意义,仅相对位置可信;perplexity需匹配数据局部密度;大数据需降维加速;可视化须注意标签编码、点大小和坐标轴比例。

TSNE 的核心作用不是“还原距离”,而是让相似点扎堆、不相似点分开。它不适合做聚类后直接拿坐标算欧氏距离,但特别适合一眼看出数据里有没有自然形成的簇、有没有离群样本、不同标签是否混在一起。
为什么 fit_transform 后的坐标不能直接当空间坐标用
t-SNE 输出的二维坐标 X_tsne[:, 0] 和 X_tsne[:, 1] 没有绝对尺度意义:横轴单位不是“米”,也不是“标准差”,更不是原始特征的任何线性组合。它只保证相对位置可信——比如点 A 离点 B 近、离点 C 远,这种排序大概率在高维空间也成立;但 A 和 B 之间是 0.3 还是 0.8,毫无解释力。
- 如果你用
scipy.spatial.distance.pdist(X_tsne)算两两点距再聚类,结果很可能比原始高维空间还差 - 图上两个簇中心看起来相距很远,不代表它们在原始空间中语义差异大;可能只是优化过程中的随机拉伸
- 同一组数据跑两次
TSNE(没设random_state),形状会不同,但簇内紧凑性、簇间分离感通常一致
perplexity 参数怎么选才不翻车
perplexity 控制每个点“看多远找邻居”,本质是平滑高斯分布的 σ。它不是越大越好,也不是越小越细,而要匹配你数据的局部密度结构:
- 样本量
- 样本量 1000–10000:30 是常用起点,像 MNIST、CIFAR 嵌入常用 30–50
- 样本量 > 50000:别硬扛默认
O(n²)复杂度,先用init='pca'+learning_rate=200加速,perplexity可设 50–100,但务必观察局部是否糊成一片 - 如果所有点挤成一团、边界模糊,大概率
perplexity太大;如果出现大量孤立点、簇内断裂,可能是太小
内存和速度卡住时的实操对策
当 n_samples > 5000 且 n_features > 100,TSNE 默认会吃光 16GB 内存并跑十几分钟。这不是 bug,是算法设计使然:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 先用
PCA(n_components=50)把特征压到 50 维以内再喂给TSNE,对图像/文本嵌入几乎无损 - 加参数
init='pca',跳过随机初始化,收敛快一倍以上 - 显存够的话,换
openTSNE库(pip install openTSNE),支持多核 + Barnes-Hut 近似,万级样本秒出 - 真要处理百万样本?放弃单机
TSNE,改用UMAP或分批采样 + 插值,别硬刚
可视化时最容易被忽略的三件事
很多人画完散点图就以为结束了,但关键信息常藏在细节里:
- 别用
c=y直接传标签数组——如果y是字符串或 object 类型,matplotlib会静默失败,显示全黑点;务必转成pd.Categorical(y).codes或LabelEncoder().fit_transform(y) - 点大小
s=10在千级样本下还行,但万级样本必须设s=0.5甚至s=0.1,否则重叠遮盖严重 - 加一句
plt.axis('equal'),否则 x/y 轴缩放不一致会让圆形簇变椭圆,误导你判断结构
真正难的不是调通代码,而是看懂图里哪些分离是真实的、哪些是 perplexity 和随机性造的假象。建议对同一数据跑 3 次不同 random_state,只相信反复出现的簇结构。

















