TSNE-数据可视化降维
项目地址:https://github.com/wchstrife/Information-Visualization-and-Visual-Analytics.git
一、运行
python tsne.py
二、算法原理
2.1 SNE原理
SNE即stochastic neighbor embedding,其基本思想为在高维空间相似的数据点,映射到低维空间距离也是相似的。SNE把这种距离关系转换为一种条件概率来表示相似性。
假设高维空间中有 , 两个点, 表示中心为 时,是其近邻点的概率: 越靠近 其值越大,反之概率就越小。采用高斯分布,公式如下:
对于不同的中心,其对应的高斯分布的方差也不同,需要对每个点进行计算。
同样对于高维空间的点, 映射为低维空间对应的点为, ,其概率分布函数如下。在这里为了方便计算,假设所有点的都为
为了让高维空间的点映射到低维空间后,尽可能保持一样的分布,即原来离得近的点还离得近,离得远的点还离得远,所以要保证两个分布尽可能相似,这里用的衡量的方法就是采用KL(Kullback-Leibler Divergence)距离。
现在问题转化了如何让上面的代价函数C最小。经典方法就是梯度下降法。
在进行梯度更新时,要注意Cost Function并不是一个凸函数,所以会存在很多的局部最优解,为了防止陷于局部最优解,还需要加上一个“动量”,可以冲出局部最优解。
其中表示t次迭代的结果,是学习率,表示第t次迭代时的动量。
此时还剩下一个问题没有解决:如何为不同的选择合适的。这里提出叫做困惑度(perplexity)的概念,来表示附近的有效近邻点的个数,通常取5-50之间。
给定困惑度之后,使用二分搜索寻找一个最合适的。
但是需要注意一点时,KL距离具有不对称性。
- 越大,越小时,此时的Cost越高。即高维空间的点越接近,映射到低维空间时反而越远,此时的惩罚是很大的,这是正确的情况。
- 越小,越大时,此时的Cost越小。即高维空间的点距离远时,映射到低维空间的点接近时,此时的惩罚却很小,这时跟我们想要的结果正好相反。
因此SNE倾向于保留局部特征,即让高维离得近的点尽可能在低维时聚在一起,但是不考虑不同类间的间隔,直观理解为:整个降维后的图像会比较“拥挤”。
2.2 t-SNE原理
t-SNE是在SNE的基础上进行了以下两点改进:
- 使用对称SNE,简化梯度公式
- 低维空间使用t分布取代高斯分布
我们先看改进1,将非对称的SNE改为对称的SNE。
在之前的条件分布概率中,是不对称的,例如高维空间中是不等于的,这与我们的直觉不符合,因为无论是还是谁作为中心点,其出现在对方附近的概率应该是相等的,所以我们应该设计一个联合概率分布,使得.
于是在高维、低维空间中,我们重新定义一下概率分布,注意除号下面部分与之前的区别:
对于高维空间中的点,为了避免异常值的影响,采取以下方法定义高维空间的联合分布:
此时KL距离组成的损失函数如下:
梯度为:
下面继续看t-SNE的第二个改进:低维空间用t分布替换高斯分布。这样做的好处是在低维的情况下,将同类的数据的距离减少,不同类间的距离拉大,这样可视化的效果会更好。
所以低维空间上的分布函数如下:
此时梯度如下:
三、算法实现
输入的数据为MNIST数据集中,抽取的2500条数据,每一条数据是784维,所以输入的规模为2500*784。
为了降低TSNE执行的复杂度,在进行TSNE之前,先通过PCA对数据进行降维,减少参数量,简化TSNE计算,否则实际的执行时间过长。
算法伪代码如下:
input data set X = {x1, x2, ..., xn}
input perplexity Perp
input iterations T, learning rate n, momentum a(t)
begin
compute p_{j|i} with perplexity Perp
compute P_{ij}
initial y(0) = {y1, y2, ..., yn}
for t = 1 to T
compute q_{ij}
compute gradient
update y(t)
end
end
四、实验结果
五、参考文献
- Van der Maaten L, Hinton G. Visualizing data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(2579-2605): 85.