t-SNE Pythonの実装:Kullback-Leibler divergence


11

[1]の場合と同様に、t-SNEは、特定の条件が満たされるまで、カルバックライブラー(KL)の発散を徐々に減らします。t-SNEの作成者は、KLダイバージェンスを視覚化のパフォーマンス基準として使用することを提案しています。

t-SNEが報告するカルバックライブラー分岐を比較できます。t-SNEを10回実行し、KLダイバージェンスが最も低いソリューションを選択することは完全に問題ありません[2]

私はt-SNEの2つの実装を試しました:

  • python:sklearn.manifold.TSNE()。
  • R:tsne、library(tsne)から。

これらの実装はどちらも、冗長性が設定されている場合、反復ごとにエラー(カルバックライブラーダイバージェンス)を出力します。ただし、ユーザーがこの情報を取得することを許可していないため、私には少し奇妙に見えます。

たとえば、コード:

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はKLダイバージェンスになるはずです。ただし、この情報は、モデルからもtからも取得できません(単純なnumpy.ndarrayです)。

この問題を解決するために、私は次のことができます:i)自分でKLの相違を計算します。ただし、TSNE()がすでにそれを計算している場合、i)KL発散を再計算するのはかなり愚かです。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

回答:


4

scikit-learnのTSNEソースは、純粋なPythonです。Fit fit_transform()メソッドは実際にはプライベート_fit()関数を呼び出し、次にプライベート関数を呼び出し_tsne()ます。その_tsne()関数にはerror、フィットの最後に出力されるローカル変数があります。ソースコードの1行または2行を簡単に変更して、その値をに返すことができるようですfit_transform()


基本的に、私ができることは、後でTSNEインスタンスから取得するために、_tsne()の最後にself.error = errorを設定することです。はい、しかしそれはsklearn.manifoldコードを変更することを意味します、そして私は開発者が情報を取得する他のいくつかの方法を考えたのか、なぜそうしなかったのか疑問に思っていました(つまり、「エラー」は役に立たないと見なされていますか?)。さらに、そのコードを変更した場合、私のコードを実行しているすべての人がsklearnインストールで同じハッキングを行う必要があります。それはあなたが提案することですか、それとも私はそれを間違っていましたか?
ジョーカー2014

はい、それは私が可能な解決策として提案したものです。scikit-learnはオープンソースであるため、ソリューションをプルリクエストとして送信し、作成者が将来のリリースにそれを含めるかどうかを確認することもできます。なぜ彼らが様々なことをしたのか、含まなかったのか、私には言えません。
Trey

2
ありがとう。他の誰かがこれに興味があるなら、github.com/scikit-learn/scikit-learn/pull/3422
ジョーカー2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.