t-SNE reduziert wie in [1] schrittweise die Kullback-Leibler (KL) -Divergenz, bis eine bestimmte Bedingung erfüllt ist. Die Entwickler von t-SNE schlagen vor, die KL-Divergenz als Leistungskriterium für die Visualisierungen zu verwenden:
Sie können die von t-SNE gemeldeten Kullback-Leibler-Divergenzen vergleichen. Es ist vollkommen in Ordnung, t-SNE zehnmal auszuführen und die Lösung mit der geringsten KL-Divergenz auszuwählen [2].
Ich habe zwei Implementierungen von t-SNE ausprobiert:
- Python : sklearn.manifold.TSNE ().
- R : tsne, aus der Bibliothek (tsne).
Beide Implementierungen drucken bei eingestellter Ausführlichkeit den Fehler (Kullback-Leibler-Divergenz) für jede Iteration. Sie erlauben dem Benutzer jedoch nicht, diese Informationen abzurufen, was für mich etwas seltsam aussieht.
Zum Beispiel der Code:
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)
produziert:
[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
Soweit ich weiß, sollte 0,270186 die KL-Divergenz sein. Allerdings kann ich diese Informationen weder vom Modell noch von t (was eine einfache numpy.ndarray ist) erhalten.
Um dieses Problem zu lösen, könnte ich: i) die KL-Divergenz selbst berechnen, ii) etwas Böses in Python tun, um die Ausgabe der TSNE () -Funktion zu erfassen und zu analysieren [3]. Allerdings: i) wäre es ziemlich dumm, die KL-Divergenz neu zu berechnen, wenn TSNE () sie bereits berechnet hat, ii) wäre in Bezug auf den Code etwas ungewöhnlich.
Hast du noch einen anderen Vorschlag? Gibt es eine Standardmethode, um diese Informationen mithilfe dieser Bibliothek abzurufen?
Ich erwähnte , habe ich versucht , R ‚s tsne Bibliothek, aber ich würde es vorziehen , die Antworten auf die konzentrieren Python sklearn Implementierung.
Verweise
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call