t-SNE(t-distributed Stochastic Neighbor Embedding,t分布随机邻居嵌入)非线性降维

一、t-SNE的背景与目标

1. 什么是降维?

降维是将高维数据(如图像、文本嵌入等)映射到低维空间(如二维或三维),以便于分析、可视化或降低计算复杂度。常见的降维方法包括:

线性方法:如主成分分析(PCA)、线性判别分析(LDA)。
非线性方法:如t-SNE、UMAP、Isomap。

t-SNE特别适合数据可视化,因为它能捕捉数据的局部结构(即高维空间中相似点的邻近关系),并在低维空间中尽可能保留这些关系。

2. t-SNE的目标

t-SNE的目标是将高维空间中的数据点映射到低维空间,使得:

局部结构保留:高维空间中相邻的点在低维空间中仍保持接近。
全局结构次要:t-SNE更关注局部邻居关系,可能会牺牲全局结构(如不同簇之间的相对距离)。
可视化友好:生成二维或三维的可视化结果,直观展示数据的分布和簇结构。

3. t-SNE与PCA的区别

PCA:线性方法,基于方差最大化,适合全局结构保留,但对非线性结构无能为力。
t-SNE:非线性方法,专注于局部结构保留,适合复杂数据的可视化,但不适合直接用于特征提取或回归任务。


二、t-SNE的数学原理

t-SNE的核心思想是将高维空间中点之间的相似性(以概率形式表示)转化为低维空间中的相似性,并通过优化使两者的分布尽可能接近。以下是详细的数学推导。

1. 高维空间中的相似性

t-SNE首先在高维空间中计算数据点之间的相似性,定义为条件概率。

假设有 n n n 个高维数据点 { x 1 , x 2 , … , x n } {x_1, x_2, dots, x_n} {
x1​,x2​,…,xn​},每个点的维度为 D D D。t-SNE的目标是计算点 x i x_i xi​ 和 x j x_j xj​ 的相似性,表示为条件概率 p j ∣ i p_{j|i} pj∣i​:
p j ∣ i = exp ⁡ ( − ∥ x i − x j ∥ 2 / 2 σ i 2 ) ∑ k ≠ i exp ⁡ ( − ∥ x i − x k ∥ 2 / 2 σ i 2 ) p_{j|i} = frac{expleft(-|x_i – x_j|^2 / 2sigma_i^2
ight)}{sum_{k
eq i} expleft(-|x_i – x_k|^2 / 2sigma_i^2
ight)} pj∣i​=∑k=i​exp(−∥xi​−xk​∥2/2σi2​)exp(−∥xi​−xj​∥2/2σi2​)​

含义: p j ∣ i p_{j|i} pj∣i​ 表示在高维空间中,点 x j x_j xj​ 被选为 x i x_i xi​ 的邻居的概率。
高斯核:相似性基于高斯分布,距离越近,概率越高。
σ i sigma_i σi​:每个点 x i x_i xi​ 的高斯分布方差,控制邻域大小。不同点有不同的 σ i sigma_i σi​,通过**困惑度(Perplexity)**确定。

为了使相似性对称,t-SNE定义联合概率:
p i j = p j ∣ i + p i ∣ j 2 n p_{ij} = frac{p_{j|i} + p_{i|j}}{2n} pij​=2npj∣i​+pi∣j​​

对称性:确保 p i j = p j i p_{ij} = p_{ji} pij​=pji​。
归一化: ∑ i , j p i j = 1 sum_{i,j} p_{ij} = 1 ∑i,j​pij​=1。

2. 困惑度(Perplexity)

困惑度是用户指定的超参数,控制高斯核的邻域范围。困惑度定义为:
Perplexity = 2 H ( P i ) ext{Perplexity} = 2^{H(P_i)} Perplexity=2H(Pi​)
其中, H ( P i ) H(P_i) H(Pi​) 是条件概率分布的熵:
H ( P i ) = − ∑ j ≠ i p j ∣ i log ⁡ 2 p j ∣ i H(P_i) = -sum_{j
eq i} p_{j|i} log_2 p_{j|i} H(Pi​)=−∑j=i​pj∣i​log2​pj∣i​

含义:困惑度反映每个点有效邻居的数量,典型值在 5 到 50 之间。
作用:通过二分搜索调整 σ i sigma_i σi​,使每个点的困惑度接近用户指定的值。

3. 低维空间中的相似性

在低维空间中,t-SNE假设映射后的点为 { y 1 , y 2 , … , y n } {y_1, y_2, dots, y_n} {
y1​,y2​,…,yn​},维度通常为 2 或 3。低维空间的相似性使用 t 分布(Student’s t-distribution)建模,定义联合概率 q i j q_{ij} qij​:
q i j = ( 1 + ∥ y i − y j ∥ 2 ) − 1 ∑ k ≠ l ( 1 + ∥ y k − y l ∥ 2 ) − 1 q_{ij} = frac{left(1 + |y_i – y_j|^2
ight)^{-1}}{sum_{k
eq l} left(1 + |y_k – y_l|^2
ight)^{-1}} qij​=∑k=l​(1+∥yk​−yl​∥2)−1(1+∥yi​−yj​∥2)−1​

t 分布:相比高斯分布,t 分布具有更重的尾部(heavy-tailed),能更好地处理低维空间中点之间的距离。
归一化: ∑ i , j q i j = 1 sum_{i,j} q_{ij} = 1 ∑i,j​qij​=1。

4. 优化目标

t-SNE的目标是最小化高维空间相似性分布 P P P 和低维空间相似性分布 Q Q Q 之间的差异,使用 Kullback-Leibler 散度(KL 散度)
C = KL ( P ∣ ∣ Q ) = ∑ i ≠ j p i j log ⁡ p i j q i j C = ext{KL}(P || Q) = sum_{i
eq j} p_{ij} log frac{p_{ij}}{q_{ij}} C=KL(P∣∣Q)=∑i=j​pij​logqij​pij​​

含义:KL 散度衡量两个概率分布的差异,最小化 C C C 使 Q Q Q 尽可能接近 P P P。
优化方法:使用梯度下降法优化 y i y_i yi​ 的位置。

5. 梯度更新

优化过程中,t-SNE通过梯度下降更新低维空间中的点 y i y_i yi​。梯度为:
∂ C ∂ y i = 4 ∑ j ( p i j − q i j ) q i j Z ( y i − y j ) frac{partial C}{partial y_i} = 4 sum_j (p_{ij} – q_{ij}) q_{ij} Z (y_i – y_j) ∂yi​∂C​=4∑j​(pij​−qij​)qij​Z(yi​−yj​)
其中, Z = ∑ k ≠ l ( 1 + ∥ y k − y l ∥ 2 ) − 1 Z = sum_{k
eq l} left(1 + |y_k – y_l|^2
ight)^{-1} Z=∑k=l​(1+∥yk​−yl​∥2)−1 是归一化因子。

更新公式为:
y i ( t + 1 ) = y i ( t ) − η ∂ C ∂ y i + momentum y_i^{(t+1)} = y_i^{(t)} – eta frac{partial C}{partial y_i} + ext{momentum} yi(t+1)​=yi(t)​−η∂yi​∂C​+momentum

η eta η:学习率。
动量项:加速梯度下降,防止陷入局部最优。


三、t-SNE算法步骤

t-SNE的完整算法流程如下:

输入

高维数据 X = { x 1 , x 2 , … , x n } X = {x_1, x_2, dots, x_n} X={
x1​,x2​,…,xn​}。
困惑度(Perplexity)。
输出维度(通常为 2 或 3)。
迭代次数和学习率。

计算高维相似性

计算每对点之间的欧几里得距离。
根据困惑度,通过二分搜索确定每个点的 σ i sigma_i σi​。
计算条件概率 p j ∣ i p_{j|i} pj∣i​,并得到对称的联合概率 p i j p_{ij} pij​。

初始化低维嵌入

随机初始化低维点 y i y_i yi​(通常从正态分布 N ( 0 , 1 0 − 4 ) N(0, 10^{-4}) N(0,10−4) 采样)。

优化

计算低维空间的相似性 q i j q_{ij} qij​。
计算 KL 散度并通过梯度下降更新 y i y_i yi​。
使用动量和早期夸张(early exaggeration)等技巧加速收敛。

输出

低维嵌入 Y = { y 1 , y 2 , … , y n } Y = {y_1, y_2, dots, y_n} Y={
y1​,y2​,…,yn​},用于可视化。

优化技巧

早期夸张(Early Exaggeration):在早期迭代中,将 p i j p_{ij} pij​ 乘以一个常数(如 4),以增强簇的形成。
Barnes-Hut 近似:对于大规模数据集,t-SNE使用 Barnes-Hut 树算法近似计算梯度,降低计算复杂度从 O ( n 2 ) O(n^2) O(n2) 到 O ( n log ⁡ n ) O(n log n) O(nlogn)。


四、t-SNE的优缺点

1. 优点

局部结构保留:t-SNE擅长捕捉高维数据的局部邻居关系,适合可视化复杂数据集(如图像、文本)。
非线性降维:能处理非线性结构,优于 PCA 等线性方法。
可视化效果好:生成的二维/三维图直观,簇结构清晰,常用于探索性分析。

2. 缺点

计算复杂度高:标准 t-SNE 的时间复杂度为 O ( n 2 ) O(n^2) O(n2),对大规模数据较慢(Barnes-Hut 近似可缓解)。
全局结构丢失:t-SNE更关注局部结构,簇之间的相对距离可能不准确。
超参数敏感:困惑度、学习率等超参数对结果影响较大,需反复调参。
不可用于新数据:t-SNE是一个非参数方法,无法直接将新数据点映射到低维空间。
随机性:初始化和优化过程中的随机性可能导致不同运行结果略有差异。


五、t-SNE的应用场景

t-SNE广泛应用于以下领域:

机器学习与数据分析

可视化高维特征(如神经网络的嵌入、词向量)。
探索数据集的簇结构,帮助发现潜在模式。

计算机视觉

可视化图像数据集(如 MNIST、CIFAR-10)的高维特征。
分析卷积神经网络的中间层表示。

自然语言处理

可视化词嵌入(如 Word2Vec、GloVe)或句嵌入。
分析文本数据的语义分布。

生物信息学

可视化基因表达数据,识别细胞类型或疾病亚型。

其他领域

社交网络分析、推荐系统等高维数据的可视化。

示例

在 MNIST 数据集(手写数字)上运行 t-SNE,可以将 784 维的图像像素映射到二维空间,生成清晰的数字簇(如所有“0”聚在一起,所有“1”聚在一起)。


六、t-SNE的注意事项与调参建议

预处理数据

标准化:对数据进行标准化(如零均值、单位方差),避免特征尺度差异影响距离计算。
降维预处理:对于极高维数据,先用 PCA 将维度降到 50 左右,再运行 t-SNE,以提高效率和稳定性。

选择困惑度

困惑度决定邻域大小,常用值在 5 到 50。
小数据集:选择较小的困惑度(如 5-20)。
大数据集:选择较大的困惑度(如 30-50)。
多次尝试不同困惑度,观察可视化效果。

学习率

学习率过高可能导致优化不稳定,过低则收敛缓慢。
常用值在 10 到 1000,建议从 200 开始调整。

迭代次数

通常需要 500-1000 次迭代以确保收敛。
使用早期夸张后,前 100 次迭代对簇形成至关重要。

结果解释

不要过分解读簇间距离,t-SNE不保证全局结构的准确性。
多次运行 t-SNE,检查结果的稳定性。

避免误解

t-SNE仅用于可视化,不适合特征提取或下游任务。
不同困惑度或随机初始化的结果可能不同,需综合分析。


七、t-SNE的改进与替代方法

1. 改进版本

Barnes-Hut t-SNE:通过树结构近似计算梯度,适合大规模数据集。
FIt-SNE:使用快速傅里叶变换进一步加速 t-SNE。
Parametric t-SNE:引入神经网络学习映射函数,支持新数据点的映射。

2. 替代方法

UMAP(Uniform Manifold Approximation and Projection)

比 t-SNE更快,保留更多全局结构。
支持新数据的映射,适合大规模数据集。

PCA:适用于线性结构,计算效率高。
Autoencoders:神经网络降维方法,可用于特征提取和可视化。
Isomap:基于测地距离的非线性降维方法。


八、代码示例(Python + scikit-learn)

以下是一个使用 scikit-learn 实现 t-SNE 的简单示例,基于 MNIST 数据集:

import numpy as np
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# 加载 MNIST 数据
digits = load_digits()
X = digits.data  # 1797 个样本,64 维特征
y = digits.target  # 标签(0-9)

# 运行 t-SNE
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X)

# 可视化
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', s=50)
plt.colorbar(scatter)
plt.title('t-SNE 可视化 MNIST 手写数字')
plt.xlabel('t-SNE 成分 1')
plt.ylabel('t-SNE 成分 2')
plt.show()

输出:一个二维散点图,显示 MNIST 数据集中不同数字的簇。


九、总结

t-SNE 是一种强大的非线性降维工具,特别适合高维数据的可视化。其核心是通过最小化 KL 散度,将高维空间的局部相似性映射到低维空间。尽管计算复杂度较高且对超参数敏感,t-SNE 在机器学习、计算机视觉和自然语言处理等领域仍有广泛应用。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容