机器学习————t-SNE
t-SNE(t-Distributed Stochastic Neighbor Embedding)是流形学习中经典的非线性降维算法,由 Van der Maaten 和 Hinton 在 2008 年提出,是对传统 SNE(Stochastic Neighbor Embedding)的改进,核心解决了高维数据降维可视化时的拥挤问题,能更好地保留高维数据的局部结构,是高维数据(如特征向量、图像、基因数据)可视化的首选方法之一。
一、t-核心概念
1.t-SNE背景
SNE 的核心思想是将高维空间的欧氏距离转化为条件概率,衡量点的相似性,再让低维空间的条件概率匹配高维,但存在致命问题。
传统 SNE 的三大缺陷:
- 拥挤问题:高维中不同簇的点在低维会被压缩到一起,无法区分;
- 概率不对称:高维条件概率
,导致梯度更新复杂、收敛慢;
- 优化困难:损失函数非凸,易陷入局部最优。
2.t-SNE 核心思想
t-SNE 的核心是概率分布匹配:
- 在高维空间中,用高斯分布计算任意两点的对称联合概率
,概率越大表示两点在高维越相似;
- 在低维空间中,用自由度为 1 的学生 t 分布计算任意两点的对称联合概率
,同样概率越大表示低维相似性越高;
- 通过梯度下降最小化高维分布P和低维分布Q的KL 散度,用来衡量两个概率分布的差异,让低维分布尽可能还原高维分布的相似性结构。
核心改进亮点:
- 低维用t 分布:解决拥挤问题,允许低维空间中距离较远的点保留一定相似性,避免高维小距离被过度压缩;
- 高维概率对称化:将条件概率转化为联合概率
,简化梯度计算;
- 引入早期压缩(Early Exaggeration):优化前期放大高维相似性,让低维簇更容易分离,解决局部最优问题。
3.t-SNE 关键术语
(1)困惑度
t-SNE 中最重要的超参数,定义为:
;
其中H(Pi),是高维条件概率Pi的香农熵。
物理含义:衡量每个样本点的有效近邻数,困惑度越大,每个点考虑的近邻越多,更关注全局结构;困惑度越小,更关注局部结构。
- 经验取值:5~50(常用 10、20、30),数据集越大可适当增大;
- 关键特性:每个样本点的σi高斯分布方差由困惑度确定,通过二分查找求解,保证所有点的困惑度接近设定值。
(2)高斯分布
用于量化高维空间的相似性:两点距离越近,高斯分布的概率密度越大,对应的相似性概率pj∣i越高。
- 每个样本点有专属方差σi:因为不同点的局部密度不同,密集区域σi小,稀疏区域σi大,保证局部结构的合理性。
(3)自由度 1 的学生 t 分布
t 分布的概率密度函数为:
;
当自由度ν=1时,t 分布退化为柯西分布,具有重尾特性,尾部概率比高斯分布大得多:
- 低维中两点距离稍远时,t 分布仍能保留一定的相似性概率,避免高维簇在低维拥挤;
- t 分布是对称的,天然满足
,简化计算。
(4)KL 散度
又称相对熵,用于衡量两个概率分布的非对称差异,是 t-SNE 的损失函数。
(5)早期压缩
t-SNE 的优化技巧:在梯度下降的前几百次迭代中,将高维联合概率乘以一个系数,放大高维的相似性,让低维空间中原本相似的点更易聚集形成簇,避免优化陷入局部最优;迭代后期恢复原始
,精细优化簇内结构。
二、代码解释
模块一:导入核心库
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 核心要点
- 核心思想:将高维高斯相似性概率与低维 t 分布相似性概率做 KL 散度匹配,保留局部结构;
- 核心改进:低维用 t 分布解决拥挤、高维概率对称化简化梯度、早期压缩避免局部最优;
- 核心超参数:困惑度取有效近邻数,经验取值 5~50;
- 适用场景:高维数据的可视化,如基因数据、图像特征、文本嵌入。
如果有一些概念不清楚的话,大家可以留言。感谢大家的观看,如有不足请大家批评指正。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)