第二章: 机器学习与神经网络概述
第二部分:降维算法理论与实践
第四节:t-SNE算法
内容:高维数据可视化,参数调整与算法收敛性
一、什么是 t-SNE?
t-SNE 是一种非线性降维算法,特别适用于高维数据的可视化(如 2D/3D)。它通过建模样本之间的相似概率,在低维空间中保留高维邻近结构。
适用场景包括:
-
高维嵌入空间(如图像、文本、词向量);
-
聚类结果的可视化;
-
深度学习模型中间层特征可视化。
二、算法原理概述
高维空间中
-
对任意两个样本
,计算其条件概率
,表示在高维空间中
是
的“邻居”的概率;
-
相似度基于高斯分布,考虑局部密度。
低维空间中
-
映射后的点为
,相似度
使用学生 t 分布(自由度为 1)建模;
-
学生 t 分布具有“重尾”性质,能更好分离密集和稀疏区域。
优化目标
最小化 KL 散度:
通过梯度下降不断调整低维表示,使 拟合
。
三、核心参数
参数 | 含义 |
---|---|
perplexity | 控制“邻居数量”,一般设为 5~50,影响局部 vs 全局关系 |
learning_rate | 学习率,常设为 100~1000,太小收敛慢,太大会震荡 |
n_iter | 迭代次数,至少 1000~2000 |
metric | 距离度量(默认欧氏),也可选择曼哈顿/余弦等 |
random_state | 保证结果可重复 |
四、Python 实现示例
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
# 加载手写数字数据
digits = load_digits()
X = digits.data
y = digits.target
# t-SNE 降维
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X)
# 可视化
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', s=10)
plt.legend(*scatter.legend_elements(), title="Digits", loc="best", fontsize=8)
plt.title("t-SNE 可视化手写数字数据")
plt.xlabel("t-SNE 1")
plt.ylabel("t-SNE 2")
plt.grid(True)
plt.tight_layout()
plt.show()
五、注意事项与限制
-
t-SNE 仅用于可视化,不适合后续建模;
-
不保留全局结构,不同运行结果可能变化(需设定
random_state
); -
计算复杂度高,大数据集需使用 Barnes-Hut 加速(
method='barnes_hut'
)。
六、与其他降维方法对比
方法 | 线性/非线性 | 是否保留全局结构 | 可用于建模 | 可视化效果 |
---|---|---|---|---|
PCA | 线性 | ✅ | ✅ | 中等 |
LDA | 线性+监督 | ✅ | ✅ | 好 |
MDS | 可非线性 | ✅ | ✅ | 中等 |
t-SNE | 非线性 | ❌(只保留局部) | ❌ | 极佳 |
七、总结
-
t-SNE 是可视化高维数据结构的强大工具;
-
适合揭示复杂模式、类簇和局部结构;
-
合理设置参数(尤其是
perplexity
和n_iter
)对结果影响显著; -
只用于探索性分析和图形展示,不能作为特征工程手段使用。