一、概述
t-SNE(t-Distributed Stochastic Neighbor Embedding,t 分布随机邻域嵌入)是一种将高维的复杂数据降维为二维(或三维)的算法,用于低维空间的可视化。在降维时,t-SNE会将类似结构的数据聚集在一起,这有助于我们理解数据的结构。
下图所示为利用t-SNE将数据从三维空间降维到二维空间的示例。原始数据是三维空间上的两个瑞士卷数据(图a),二者的区别可以从经过降维后显示在二维空间中的图形看出(图b)。
如上所示,t-SNE具有在低维空间巧妙表现多个结构的机制。t-SNE 的特点是在降维时使用了自由度为1的t分布。通过t分布,可以使在高维空间中原本很近的结构在低维空间中变得更近,原本较远的结构变得更远。下面的“算法说明”及其后的内容将对此进行详细介绍。
二、算法说明
t-SNE 算法的步骤如下:
1. 对于所有的组i、j,使用高斯分布来表示xi和xj的相似度。
2. 在低维空间中随机配置与xi
相同数量的点yi,对于所有的组i、j,使用t分布表示yi和yj的相似度。
3. 更新数据点yi,使得步骤1和步骤2中定义的相似度分布尽可能相似。
4. 重复步骤3,直到达到收敛条件。
下面介绍步骤1和步骤2中出现的相似度。相似度是衡量数据点之间的相似程度的概念。它不
是简单地使用数据之间的距离,而是使用如图所示的概率分布来衡量的。
在下图中,横轴是距离,纵轴是相似度。从图中可以看出,数据之间的距离越近,相似度越高;距离越远,相似度越低。我们首先在原来的高维空间中用高斯分布计算相似度,以p(ij)这个分布表示。这个p(ij)表示数据点xi和xj之间的相似度。接下来,在低维空间中随机配置与xi对应的数据点yi。我们也对这个数据点计算表示相似度的q(ij),不过这时使用的是t分布。
在计算出p(ij)和q(ij)之后,我们来更新数据点yi,使q(ij)具有与p(ij)相同的分布,这样就能够以低维空间的yi再现高维空间中各xi的相似度的关系。由于这时在低维空间使用的是t分布,所以可以看到,当再现大的相似度时,数据点在低维空间中配置的距离更近;反之,当再现小的相似度时,数据点在低维空间中配置的距离更远。在将t-SNE应用于前面提到的瑞士卷数据时,数据点yi的更新情况如下图所示。从图中可以看出,随着更新次数的增加,数据点的差异逐渐展现了出来。
“概述”部分提到t-SNE基本上被用于将数据降维到三维或二维的场景。由于t分布是重尾分布,所以在高维空间中,远离中心的区域占主导地位,局部信息将无法保留。因此,有时无法降维到四维或更高维度的空间。
三、示例代码
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
data = load_digits()
n_components = 2 # 设置降维后的维度为2
model = TSNE(n_components=n_components)
print(model.fit_transform(data.data))
四、详细说明
与其他降维算法的比较
下面将t-SNE与其他降维算法进行比较,来研究它的特点。我们使用的数据是如图所示的手写数字。手写数字是8像素×8像素的图像数据,每个图像中的数字是0, 1, 2, …, 9 其中之一。换言之,我们可以认为它是一个包含了10种不同结构的8 × 8(= 64)维空间。
下面使用PCA、LLE和t-SNE这3种算法对手写数字数据进行降维
从图中可以看出,图a中的PCA虽然在一定程度上按数值进行了归类,但每部分依然混杂着不同的数值;图b中的LLE虽然适用于非线性数据,但如果数据集不像瑞士卷数据集那样数据点聚在一起,我们就不能很好地把握其结构;而图c中的t-SNE在二维空间中将数据按值归类,很好地对结构完成了分类。