TSNE-数据可视化降维

项目地址:https://github.com/wchstrife/Information-Visualization-and-Visual-Analytics.git

一、运行

python tsne.py

二、算法原理

2.1 SNE原理

SNE即stochastic neighbor embedding,其基本思想为在高维空间相似的数据点,映射到低维空间距离也是相似的。SNE把这种距离关系转换为一种条件概率来表示相似性。

假设高维空间中有 python TdxTradeApi y用法 python t-sne_T-SNE, python TdxTradeApi y用法 python t-sne_github_02 两个点,python TdxTradeApi y用法 python t-sne_算法原理_03 表示中心为 python TdxTradeApi y用法 python t-sne_T-SNE 时,python TdxTradeApi y用法 python t-sne_github_02是其近邻点的概率:python TdxTradeApi y用法 python t-sne_github_02 越靠近 python TdxTradeApi y用法 python t-sne_T-SNE其值越大,反之概率就越小。python TdxTradeApi y用法 python t-sne_算法原理_03采用高斯分布,公式如下:

python TdxTradeApi y用法 python t-sne_github_09

对于不同的中心python TdxTradeApi y用法 python t-sne_T-SNE,其对应的高斯分布的方差python TdxTradeApi y用法 python t-sne_python_11也不同,需要对每个点进行计算。

同样对于高维空间的点python TdxTradeApi y用法 python t-sne_T-SNE, python TdxTradeApi y用法 python t-sne_github_02映射为低维空间对应的点为python TdxTradeApi y用法 python t-sne_T-SNE_14, python TdxTradeApi y用法 python t-sne_github_15,其概率分布函数python TdxTradeApi y用法 python t-sne_T-SNE_16如下。在这里为了方便计算,假设所有点的python TdxTradeApi y用法 python t-sne_python_11都为python TdxTradeApi y用法 python t-sne_python_18

python TdxTradeApi y用法 python t-sne_T-SNE_19

为了让高维空间的点映射到低维空间后,尽可能保持一样的分布,即原来离得近的点还离得近,离得远的点还离得远,所以要保证两个分布尽可能相似,这里用的衡量的方法就是采用KL(Kullback-Leibler Divergence)距离。

python TdxTradeApi y用法 python t-sne_T-SNE_20

现在问题转化了如何让上面的代价函数C最小。经典方法就是梯度下降法

python TdxTradeApi y用法 python t-sne_github_21

在进行梯度更新时,要注意Cost Function并不是一个凸函数,所以会存在很多的局部最优解,为了防止陷于局部最优解,还需要加上一个“动量”,可以冲出局部最优解。

python TdxTradeApi y用法 python t-sne_python_22

其中python TdxTradeApi y用法 python t-sne_python_23表示t次迭代的结果,python TdxTradeApi y用法 python t-sne_算法原理_24是学习率,python TdxTradeApi y用法 python t-sne_T-SNE_25表示第t次迭代时的动量。

此时还剩下一个问题没有解决:如何为不同的python TdxTradeApi y用法 python t-sne_T-SNE选择合适的python TdxTradeApi y用法 python t-sne_python_11。这里提出叫做困惑度(perplexity)的概念,来表示python TdxTradeApi y用法 python t-sne_T-SNE附近的有效近邻点的个数,通常取5-50之间。

python TdxTradeApi y用法 python t-sne_python_29

python TdxTradeApi y用法 python t-sne_github_30

给定困惑度之后,使用二分搜索寻找一个最合适的python TdxTradeApi y用法 python t-sne_python_11

但是需要注意一点时,KL距离具有不对称性

  1. python TdxTradeApi y用法 python t-sne_T-SNE_32越大,python TdxTradeApi y用法 python t-sne_T-SNE_33越小时,此时的Cost越高。即高维空间的点越接近,映射到低维空间时反而越远,此时的惩罚是很大的,这是正确的情况。
  2. python TdxTradeApi y用法 python t-sne_T-SNE_32越小,python TdxTradeApi y用法 python t-sne_T-SNE_33越大时,此时的Cost越小。即高维空间的点距离远时,映射到低维空间的点接近时,此时的惩罚却很小,这时跟我们想要的结果正好相反。

因此SNE倾向于保留局部特征,即让高维离得近的点尽可能在低维时聚在一起,但是不考虑不同类间的间隔,直观理解为:整个降维后的图像会比较“拥挤”。

2.2 t-SNE原理

t-SNE是在SNE的基础上进行了以下两点改进:

  • 使用对称SNE,简化梯度公式
  • 低维空间使用t分布取代高斯分布

我们先看改进1,将非对称的SNE改为对称的SNE。

在之前的条件分布概率中,是不对称的,例如高维空间中python TdxTradeApi y用法 python t-sne_python_36是不等于python TdxTradeApi y用法 python t-sne_算法原理_03的,这与我们的直觉不符合,因为无论是python TdxTradeApi y用法 python t-sne_T-SNE还是python TdxTradeApi y用法 python t-sne_github_02谁作为中心点,其出现在对方附近的概率应该是相等的,所以我们应该设计一个联合概率分布,使得python TdxTradeApi y用法 python t-sne_github_40.

于是在高维、低维空间中,我们重新定义一下概率分布,注意除号下面部分与之前的区别:

python TdxTradeApi y用法 python t-sne_github_41

python TdxTradeApi y用法 python t-sne_python_42

对于高维空间中的点,为了避免异常值的影响,采取以下方法定义高维空间的联合分布:

python TdxTradeApi y用法 python t-sne_github_43

此时KL距离组成的损失函数如下:

python TdxTradeApi y用法 python t-sne_github_44

梯度为:

python TdxTradeApi y用法 python t-sne_github_45

下面继续看t-SNE的第二个改进:低维空间用t分布替换高斯分布。这样做的好处是在低维的情况下,将同类的数据的距离减少,不同类间的距离拉大,这样可视化的效果会更好。

所以低维空间上的分布函数如下:

python TdxTradeApi y用法 python t-sne_python_46

此时梯度如下:

python TdxTradeApi y用法 python t-sne_python_47

三、算法实现

输入的数据为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

四、实验结果

python TdxTradeApi y用法 python t-sne_T-SNE_48

五、参考文献

  1. Van der Maaten L, Hinton G. Visualizing data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(2579-2605): 85.