1.案例介绍

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性的降维算法,常用于可视化高维数据。它可以将高维数据映射为低维空间,同时保持数据间的局部关系。在本案例中,我们将使用t-SNE算法对一个手写数字数据集进行降维和可视化分析。

2.算法原理

t-SNE算法基于概率模型,通过最小化高维空间和低维空间间的Kullback-Leibler散度来实现降维。

给定一个高维数据集$X = \{x_1, x_2, …, x_N\}$,其中$x_i \in R^D$,目标是将其映射到一个低维空间$Y = \{y_1, y_2, …, y_N\}$,其中$y_i \in R^d$,并保留数据点之间的局部关系。

t-SNE使用两个条件概率分布来描述相似性:

– 在高维空间中,对于数据点$i$和$j$,定义条件概率$p_{ij}$表示样本$i$选择样本$j$为邻居的概率,一般使用高斯分布计算:$p_{ij} = \frac{\exp(-||x_i-x_j||^2 / (2\sigma_i^2))}{\sum_{k \neq i}\exp(-||x_i-x_k||^2 / (2\sigma_i^2))}$,其中$\sigma_i$是控制数据点$i$周围邻域大小的参数。

– 在低维空间中,对于映射后的数据点$i$和$j$,定义条件概率$q_{ij}$表示样本$i$选择样本$j$为邻居的概率,一般使用t-分布计算:$q_{ij} = \frac{(1 + ||y_i-y_j||^2)^{-1}}{\sum_{k \neq l}(1 + ||y_k-y_l||^2)^{-1}}$。

通过最小化$p_{ij}$和$q_{ij}$之间的Kullback-Leibler散度来更新低维数据的位置,并得到最终的映射结果。

 

3.公式推导

高维空间中的条件概率$p_{ij}$:

$$p_{ij} = \frac{\exp(-||x_i-x_j||^2 / (2\sigma_i^2))}{\sum_{k \neq i}\exp(-||x_i-x_k||^2 / (2\sigma_i^2))}$$

低维空间中的条件概率$q_{ij}$:

$$q_{ij} = \frac{(1 + ||y_i-y_j||^2)^{-1}}{\sum_{k \neq l}(1 + ||y_k-y_l||^2)^{-1}}$$

Kullback-Leibler散度的计算:

$$KL(P||Q) = \sum_{i}\sum_{j} p_{ij} \log{\frac{p_{ij}}{q_{ij}}}$$

梯度计算:

$$\frac{\partial KL(P||Q)}{\partial y_i} = 2\sum_{j}(p_{ij} – q_{ij} + p_{ji} – q_{ji})(y_i – y_j)(1 + ||y_i – y_j||^2)^{-1}$$

4.数据集

使用手写数字数据集MNIST,该数据集包含60000张28×28的灰度图片作为训练集,以及10000张图片作为测试集。我们将使用其中的1000张图片进行演示。

5.计算步骤

1. 加载数据集,将每张图片展平为一维向量。
2. 初始化低维空间中的数据点位置。
3. 计算高维空间中的条件概率$p_{ij}$。
4. 迭代计算低维空间中的条件概率$q_{ij}$并更新数据点位置,直到满足迭代次数或收敛条件。
5. 绘制降维后的数据点在二维平面的分布可视化图。

6.Python代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from tensorflow.keras.datasets import mnist

# 加载MNIST数据集
(X_train, y_train), (_, _) = mnist.load_data()

# 选择1000个样本进行演示
X_train = X_train[:1000]
y_train = y_train[:1000]

# 将图像展平为一维向量
X_train = X_train.reshape(X_train.shape[0], -1)

# 初始化t-SNE模型
tsne = TSNE(n_components=2, random_state=42)

# 使用t-SNE降维
X_tsne = tsne.fit_transform(X_train)

# 绘制降维结果
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_train, cmap=plt.cm.get_cmap("jet", 10))
plt.colorbar(ticks=range(10))
plt.show()

7.代码细节解释

  • 通过导入numpymatplotlib.pyplot库,我们可以处理数据和绘制图像。
  • sklearn.manifold.TSNE是使用t-SNE算法的类。
  • 使用mnist.load_data加载MNIST数据集,并选择1000个样本进行演示。
  • 将图像展平为一维向量,以便传入t-SNE算法。
  • 初始化t-SNE模型,并设置降维后的维度为2。
  • 使用t-SNE.fit_transform方法进行降维。
  • 最后,使用matplotlib.pyplot.scatter绘制降维结果,其中颜色表示数字的类别。

这样,我们就完成了对手写数字数据集的降维和可视化分析。在图像上,相似的数字会在降维后的空间中聚集在一起,方便我们观察和分析数据的特点。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论(1)

  • Python新手 2024年 4月 16日 上午10:26

    import matplotlib
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_train, cmap=matplotlib.colormaps[‘jet’])
    可解画图时得函数弃用警告