十几年前的降维可视化算法有这么好的效果?还得是Hinton。带你不使用任何现成库手敲t-SNE。

问题描述

依据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} pji:输入的条件概率;
  • p i j p_{ij} pij:输入的联合概率;
  • q j ∣ i q_{j\vert i} qji:输出的条件概率;
  • 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} pji=kexp(xkxi2/(2σi2))exp(xjxi2/(2σi2))i=j(1)
p i ∣ i p_{i\vert i} pii定义成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 qji=kexp(ykyi2)exp(yjyi2)i=j
同样地,我们将 q i ∣ i q_{i\vert i} qii定义成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=ijpjilog2qjipji

K-L散度描述了两个分布之间的相似程度,当其值越小时两个分布则越相似。

K-L散度的一大特点是对于

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值