t-SNE Python实现:Kullback-Leibler分歧


11

如[1]中所述,t-SNE的工作方式是逐渐减小Kullback-Leibler(KL)散度,直到满足特定条件为止。t-SNE的创建者建议使用KL散度作为可视化的性能标准:

您可以比较t-SNE报告的Kullback-Leibler差异。十次运行t-SNE并选择KL散度最低的解决方案是非常好的[2]

我尝试了t-SNE的两种实现:

  • python:sklearn.manifold.TSNE()。
  • R:tsne,来自库(tsne)。

这两种实现都在设置详细程度后为每次迭代输出错误(Kullback-Leibler散度)。但是,它们不允许用户获取此信息,这对我来说有点奇怪。

例如,代码:

import numpy as np
from sklearn.manifold import TSNE
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
model = TSNE(n_components=2, verbose=2, n_iter=200)
t = model.fit_transform(X)

产生:

[t-SNE] Computing pairwise distances...
[t-SNE] Computed conditional probabilities for sample 4 / 4
[t-SNE] Mean sigma: 1125899906842624.000000
[t-SNE] Iteration 10: error = 6.7213750, gradient norm = 0.0012028
[t-SNE] Iteration 20: error = 6.7192064, gradient norm = 0.0012062
[t-SNE] Iteration 30: error = 6.7178683, gradient norm = 0.0012114
...
[t-SNE] Error after 200 iterations: 0.270186

现在,据我所知,0.270186应该是吉隆坡的背离。但是我无法从模型t(这是一个简单的numpy.ndarray)中获取此信息。

为了解决这个问题,我可以:i)自己计算KL散度,ii)在python中做一些令人讨厌的事情,以捕获和解析TSNE()函数的输出[3]。但是:i)重新计算KL散度是非常愚蠢的,当TSNE()已经计算出它时,ii)在代码方面会有点不寻常。

您还有其他建议吗?是否有使用此库获取此信息的标准方法?

我提到我尝试过R的tsne库,但是我更希望答案集中在python sklearn实现上。


参考文献

[1] http://nbviewer.ipython.org/urls/gist.githubusercontent.com/AlexanderFabisch/1a0c648de22eff4a2a3e/raw/59d5bc5ed8f8bfd9ff1f7faa749d1b095aa97d5a/t-SNE.ipynb

[2] http://homepage.tudelft.nl/19j49/t-SNE.html

[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call

Answers:


4

scikit-learn中的TSNE源使用纯Python。Fit fit_transform()方法实际上是在调用一个私有_fit()函数,然后再调用一个私有_tsne()函数。该_tsne()函数具有局部变量error,该局部变量在拟合结束时打印出来。似乎您可以轻松地更改一两行源代码以将该值返回给fit_transform()


本质上,我可以做的是在_tsne()的末尾设置self.error = error,以便随后从TSNE实例中检索它。是的,但这意味着更改sklearn.manifold代码,我想知道开发人员是否想过一些其他方式来获取信息,或者是否不这样做(即:他们认为“错误”没有用?)。此外,如果我更改了该代码,我将需要所有运行我的代码的人对其sklearn安装进行相同的破解。那是您的建议,还是我弄错了?
小丑

是的,这就是我建议的一种可能的解决方案。由于scikit-learn是开源的,因此您还可以将解决方案作为请求请求提交,并查看作者是否会在将来的版本中包括该解决方案。我不能说为什么他们包括或不包括各种东西。
Trey

2
谢谢。如果有人对此感兴趣,请访问github.com/scikit-learn/scikit-learn/pull/3422
小丑
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.