t-SNE(t-Distributed Stochastic Neighbor Embedding)是流形学习中经典的非线性降维算法,由 Van der Maaten 和 Hinton 在 2008 年提出,是对传统 SNE(Stochastic Neighbor Embedding)的改进,核心解决了高维数据降维可视化时的拥挤问题,能更好地保留高维数据的局部结构,是高维数据(如特征向量、图像、基因数据)可视化的首选方法之一。

一、t-核心概念

1.t-SNE背景

        SNE 的核心思想是将高维空间的欧氏距离转化为条件概率,衡量点的相似性,再让低维空间的条件概率匹配高维,但存在致命问题。

传统 SNE 的三大缺陷:

  • 拥挤问题:高维中不同簇的点在低维会被压缩到一起,无法区分;
  • 概率不对称:高维条件概率p_{j |i}\neq p_{i|j},导致梯度更新复杂、收敛慢;
  • 优化困难:损失函数非凸,易陷入局部最优。

2.t-SNE 核心思想

t-SNE 的核心是概率分布匹配:

  • 在高维空间中,用高斯分布计算任意两点的对称联合概率p_{ij},概率越大表示两点在高维越相似;
  • 在低维空间中,用自由度为 1 的学生 t 分布计算任意两点的对称联合概率Q_{ij},同样概率越大表示低维相似性越高;
  • 通过梯度下降最小化高维分布P和低维分布Q的KL 散度,用来衡量两个概率分布的差异,让低维分布尽可能还原高维分布的相似性结构。

核心改进亮点

  • 低维用t 分布:解决拥挤问题,允许低维空间中距离较远的点保留一定相似性,避免高维小距离被过度压缩;
  • 高维概率对称化:将条件概率转化为联合概率P_{ij}=P_{ji}​,简化梯度计算;
  • 引入早期压缩(Early Exaggeration):优化前期放大高维相似性,让低维簇更容易分离,解决局部最优问题。

3.t-SNE 关键术语

(1)困惑度

t-SNE 中最重要的超参数,定义为:

Perp\left (P _{i} \right )=2^{H\left ( P_{i} \right )}

其中H(Pi​),是高维条件概率Pi​的香农熵

        物理含义:衡量每个样本点的有效近邻数,困惑度越大,每个点考虑的近邻越多,更关注全局结构;困惑度越小,更关注局部结构。

  • 经验取值:5~50(常用 10、20、30),数据集越大可适当增大;
  • 关键特性:每个样本点的σi​高斯分布方差由困惑度确定,通过二分查找求解,保证所有点的困惑度接近设定值。
(2)高斯分布

用于量化高维空间的相似性:两点距离越近,高斯分布的概率密度越大,对应的相似性概率pj∣i​越高。

  • 每个样本点有专属方差σi​:因为不同点的局部密度不同,密集区域σi​小,稀疏区域σi​大,保证局部结构的合理性。
(3)自由度 1 的学生 t 分布

t 分布的概率密度函数为:

F\left ( X \right )=\frac{\tau \left ( \frac{\nu +1}{2} \right )}{\sqrt{\nu \Pi }\tau \left ( \frac{\nu }{2} \right )}\left ( 1+\frac{x^{2}}{\nu } \right )^{-\frac{\nu +1}{2}}

当自由度ν=1时,t 分布退化为柯西分布,具有重尾特性,尾部概率比高斯分布大得多:

  • 低维中两点距离稍远时,t 分布仍能保留一定的相似性概率,避免高维簇在低维拥挤;
  • t 分布是对称的,天然满足Q_{ij}=Q_{ji},简化计算。
(4)KL 散度

又称相对熵,用于衡量两个概率分布的非对称差异,是 t-SNE 的损失函数。

(5)早期压缩

        t-SNE 的优化技巧:在梯度下降的前几百次迭代中,将高维联合概率p_{ij}乘以一个系数,放大高维的相似性,让低维空间中原本相似的点更易聚集形成簇,避免优化陷入局部最优;迭代后期恢复原始p_{ij},精细优化簇内结构。

二、代码解释

模块一:导入核心库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 加载测试数据
from sklearn.preprocessing import StandardScaler  # 数据标准化
from sklearn.manifold import TSNE  # sklearn封装的t-SNE

模块二:加载并预处理数据

# 2.1 加载鸢尾花数据集:X(150,4)(4个特征),y(150,)(3个类别)
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names  # 类别名称:setosa, versicolor, virginica

# 2.2 数据标准化:t-SNE对特征尺度敏感,必须标准化(均值0,方差1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # 标准化后的数据shape=(150,4)

模块三:初始化并训练t-SNE

tsne = TSNE(
    n_components=2,        # 降维到2维(可视化)
    perplexity=30,         # 核心超参数,困惑度30
    learning_rate=200,     # 学习率200(sklearn默认200)
    n_iter=1000,           # 总迭代次数1000(sklearn默认1000)
    early_exaggeration=12, # 早期压缩系数12(sklearn默认12)
    init='pca',            # 初始化方式:PCA初始化(比random更稳定,收敛更快)
    random_state=42,       # 固定随机种子,结果可复现
    verbose=1              # 打印迭代过程
)
Y_tsne = tsne.fit_transform(X_scaled)  # 训练并返回低维结果,shape=(150,2)

模块四:可视化t-SNE降维结果

plt.figure(figsize=(8, 6))  # 设置画布大小
# 按类别绘制散点图
for i, name in enumerate(target_names):
    # 筛选当前类别的样本,绘制散点
    plt.scatter(
        Y_tsne[y == i, 0],  # x轴:t-SNE第一维
        Y_tsne[y == i, 1],  # y轴:t-SNE第二维
        label=name,         # 图例
        s=50,               # 点的大小
        alpha=0.8,          # 点的透明度
        edgecolors='k'      # 点的边框颜色(黑色)
    )
# 添加图表元素
plt.xlabel('t-SNE Dimension 1', fontsize=12)  # x轴标签
plt.ylabel('t-SNE Dimension 2', fontsize=12)  # y轴标签
plt.title('t-SNE Visualization of Iris Dataset (sklearn Implementation)', fontsize=14)  # 标题
plt.legend(fontsize=10)  # 图例
plt.grid(True, alpha=0.3)  # 网格线(透明度0.3)
plt.tight_layout()  # 自动调整布局,避免标签重叠
plt.show()  # 显示图像

(注:sklearn 版代码是方便的,如果要手动的话,大家评论留言。)

运行结果

这张 t-SNE 图清晰地展示了鸢尾花数据集的内在结构:

  • setosa 是一个完全独立的类别,特征差异显著;
  • versicolor 和 virginica 特征相似,存在部分重叠;
  • t-SNE 成功将 4 维高维特征映射到 2 维空间,同时保留了关键的类别结构,是高维数据可视化的有效工具。

三、结语

t-SNE 核心要点

  1. 核心思想:将高维高斯相似性概率与低维 t 分布相似性概率做 KL 散度匹配,保留局部结构;
  2. 核心改进:低维用 t 分布解决拥挤、高维概率对称化简化梯度、早期压缩避免局部最优;
  3. 核心超参数:困惑度取有效近邻数,经验取值 5~50;
  4. 适用场景:高维数据的可视化,如基因数据、图像特征、文本嵌入。

如果有一些概念不清楚的话,大家可以留言。感谢大家的观看,如有不足请大家批评指正。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐