t-SNE(t-stochastic neighourhood embedding) 数据降维及可视化

算法原理

t-SNE 的基本思想是将高维数据映射到低维空间,同时保留数据间的局部结构。具体而言,给定一个高维数据集 X = { x 1 , … , x n } \mathbf{X}=\{\mathbf{x}_1,\dots,\mathbf{x}_n\} X={x1,,xn},其中 x i ∈ R D \mathbf{x}_i\in\mathbb{R}^D xiRD,要将其映射到一个 d d d 维的空间 Y = { y 1 , … , y n } \mathbf{Y}=\{\mathbf{y}_1,\dots,\mathbf{y}_n\} Y={y1,,yn},其中 y i ∈ R d \mathbf{y}_i\in\mathbb{R}^d yiRd,且 d ≪ D d\ll D dD

与其他降维算法不同的是,t-SNE 旨在保持数据点之间的局部相似性,即将高维空间中距离接近的点映射到低维空间中距离仍然较近的位置。为了实现这个目标,t-SNE 建立了一个概率模型,用于将数据点从高维空间映射到低维空间。具体地,它假设在高维空间中距离接近的点在低维空间中也有更大的概率被选择为临近点。

在 t-SNE 中,每个高维数据点 x i \mathbf{x}_i xi 对应一个在低维空间中的概率分布 q i q_{i} qi,用于描述 x i \mathbf{x}_i xi 在低维空间中的位置。与此同时,为了保留其局部结构,还需要为每个 x i \mathbf{x}_i xi 建立一个概率分布 p i p_{i} pi,用于描述 x i \mathbf{x}_i xi 与其它数据点之间的相似性。在 t-SNE 中,用采用的是高斯分布,即

p i , j = p ( x i ∣ x j ) ∑ k ≠ i p ( x i ∣ x k ) , p_{i,j} = \frac{p(\mathbf{x}_i|\mathbf{x}_j)}{\sum_{k\neq i}p(\mathbf{x}_i|\mathbf{x}_k)}, pi,j=k=ip(xixk)p(xixj),

其中 p ( x i ∣ x j ) p(\mathbf{x}_i|\mathbf{x}_j) p(xixj) 表示在高维空间中, x i \mathbf{x}_i xi 在以 x j \mathbf{x}_j xj 为中心的局部高斯分布中出现的概率密度。它的定义为:

p ( x i ∣ x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 / ( 2 σ j 2 ) ) ∑ k ≠ j exp ⁡ ( − ∥ x i − x k ∥ 2 / ( 2 σ j 2 ) ) p(\mathbf{x}_i|\mathbf{x}_j) = \frac{\exp(-\|\mathbf{x}_i-\mathbf{x}_j\|^2/(2\sigma_j^2))}{\sum_{k\neq j}\exp(-\|\mathbf{x}_i-\mathbf{x}_k\|^2/(2\sigma_j^2))} p(xixj)=k=jexp(xixk2/(2σj2))exp(xixj2/(2σj2))

其中 σ j \sigma_j σj 是一个尺度参数,用于控制局部邻域的大小。

同样地,我们也需要定义一个低维空间中的概率分布 q i , j q_{i,j} qi,j。在 t-SNE 中,这个概率分布是由一个类似于 softmax 的归一化因子给出的,形式为:

q i , j = ( 1 + ∥ y i − y j ∥ 2 ) − 1 ∑ k ≠ l ( 1 + ∥ y k − y l ∥ 2 ) − 1 q_{i,j}=\frac{(1+\|\mathbf{y}_i-\mathbf{y}_j\|^2)^{-1}}{\sum_{k\neq l}(1+\|\mathbf{y}_k-\mathbf{y}_l\|^2)^{-1}} qi,j=k=l(1+ykyl2)1(1+yiyj2)1

其中 ( 1 + ∥ y i − y j ∥ 2 ) − 1 (1+\|\mathbf{y}_i-\mathbf{y}_j\|^2)^{-1} (1+yiyj2)1 可以解释成一个 t-分布。

t-SNE 的目标函数定义为两个概率分布之间的 KL 散度,即

KL ⁡ ( P ∣ ∣ Q ) = ∑ i ∑ j p i , j log ⁡ p i , j q i , j \operatorname{KL}(P||Q)=\sum_i\sum_j p_{i,j}\log\frac{p_{i,j}}{q_{i,j}} KL(P∣∣Q)=ijpi,jlogqi,jpi,j

为了最小化 KL 散度,可以采用梯度下降法来求解。因为 KL 散度没有解析解,所以梯度需要通过自动微分或其他数值方法进行计算。

t-SNE 的基本思想是在高维数据空间和低维嵌入空间中分别构建高斯分布和 t-分布,在两个空间中寻找相同的邻居,并最小化两个概率分布之间的差异。

示例一

生成一批符合高斯分布的高维样本,把它们降到二维来可视化。这些高斯分布的样本符合以下三个特征:

  1. 所有的数据点分别属于三个类别,
  2. 每一个样本点是三维的,
  3. 第一类样本均值为(0,0,0), 第二类均值为(1,1,0),第三类均值为(-1,1,1)
from sklearn.datasets import make_blobs
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np

# 生成三个高斯分布,每个高斯分布包含100个样本点
X, y = make_blobs(n_samples=300, centers=[[0, 0, 0], [1, 1, 0], [-1, 1, 1]], cluster_std=0.2)

# 初始化 t-SNE 模型,设置降维后的维度为 2 维
tsne = TSNE(n_components=2)

# 对数据进行降维
X_tsne = tsne.fit_transform(X)

# 将三个类别的数据点分别提取出来
class_1 = X_tsne[y == 0]
class_2 = X_tsne[y == 1]
class_3 = X_tsne[y == 2]

# 可视化结果
plt.scatter(class_1[:, 0], class_1[:, 1], label='class 1')
plt.scatter(class_2[:, 0], class_2[:, 1], label='class 2')
plt.scatter(class_3[:, 0], class_3[:, 1], label='class 3')
plt.legend()
plt.show()

在这里插入图片描述

示例二

把MINIST直接展开可视化

from sklearn.manifold import TSNE
from sklearn.datasets import fetch_openml
import matplotlib.pyplot as plt

# 获取 MNIST 数据集
mnist = fetch_openml('mnist_784')

# 取前1000张图片和对应的标签作为数据进行处理
X = mnist.data[:1000]
y = mnist.target[:1000]

# 初始化 t-SNE 模型,设置降维后的维度为 2 维
tsne = TSNE(n_components=2)

# 对数据进行降维
X_tsne = tsne.fit_transform(X)

# 绘制结果
plt.figure(figsize=(10, 10))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y.astype(int), cmap='jet')
plt.colorbar()
plt.show()

在这里插入图片描述
从图中可以看出来直接把MNIST展平然后压缩到二维可视化数据还是有一定的分布规律。

参考资料:

[1] van der Maaten, L.J.P., Postma, E.O. and van den Herik, H.J., 2009. Dimensionality reduction: A comparative review. Journal of Machine Learning Research, 10, pp.66-71.

[2] Maaten, L.v.d. and Hinton, G., 2008. Visualizing data using t-SNE. Journal of machine learning research, 9(Nov), pp.2579-2605.
[3]https://distill.pub/2016/misread-tsne
[4]https://scikit-learn.org/stable/auto_examples/manifold/plot_t_sne_perplexity.html

<think>好的,我需要帮助用户了解t-SNE可视化的实现方法和案例。首先,我需要回忆t-SNE的基本概念,确保自己理解正确。根据用户提供的引用内容,t-SNE是由Laurens van der Maaten和Geoffrey Hinton在2008年提出的非线性技术,适合高数据可视化,特别是保留局部结构[^3]。接下来,用户可能需要具体的步骤和代码示例,所以我要整理出一个清晰的实现流程。 首先,我应该考虑使用Python的sklearn库中的TSNE类,因为这是常用的实现方式。需要确保用户安装必要的库,如scikit-learn和matplotlib。然后,数据预处理是关键步骤,包括加载数据(比如MNIST数据集)、标准化处理。接着是配置t-SNE参数,如n_components设置为2,因为通常是二可视化,调整perplexity和learning_rate等参数,这些参数会影响效果。 然后,应用fit_transform方法进行,得到二数据。之后,用matplotlib绘制散点图,可能需要根据数据标签着色以显示不同类别。在代码示例中,需要注意正确导入库、处理数据、拟合模型和可视化步骤。同时,要提到参数调整的重要性,比如perplexity过高或过低可能导致的问题,以及迭代次数n_iter的影响。 用户还可能关心结果解读,比如点之间的距离表示相似性,以及t-SNE的局限性,如计算成本高和不能处理新样本的问题,需要引用提供的资料[^1]。此外,可以提及优化方法,如使用Barnes-Hut近似加速计算,或结合其他技术。 最后,生成相关问题时要围绕t-SNE的实现细节、参数调优、与其他方法的比较以及应用场景展开。需要确保问题覆盖用户可能进一步探索的方向,帮助其深入理解。整个过程中要注意使用正确的中文表达,避免术语错误,并按照要求使用LaTeX格式的数学公式,比如在解释t-SNE的目标函数时使用$$...$$,但根据用户提供的示例,可能不需要复杂的公式,所以可能暂时不涉及,除非必要。 总结步骤:安装库、数据准备、模型配置、可视化、结果分析。每个步骤给出代码和解释,同时引用相关资料说明优缺点和注意事项。</think>### t-SNE可视化实现方法及示例 #### 1. 实现步骤 1. **安装依赖库** 使用Python的`scikit-learn`和`matplotlib`库: ```bash pip install scikit-learn matplotlib ``` 2. **数据准备** 以经典的MNIST手写数字数据集为例: ```python from sklearn import datasets digits = datasets.load_digits() X = digits.data # 高数据(64) y = digits.target # 标签 ``` 3. **配置t-SNE参数** ```python from sklearn.manifold import TSNE tsne = TSNE( n_components=2, # 到2 perplexity=30, # 控制局部与全局结构的平衡,通常取5~50 learning_rate=200, random_state=42 ) X_tsne = tsne.fit_transform(X) ``` 4. **可视化结果** ```python import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', alpha=0.6) plt.colorbar() plt.title("t-SNE Visualization of MNIST Dataset") plt.show() ``` ![示例图:MNIST的t-SNE结果](https://via.placeholder.com/400x300/EFEFEF/000?text=t-SNE+Visualization) *每个点的颜色对应手写数字的标签,相似样本在二空间中更接近[^2]。* --- #### 2. 关键参数说明 - **`perplexity`**:影响局部结构的敏感度,值过小会导致局部簇分裂,过大可能忽略细节。 - **`learning_rate`**:通常取100~1000,过高可能导致散点发散,过低会收敛缓慢。 - **`n_iter`**:迭代次数(默认1000),复杂数据集需增加迭代次数。 --- #### 3. 局限性及优化 - **局限性**:计算复杂度高($O(n^2)$),无法直接处理新样本。 - **优化方法**: - 使用`Barnes-Hut`近似算法(设置`method='barnes_hut'`),将复杂度低至$O(n \log n)$。 - 先通过PCA(如至50),再应用t-SNE,提升效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值