问题描述
依据Visualizing Data using t-SNE实现t-SNE
算法,并对MNIST
或者Olivetti
数据集进行可视化训练。
有以下几点要求:
- 不能使用现成的
t-SNE
库,例如sklearn
等; - 可以使用支持矩阵、向量操作的库实现,例如
numpy
; - 将数据降低至二维,同一类型的数据使用同一种颜色绘制散点图。
符号介绍
- x i x_i xi:第 i i i个原始数据;
- y i y_i yi:第 i i i个输出数据;
- p j ∣ i p_{j\vert i} pj∣i:输入的条件概率;
- p i j p_{ij} pij:输入的联合概率;
- q j ∣ i q_{j\vert i} qj∣i:输出的条件概率;
- q i j q_{ij} qij:输出的联合概率;
SNE算法介绍
在SNE
算法中使用高斯分布作为输入的条件分布,其条件概率定义如下:
p j ∣ i = e x p ( − ∥ x j − x i ∥ 2 / ( 2 σ i 2 ) ) ∑ k e x p ( − ∥ x k − x i ∥ 2 / ( 2 σ i 2 ) ) i ≠ j \begin{equation} p_{j\vert i} = \frac{exp(-\parallel x_j - x_i\parallel^2 / (2\sigma_i^2))}{\sum_{k} exp(-\parallel x_k - x_i\parallel^2 / (2\sigma_i^2))}\quad i\ne j \tag{1} \end{equation} pj∣i=∑kexp(−∥xk−xi∥2/(2σi2))exp(−∥xj−xi∥2/(2σi2))i=j(1)
p i ∣ i p_{i\vert i} pi∣i定义成0
,在 ( 1 ) (1) (1)的公式中,两个向量越相似(欧式距离越近)则条件概率值越大。
SNE
算法中同样对低维分布进行了定义,同样选择高斯分布作为其分布,不同的是由于低维分布是经过训练得出的,我们可以事先规定其方差为1
使训练过程中拟合到方差为1
的结果,这样能够一定程度上简化计算,其条件概率定义如下:
q j ∣ i = e x p ( − ∥ y j − y i ∥ 2 ) ∑ k e x p ( − ∥ y k − y i ∥ 2 ) i ≠ j q_{j\vert i} = \frac{exp(-\parallel y_j - y_i\parallel^2)}{\sum_{k} exp(-\parallel y_k - y_i\parallel^2)}\quad i\ne j qj∣i=∑kexp(−∥yk−yi∥2)exp(−∥yj−yi∥2)i=j
同样地,我们将 q i ∣ i q_{i\vert i} qi∣i定义成0
。
SNE
需要做的就是尽可能是这两个分布相似以达到相似的数据映射到低维时依然相似,而K-L
散度可以描述两个分布的相似程度,因此SNE
通过K-L
散度作为其损失函数进行训练:
C = ∑ i ∑ j p j ∣ i l o g 2 p j ∣ i q j ∣ i C=\sum_i\sum_j p_{j\vert i} log_2 \frac{p_{j\vert i}}{q_{j\vert i}} C=i∑j∑pj∣ilog2qj∣ipj∣i
K-L
散度描述了两个分布之间的相似程度,当其值越小时两个分布则越相似。
K-L
散度的一大特点是对于