0

0

如何用Python实现数据的t-SNE降维?

蓮花仙者

蓮花仙者

发布时间:2025-08-04 12:08:01

|

788人浏览过

|

来源于php中文网

原创

t-sne降维的核心思想是保留高维数据点之间的局部邻近关系,通过在低维空间中模拟高维空间的概率分布,使相似点靠近、不相似点远离。它在数据可视化中受欢迎的原因包括:1. 擅长揭示非线性结构和聚类;2. 有效缓解“拥挤问题”,使不同簇更清晰区分;3. 可视化结果直观呈现数据内在结构。

如何用Python实现数据的t-SNE降维?

Python中实现t-SNE降维,主要依赖

scikit-learn
库中的
TSNE
类。它能将高维数据映射到2D或3D空间,帮助我们可视化数据结构,发现潜在的聚类或模式。

如何用Python实现数据的t-SNE降维?

在Python中实现t-SNE降维,通常会经历数据准备、模型初始化、拟合转换和结果可视化几个步骤。这里我们用一个简单的例子来展示这个过程。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.datasets import make_blobs # 用来生成一些带聚类的数据

# 1. 生成一些示例数据
# 假设我们有1000个样本,每个样本有50个特征,分成3个聚类
n_samples = 1000
n_features = 50
n_clusters = 3
X, y = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=42)

print(f"原始数据维度: {X.shape}")

# 2. 初始化t-SNE模型
# 关键参数:
#   n_components: 目标维度,通常是2或3
#   perplexity: 困惑度,可以理解为每个点“邻居”的数量,通常在5到50之间
#   learning_rate: 学习率,太小收敛慢,太大可能发散,需要尝试
#   n_iter: 迭代次数,足够多才能让结果稳定
#   init: 初始化方式,'pca'通常比'random'好,能加速收敛并避免局部最优
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, n_iter=1000, init='pca', random_state=42)

# 3. 拟合并转换数据
# 这一步计算量比较大,需要耐心等待
X_tsne = tsne.fit_transform(X)

print(f"降维后数据维度: {X_tsne.shape}")

# 4. 可视化降维结果
plt.figure(figsize=(8, 6))
# 按照原始数据的类别(如果有的话)给点上色,这样可以直观地看到t-SNE是否能区分这些类别
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis', s=10, alpha=0.7)
plt.colorbar(scatter, label='Cluster ID')
plt.title('t-SNE Dimensionality Reduction of Synthetic Data')
plt.xlabel('t-SNE Dimension 1')
plt.ylabel('t-SNE Dimension 2')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

# 实际应用中,你可能需要对真实数据集进行预处理,比如标准化或归一化。
# t-SNE对数据的尺度敏感性不像PCA那么强,但良好的预处理总是有益的。

t-SNE降维的核心思想是什么?它为什么在数据可视化中如此受欢迎?

立即学习Python免费学习笔记(深入)”;

如何用Python实现数据的t-SNE降维?

t-SNE(t-distributed Stochastic Neighbor Embedding)的核心思想在于,它试图在低维空间中保留高维数据点之间的局部邻近关系。它不像PCA那样关注全局方差最大化,而是更侧重于将高维空间中“相似”的点在低维空间中也放置得很近,而将“不相似”的点放置得很远。这个过程分两步:首先,它构建一个高维空间中数据点之间相似度的概率分布(通常是高斯分布);然后,它在低维空间中构建一个类似的概率分布(使用t-分布),并通过优化,让这两个分布尽可能地接近。这个优化过程有点像“吸引”和“排斥”的舞蹈:相似的点相互吸引,不相似的点相互排斥,直到达到一个平衡。

t-SNE之所以在数据可视化中如此受欢迎,主要有几个原因。首先,它非常擅长揭示数据中非线性的结构和聚类。很多真实世界的数据集,其内在结构并非简单的线性可分,而t-SNE能够很好地捕捉到这些复杂的、嵌套的或弯曲的簇。其次,它在处理“拥挤问题”(crowding problem)上表现出色。在传统的降维方法中,当高维数据被映射到低维时,很多不相关的点可能会挤在一起,使得可视化结果模糊不清。t-SNE通过使用t-分布(其尾部比高斯分布更重)来模拟低维相似度,有效地缓解了这个问题,使得不同簇之间的距离在视觉上更清晰,更容易区分。所以,当你看到t-SNE图上的一个个“岛屿”,那通常就意味着原数据中存在着自然的聚类。

如何用Python实现数据的t-SNE降维?

选择t-SNE参数时有哪些常见误区和实践建议?

选择t-SNE的参数确实是门艺术,因为它对结果的影响非常大,而且没有一套放之四海而皆准的规则。最常见的参数误区和实践建议主要围绕

perplexity
learning_rate
n_iter

有道翻译AI助手
有道翻译AI助手

有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻

下载

perplexity
(困惑度)是最重要的参数之一,它大致可以理解为每个数据点“考虑”的邻居数量。它的取值范围通常在5到50之间。常见的误区是随意设定一个值,或者只尝试一个值。实际上,不同的
perplexity
值可能会揭示数据中不同尺度的结构。例如,一个较小的
perplexity
可能关注非常局部的邻居关系,从而揭示出更细粒度的聚类;而一个较大的
perplexity
则可能关注更广阔的邻居范围,从而揭示出更大的、更宏观的结构。所以,实践中,我通常会尝试几个不同的
perplexity
值(比如10, 30, 50),看看哪个能更好地展现数据的内在结构。

learning_rate
(学习率)决定了优化过程中每一步的步长。如果
learning_rate
太小,模型收敛会非常慢;如果太大,模型可能会发散,导致结果看起来像一个“球”或者“漩涡”,无法形成清晰的聚类。官方文档建议的初始值通常在10到1000之间。一个常见的误区是直接使用默认值而不进行调整。我的经验是,对于大多数数据集,200左右通常是一个不错的起点,但如果结果不理想,可以尝试逐步调整,比如100、500甚至1000,观察可视化效果的变化。

n_iter
(迭代次数)表示优化过程运行的步数。默认值通常是250或1000。误区在于认为只要运行足够多的迭代就一定能得到好结果。实际上,过少的迭代可能导致结果未完全收敛,聚类不清晰;而过多的迭代则可能导致过拟合,或者仅仅是浪费计算资源,因为结果可能在一定迭代次数后就趋于稳定了。我通常会从1000开始,如果数据量特别大或者结构特别复杂,可能会增加到2500甚至5000,同时观察损失函数(如果有的话)的变化趋势,确保它已经稳定下降。

此外,

init
参数也很关键。将其设置为
'pca'
通常比
'random'
更好,因为它能提供一个更好的初始低维布局,加速收敛并减少陷入局部最优的风险。

t-SNE降维结果如何解读?它有哪些局限性?

解读t-SNE降维结果时,最重要的一点是:簇(clusters)的含义很重要,但簇之间的距离和大小通常不那么重要。如果t-SNE图中出现了一组紧密聚集的点,那意味着这些点在高维空间中是高度相似的,形成了一个自然的聚类。不同的簇在图上分隔开来,表明它们在高维空间中是不同的类别或子群。你可以通过给点上色(如果知道原始类别信息的话)来验证t-SNE是否成功地将相同类别的点聚集在一起,并将不同类别的点分开。簇的内部结构,比如它们的形状或密度,有时也能提供一些信息,比如一个细长的簇可能表示数据在某个方向上具有连续的变化。

然而,t-SNE的局限性也不容忽视:

  1. 计算成本高昂:t-SNE的计算复杂度是O(N log N)或O(N^2),对于大型数据集(例如超过几十万个样本),运行时间会非常长,甚至可能无法在合理时间内完成。这是它在实际应用中最大的障碍之一。
  2. 参数敏感性:正如前面提到的,
    perplexity
    learning_rate
    等参数对最终的布局影响巨大。这使得t-SNE的结果有时难以复现,也需要使用者花费时间和精力去调参。
  3. 非唯一性与随机性:由于t-SNE的优化过程是随机的,每次运行即使使用相同的参数和数据,也可能得到略微不同的结果图。虽然大的结构通常会保持一致,但细节上的布局差异是存在的。这要求我们在解读时,不要过度依赖某一次运行的精确坐标。
  4. 不保留全局结构:t-SNE非常擅长保留局部邻近性,但它在保留全局结构方面表现不佳。这意味着图上两个相距很远的簇,在高维空间中可能并不像视觉上看起来那么“远”,反之亦然。簇之间的相对距离和大小,通常不具有直接的、量化的意义。
  5. 无法用于新数据投影:t-SNE是一个非线性的、基于优化的算法,它没有一个可以直接用于将新数据点投影到现有低维空间的“模型”或“映射函数”。每次有新数据加入,你都需要重新运行整个t-SNE过程,这在需要实时或增量处理的场景下非常不便。因此,它主要用于探索性数据分析和可视化,而不是作为特征工程或预测模型的预处理步骤。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

755

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

759

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

5

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 1.0万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号