当散点图不够用时:用 t-SNE 可视化多维数据
从散点图的局限说起在数据分析的工作中我们经常会遇到这样一个问题如何把数据的“样子”展示给别人看如果数据只有两个维度事情很简单——画一张散点图就好了。横轴一个变量纵轴一个变量每个点代表一条数据分布一目了然。如果数据有三个维度呢也还行——散点图加上颜色用不同颜色代表第三个维度的取值。比如用散点图展示城市的人口、GDP和面积点的颜色深浅表示面积大小。如果数据有四个维度呢可以再加一个点的大小半径用点的大小表示第四个维度。比如散点图展示学生的学习时间、考试成绩、出勤率和作业完成度——横轴是学习时间纵轴是考试成绩颜色表示出勤率点的大小表示作业完成度。那五个维度呢六个呢十个呢散点图到此为止了。当数据的维度超过4个传统的散点图就再也无能为力了。我们无法在二维平面上用有限的视觉通道位置、颜色、大小、形状去表达十几个甚至上百个维度的信息。但现实世界中的数据往往就是高维的。一份用户画像可能有几十个特征一篇文档的向量表示可能有几百维一张图片经过神经网络提取特征后可能有上千维。这些数据里藏着丰富的结构和模式但我们看不见。直到我看到了t-SNE。什么是 t-SNEt-SNEt-Distributed Stochastic Neighbor Embeddingt-分布随机邻域嵌入是一种非线性降维技术它的目标是把高维空间中的数据点映射到二维或三维空间同时尽可能保留高维空间中数据点之间的局部邻域关系。说人话就是在高维空间中离得近的点在 t-SNE 图上也会离得近在高维空间中离得远的点在 t-SNE 图上也会离得远。t-SNE的核心思想是概率的——它把数据点之间的相似度转化为概率分布然后在低维空间中寻找一个分布使得这两个分布尽可能接近。它不需要预先指定簇的数量能够自动揭示数据中潜在的聚类结构。t-SNE 的优点擅长展示聚类效果t-SNE 能够很好地将数据中的自然分组在二维平面上呈现出来。保留局部结构在高维空间中相近的数据点在低维空间中仍然会靠在一起。无需预先定义簇数量不像 K-Means 等聚类算法需要指定分成几类。t-SNE 的缺点⚠️ 重要计算成本高尤其是在处理大型数据集时t-SNE 的运行时间可能很长。结果不稳定不同次运行可能得到不同的结果。坐标轴不可解释t-SNE 的两个轴不代表任何原始特征的逻辑组合不像 PCA 的主成分那样可以解释含义。参数敏感困惑度perplexity等参数的选择会显著影响结果。可能产生误导t-SNE 有时会夸大簇的大小差异或者把本不相关的点凑到一起。尤其需要注意的是t-SNE 的全局距离不同簇之间的距离是没有意义的。它擅长展示“谁和谁是一伙的”但不擅长展示“这两个群体之间到底有多远”。什么时候用 t-SNEt-SNE最适合的场景是你想探索高维数据中是否存在自然的聚类结构。典型的使用场景包括文本数据的可视化将文档的向量表示Embedding降维到二维观察不同主题的文档是否自然聚在一起。图像数据的可视化将图片的特征向量降维观察不同类别的图片在空间中的分布。用户行为分析将用户的多维行为特征降维识别不同的用户群体。模型输出的解释可视化深度学习模型中间层的特征表示帮助理解模型学到了什么。动手实践两个生活案例光说不练假把式。接下来我们用两个贴近生活的例子看看t-SNE到底怎么用。案例一葡萄酒品鉴数据可视化假设你是一个葡萄酒爱好者收集了 200 款红葡萄酒的 13 个特征数据酒精含量、苹果酸含量、灰分含量、镁含量、总酚含量等。你想看看这些葡萄酒是否可以按照产地自然地分成几类。这个数据集是scikit-learn这个机器学习库中自带的。import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_wine from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler # 加载葡萄酒数据集13个特征3个产地类别 wine load_wine() X wine.data # 13个特征 y wine.target # 产地标签0, 1, 2 # 标准化数据t-SNE 对尺度敏感 X_scaled StandardScaler().fit_transform(X) # 使用 t-SNE 降维到 2 维 tsne TSNE(n_components2, perplexity30, random_state42, max_iter1000) X_tsne tsne.fit_transform(X_scaled) # 可视化 plt.figure(figsize(10, 8)) colors [red, green, blue] for i, label in enumerate(np.unique(y)): mask y label plt.scatter(X_tsne[mask, 0], X_tsne[mask, 1], ccolors[i], labelf产地 {i}, alpha0.7, s60) plt.title(t-SNE 可视化葡萄酒按产地聚类, fontsize14) plt.xlabel(t-SNE 维度 1) plt.ylabel(t-SNE 维度 2) plt.legend() plt.show()运行这段代码你会看到不同产地的葡萄酒在二维平面上自然地分成了几个簇。原本 13 个维度的数据现在可以直观地看到聚类结构——这就是t-SNE的魔力。案例二电影推荐系统中的用户画像假设你有一个电影推荐系统收集了 500 个用户的观影偏好数据。每个用户有 20 个特征对不同类型电影动作、喜剧、科幻、爱情、恐怖、纪录片等的偏好程度。你想看看这些用户是否可以自然地分成不同的“观影人群”以便做更精准的推荐。import numpy as np import matplotlib.pyplot as plt from sklearn.manifold import TSNE from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 模拟数据500个用户20个电影类型偏好特征 np.random.seed(42) n_users 500 n_features 20 # 生成模拟数据假设存在4种不同的用户类型 X np.random.randn(n_users, n_features) # 为不同用户类型添加不同的偏好模式 # 类型0喜欢动作和科幻 X[:125, 0:5] 2.0 # 类型1喜欢爱情和喜剧 X[125:250, 5:10] 2.0 # 类型2喜欢恐怖和悬疑 X[250:375, 10:15] 2.0 # 类型3喜欢纪录片和历史 X[375:500, 15:20] 2.0 # 标准化 X_scaled StandardScaler().fit_transform(X) # 先用 K-Means 聚类这里只是为了给点打标签做可视化 kmeans KMeans(n_clusters4, random_state42) labels kmeans.fit_predict(X_scaled) # t-SNE 降维 tsne TSNE(n_components2, perplexity30, random_state42, max_iter1000) X_tsne tsne.fit_transform(X_scaled) # 可视化 plt.figure(figsize(10, 8)) scatter plt.scatter(X_tsne[:, 0], X_tsne[:, 1], clabels, cmapviridis, alpha0.6, s50) plt.colorbar(scatter, label用户类型) plt.title(t-SNE 可视化电影用户聚类, fontsize14) plt.xlabel(t-SNE 维度 1) plt.ylabel(t-SNE 维度 2) plt.show()在这个例子中t-SNE 帮助我们直观地看到了 500 个用户在偏好空间中的分布——哪些用户是“动作片爱好者”哪些是“爱情片爱好者”一目了然。一个完整的代码模板如果你想把 t-SNE 应用到自己的数据上下面这个模板可以直接套用import numpy as np import matplotlib.pyplot as plt from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler # 1. 准备数据 # X 是你的高维数据形状为 (n_samples, n_features) # labels 是每个样本的类别标签可选用于着色 # X ... # 2. 标准化重要 X_scaled StandardScaler().fit_transform(X) # 3. t-SNE 降维 tsne TSNE( n_components2, # 降维到2维 perplexity30, # 困惑度通常 5-50 random_state42, # 固定随机种子保证结果可复现 max_iter1000 # 迭代次数确保收敛 ) X_tsne tsne.fit_transform(X_scaled) # 4. 可视化 plt.figure(figsize(10, 8)) if labels is not None: scatter plt.scatter(X_tsne[:, 0], X_tsne[:, 1], clabels, cmaptab10, alpha0.6, s50) plt.colorbar(scatter) else: plt.scatter(X_tsne[:, 0], X_tsne[:, 1], alpha0.6, s50) plt.title(t-SNE Visualization) plt.xlabel(t-SNE dimension 1) plt.ylabel(t-SNE dimension 2) plt.show()

相关新闻

YOLOv11涨点改进| CVPR 2026 | 独家Conv与频域改进篇| 引入SSFModule选择性空间频率模块,助力无人机航拍、遥感影像、小目标检测、语义分割、实例分割、目标跟踪任务,有效涨点

YOLOv11涨点改进| CVPR 2026 | 独家Conv与频域改进篇| 引入SSFModule选择性空间频率模块,助力无人机航拍、遥感影像、小目标检测、语义分割、实例分割、目标跟踪任务,有效涨点

一、本文介绍 🔥本文给大家介绍使用 SSFModule选择性空间频率模块 改进YOLOv11网络模型,SSFModule通过空间域通道选择与频率域位置感知选择,动态融合目标的局部纹理、边缘细节、多尺度结构和全局语义信息,使网络针对不同尺寸、密度及背景区域自适应选择有效特征,从而增强…

2026/7/24 1:18:18 阅读更多 →
终极Android阴影生成器:shadow4android免费9-patch阴影制作工具

终极Android阴影生成器:shadow4android免费9-patch阴影制作工具

终极Android阴影生成器:shadow4android免费9-patch阴影制作工具 【免费下载链接】shadow4android Android 9-patch shadow generator 项目地址: https://gitcode.com/gh_mirrors/sh/shadow4android 在Android应用开发中,为界面元素添加阴影效果是…

2026/7/24 22:37:11 阅读更多 →
超星学习通自动签到工具:5分钟实现全平台智能签到

超星学习通自动签到工具:5分钟实现全平台智能签到

超星学习通自动签到工具:5分钟实现全平台智能签到 【免费下载链接】chaoxing-sign-cli 超星学习通签到:支持普通签到、拍照签到、手势签到、位置签到、二维码签到,支持自动监测、QQ机器人签到与推送。 项目地址: https://gitcode.com/gh_mi…

2026/7/21 22:38:30 阅读更多 →

最新新闻

Fastify-cli与TypeScript完美结合:构建类型安全的现代后端应用

Fastify-cli与TypeScript完美结合:构建类型安全的现代后端应用

Fastify-cli与TypeScript完美结合:构建类型安全的现代后端应用 【免费下载链接】fastify-cli Run a Fastify application with one command! 项目地址: https://gitcode.com/gh_mirrors/fa/fastify-cli Fastify-cli是一款强大的命令行工具,能让你…

2026/7/25 23:54:28 阅读更多 →
JavaScript函数与作用域深度解析:Frontend Masters Bootcamp 核心概念

JavaScript函数与作用域深度解析:Frontend Masters Bootcamp 核心概念

JavaScript函数与作用域深度解析:Frontend Masters Bootcamp 核心概念 【免费下载链接】bootcamp Frontend Masters Bootcamp 项目地址: https://gitcode.com/gh_mirrors/boot/bootcamp Frontend Masters Bootcamp 是前端开发者的入门宝典,其中 J…

2026/7/25 23:54:28 阅读更多 →
揭秘Anaconda-mode工作原理:Jedi后端与Emacs插件协作机制

揭秘Anaconda-mode工作原理:Jedi后端与Emacs插件协作机制

揭秘Anaconda-mode工作原理:Jedi后端与Emacs插件协作机制 【免费下载链接】anaconda-mode Code navigation, documentation lookup and completion for Python. 项目地址: https://gitcode.com/gh_mirrors/an/anaconda-mode Anaconda-mode是一款强大的Python…

2026/7/25 23:54:28 阅读更多 →
小程序计算机毕设之基于Django的智慧校园车位资源调度小程序系统(完整前后端代码+说明文档+LW,调试定制等)

小程序计算机毕设之基于Django的智慧校园车位资源调度小程序系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/25 23:54:28 阅读更多 →
MySQL从入门到精通:索引优化、事务管理与高可用架构实战指南

MySQL从入门到精通:索引优化、事务管理与高可用架构实战指南

你是不是也遇到过这样的场景:项目急着上线,数据库却连不上;面试被问到索引优化,只能说出“加索引”三个字;或者看着同事熟练地写复杂查询,自己却连基本的JOIN都理不清?如果你正在寻找一份真正能…

2026/7/25 23:54:28 阅读更多 →
Linux内核开发实战:从模块编写到系统编译的完整指南

Linux内核开发实战:从模块编写到系统编译的完整指南

最近在整理操作系统开发相关的学习资料时,发现很多朋友对“从零开始构建一个操作系统”既充满向往,又感到无从下手。网上的资料要么过于理论化,要么过于零散,难以形成一条清晰的实践路径。本文将围绕 基于Linux内核的操作系统开发…

2026/7/25 23:53:28 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 23:49:28 阅读更多 →

月新闻