news 2026/6/7 4:58:28

深度学习-t-SNE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习-t-SNE

降维大杀器:如何用 t-SNE 把高维数据“拍”扁得既好看又好懂?

在数据科学的世界里,我们经常会遇到拥有几十甚至上百个特征(维度)的数据集。人类的大脑顶多能理解三维世界,面对百维数据,除了看表格,我们还能怎么直观地感受它们?

这时候,降维算法(Dimension Reduction)就派上用场了。今天我们要聊的,就是降维界的人气顶流、可视化届的“美颜相机”——t-SNE(t-Distributed Stochastic Neighbor Embedding,t-分布随机邻域嵌入)


1. 为什么有了 PCA,我们还需要 t-SNE?

说到降维,很多人第一个想到的是PCA(主成分分析)。PCA 很好,算得快,而且是线性降维。但它有一个致命的缺点:它只关注全局结构,容易“欺负”局部细节

如果你的数据在超空间里是一个复杂的弯曲流形(比如像瑞士卷那样卷起来),PCA 这一巴掌拍下去,原本离得很远的点可能会被强行压在一起,导致原本不同的类别在低维空间里糊成一片。

t-SNE 的核心思想就是:不管全局怎么变,我要让在高维空间里离得近的点,在低维空间里依然离得近。它非常擅长捕捉非线性结构,能把复杂的分类数据完美地“聚”在一起。


2. 深入浅出:t-SNE 是如何工作的?

t-SNE 的核心逻辑可以用三步来概括:

第一步:高维空间里的“亲密度”高斯分布

在高维空间中,t-SNE 会计算任意两个样本点之间的距离,并把这个距离转换成条件概率(使用高斯分布)。

  • 两个点离得越近,概率值(亲密度)越高。
  • 两个点离得越远,概率值越接近于 0。

第二步:低维空间里的“映射”与 t 分布

接着,t-SNE 在低维空间(比如 2D 或 3D)中随机初始化相同数量的点。它同样会计算低维空间点的亲密度,但这里它换了一个工具——t 分布(具体是自由度为 1 的 t 分布,即柯西分布)

为什么要换成 t 分布?(拥挤问题 Crowding Problem)
在高维空间里,可容纳点的“面积”非常大。当它们被映射到 2D 空间时,空间变小了,如果还用高斯分布,所有的点都会被挤在中心。t 分布的尾部比高斯分布更厚,这意味着在低维空间中,离得远的点会被推得更远,从而给不同的簇(Cluster)留出足够的边界

第三步:让两个空间“同频共振”

t-SNE 的目标是让低维空间的亲密度分布,尽可能地接近高维空间的亲密度分布。它使用KL 散度(Kullback-Leibler Divergence)来衡量这两个分布的差异,并通过梯度下降调整低维点的位置,直到拉低 KL 散度。最终,高维中的“邻居”,在低维中也成了“邻居”。


3. 灵魂拷问:t-SNE 的四大避坑指南

虽然 t-SNE 画出来的图极其惊艳(经常能看到色彩斑斓、边界清晰的漂亮聚类图),但在解读和使用它时,有几个非常容易踩的雷区:

  • 困惑度(Perplexity)不是越小越好:Perplexity 粗略地代表了你认为每个点的邻居有多少个(通常设在 5 到 50 之间)。设得太小,数据会变成一堆细碎的孤岛;设得太大,数据又会糊成一团。需要反复调参。
  • 簇与簇之间的距离没有任何物理意义:
    t-SNE 只保证“局部近的还是近”,但它无法保证全局距离。如果在图上看到 A 簇和 B 簇离得很近,C 簇离得很远,千万不要得出“A 和 B 更相似”的结论。
  • 簇的大小不代表数据量的多少:
    t-SNE 会自动膨胀稀疏的簇,压缩密集的簇,以便让画面更好看。所以,一个看起来很大的圆圈,里面的数据点可能和旁边一个极小的圆圈一样多。
  • 随机初始化意味着每次结果都不同:
    t-SNE 是基于随机初始化的算法。如果不设置固定的随机种子(random_state),你每次运行代码画出来的图可能都长得不一样。

4. Python 实战代码(极简版)

在 Python 中,我们直接使用scikit-learn就能轻松上手:

importmatplotlib.pyplotaspltfromsklearn.manifoldimportTSNEfromsklearn.datasetsimportload_digits# 加载手写数字数据集(8x8像素,共64个特征)digits=load_digits()X,y=digits.data,digits.target# 初始化 t-SNE,降维到 2 维# 强烈建议设置 random_state 保证结果可复现tsne=TSNE(n_components=2,perplexity=30,random_state=42)X_tsne=tsne.fit_transform(X)# 绘图plt.figure(figsize=(10,8))scatter=plt.scatter(X_tsne[:,0],X_tsne[:,1],c=y,cmap='tab10',alpha=0.7)plt.colorbar(scatter)plt.title("t-SNE Visualization of Handwritten Digits")plt.xlabel("t-SNE Feature 1")plt.ylabel("t-SNE Feature 2")plt.show()

总结

t-SNE 就像是数据科学家的显微镜。它不适合用来做特征工程(因为计算慢、且无法直接转换新数据),但它是探索性数据分析(EDA)和成果展示的无敌神器。下次当你面对一堆看不懂的高维特征时,不妨用 t-SNE 拍张照片,说不定数据内部的秘密一眼就被你看穿了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 4:58:26

LISP递归

在 LISP(以及 Scheme 等方言)中,递归(Recursion) 拥有至高无上的地位。 因为经典 LISP 提倡纯粹的函数式编程风格,它没有专门的循环结构(如 for 或 while)。在 LISP 里,所…

作者头像 李华
网站建设 2026/6/7 4:56:14

Julia与Python数据处理性能实测:7类金融场景对比分析

1. 这不是“谁取代谁”的站队问题,而是数据工程师每天都在做的权衡“Can Julia replace Python?”——这个标题一出来,我就在好几个技术群看到有人立刻截图发问:“是不是以后不用学Python了?”“Julia真能干掉Python?…

作者头像 李华
网站建设 2026/6/7 4:53:55

LangGraph实战:构建具备ReAct与分层记忆的AI智能体工作流

1. 项目概述:这不是在搭积木,而是在给AI装上“思考回路”你有没有试过让大模型写一封客户投诉回复,结果它逻辑跳脱、前后矛盾,甚至自己编造出根本不存在的订单号?或者让它分析一份销售报表,它能准确提取数字…

作者头像 李华
网站建设 2026/6/7 4:53:53

高中数学教资资料推荐|科三知识点和模拟卷整理

高中数学教资资料推荐|科三知识点和模拟卷整理资料全科都有高中数学教资资料推荐|科三知识点模拟卷 PDFhttps://pan.quark.cn/s/39315a03df45 第 1 题 高中数学科三 学科知识深度一般( ) A. 高于初中,含函数、导数、立…

作者头像 李华
网站建设 2026/6/7 4:51:17

揭秘高效B站数据提取工具:3步完成视频信息自动化采集的完整攻略

揭秘高效B站数据提取工具:3步完成视频信息自动化采集的完整攻略 【免费下载链接】Bilivideoinfo Bilibili视频数据爬虫 精确爬取完整的b站视频数据,包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时…

作者头像 李华