使用 Kullback-Leibler 散度比较 t-SNE 解决方案

机器算法验证 数据可视化 降维 特纳
2022-04-13 19:41:00

我正在尝试优化perplexityt-SNE 的参数,以便更好地了解各种数据集的可分离程度。当困惑度保持固定时,t-SNE 解决方案的 Kullback-Leibler 散度在运行之间可直接比较,如作者的常见问题解答中所述:

如果您使用相同的数据和困惑,您可以比较 t-SNE 报告的 Kullback-Leibler 散度。运行 t-SNE 十次完全没问题,选择 KL 散度最低的解

链接在这里

我的问题是直接比较运行之间的 KL 差异但使用不同的困惑是否合适和有用。 然后我会选择具有最低 KL 散度的解决方案

对另一个问题的评论提到:

tSNE 具有理论上的最佳困惑度,可最大限度地减少原始维度和投影维度中数据之间的 KL 散度

比较具有不同困惑度的运行之间的 KL 是否是找到“理论最优困惑度”的好方法?

1个回答

抱歉不行; 通过相应的散度比较困惑参数的最优性不是一种有效的方法。正如我在这个问题中解释的那样:“困惑参数随着用于计算距离/概率的高斯方差单调增加。因此,当你增加整个困惑参数时,你会得到更小的绝对距离和随后的 KL-分歧值。 ”这在Van der Maaten 和 Hinton的 2008 年 JMLR使用 -SNE可视化数据的原始论文中有详细描述。KL(P||Q)Pt

您也可以使用玩具数据集以编程方式轻松查看此内容。例如,假设您想将 -SNE 用于著名的iris数据集,并尝试不同的困惑,例如。分数的经验分布是什么?好吧,我们很懒,所以让计算机为我们完成这项工作并使用几个()不同的起始值运行例程,看看我们得到了什么:(注意:我使用 -SNE的Barnes-Hut 实现(van der Maaten,2014),但行为是相同的。)t10,20,30,40Rtsne50t

library(Rtsne)
REPS =  50; # Number of random starts

per10 <- sapply(1:REPS, function(u) {set.seed(u); 
       Rtsne(iris, perplexity = 10, check_duplicates= FALSE)}, simplify = FALSE)
per20 <- sapply(1:REPS, function(u) {set.seed(u); 
       Rtsne(iris, perplexity = 20, check_duplicates= FALSE)}, simplify = FALSE)
per30 <- sapply(1:REPS, function(u) {set.seed(u); 
       Rtsne(iris, perplexity = 30, check_duplicates= FALSE)}, simplify = FALSE)
per40 <- sapply(1:REPS, function(u) {set.seed(u); 
       Rtsne(iris, perplexity = 40, check_duplicates= FALSE)}, simplify = FALSE)

costs <- c( sapply(per10, function(u) min(u$itercosts)), 
            sapply(per20, function(u) min(u$itercosts)),
            sapply(per30, function(u) min(u$itercosts)), 
            sapply(per40, function(u) min(u$itercosts)))
perplexities <- c( rep(10,REPS), rep(20,REPS), rep(30,REPS), rep(40,REPS))

plot(density(costs[perplexities == 10]), xlim= c(0,0.3), ylim=c(0,250), lwd= 2,
     main='KL scores from difference perplexities on the same dataset'); grid()
lines(density(costs[perplexities == 20]), col='red', lwd= 2); 
lines(density(costs[perplexities == 30]), col='blue', lwd= 2)
lines(density(costs[perplexities == 40]), col='magenta', lwd= 2);
legend('topright', col=c('black','red','blue','magenta'), 
       c('perp.  = 10', 'perp.  = 20', 'perp.  = 30','perp.  = 40'), lwd = 2)

在此处输入图像描述

看图片很明显,根据上面原始论文的阅读,使用分数来选择最佳困惑度不是很有帮助。不过,您仍然可以使用它来选择给定解决方案的最佳运行!KLKL