降低维度的目的是更好刻画组内的相似性和组间的差异性。 t-SNE 相比其他算法优势之处是其内核的距离函数。

距离指标,主要是计算样本间的相似性(similarity),分为

  1. Minkowski family of distances \(d = (\sum|P_i-Q_i|^p)^{\frac{1}{p}}\)
    1. Manhattan distance (order 1)
    2. Euclidean distance (order 2): \(d = (\sum(P_i-Q_i)^2)^{\frac{1}{p}}\)
    3. 切比雪夫 Chebyshev distance (order \(\in \infty\))
  2. Kullback-Leibler (KL) divergence
    1. 衡量两个分布的差异程度
      1. 常用于 t-SNE
    2. 使用philentropy包,比较难安装

Minkowski 簇函数的三个必要条件

  1. Triangle inequality: \(d(x, z) \leq d(x, y) + d(y, z)\)
  2. Symmetric property: \(d(x, y) = d(y, x)\)
  3. Non-negativity and identity: $d(x, y) ≥ 0 and \(d(x, y) = 0\) only if \(x = y\)

以下我们将对

  1. Euclidean distance
  2. KL divergence

进行对比。

Euclidean distance

dist是专门求距离的。 mnist_sample[195:200 ,-1]去掉首列。

load("adv-datacamp/datasets/mnist-sample-200.RData")
distance <- dist(mnist_sample[195:200 ,-1])
distance
##          195      196      197      198      199
## 196 2582.812                                    
## 197 2549.652 2520.634                           
## 198 1823.275 2286.126 2498.119                  
## 199 2537.907 2064.515 2317.869 2304.517         
## 200 2362.112 2539.937 2756.149 2379.478 2593.528
heatmap(
    as.matrix(distance)
    ,Rowv = NA, symm = T
    ,labRow = mnist_sample$label[195:200]
    ,labCol = mnist_sample$label[195:200])

我们会发现,同为“8”,相关性并不高,因此尝试 Kullback-Leibler (KL) divergence。

KL divergence

library(philentropy)
mnist_6 <- mnist_sample[195:200, -1]
mnist_6 <- mnist_6 + 1 
sums <- rowSums(mnist_6)
distance <- distance(mnist_6/sums, method = "kullback-leibler")
## Metric: 'kullback-leibler' using unit: 'log'.
heatmap(
    as.matrix(distance)
    ,Rowv = NA, symm = T
    ,labRow = mnist_sample$label[195:200]
    ,labCol = mnist_sample$label[195:200])

我们会发现 KL divergence 表达的相关性中,“8”之间的相关性明显提高。 因此这就是为什么 t-SNE 作为降低维度的方式好,因为其能够更好的捕捉样本之间的相似性,从而进行更有效的分群。