t-SNE, come in [1], agisce riducendo progressivamente la divergenza di Kullback-Leibler (KL), fino a quando non viene soddisfatta una certa condizione. I creatori di t-SNE suggeriscono di usare la divergenza di KL come criterio di prestazione per le visualizzazioni:
puoi confrontare le divergenze di Kullback-Leibler riportate da t-SNE. Va benissimo eseguire t-SNE dieci volte e selezionare la soluzione con la divergenza di KL più bassa [2]
Ho provato due implementazioni di t-SNE:
- pitone : sklearn.manifold.TSNE ().
- R : tsne, dalla biblioteca (tsne).
Entrambe queste implementazioni, quando è impostata la verbosità, stampano l'errore (divergenza di Kullback-Leibler) per ogni iterazione. Tuttavia, non consentono all'utente di ottenere queste informazioni, il che mi sembra un po 'strano.
Ad esempio, il codice:
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)
produce:
[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
Ora, per quanto ho capito, 0.270186 dovrebbe essere la divergenza di KL. Tuttavia non riesco a ottenere queste informazioni, né dal modello né da t (che è un semplice numpy.ndarray).
Per risolvere questo problema ho potuto: i) Calcolare la divergenza di KL per me stesso, ii) Fare qualcosa di brutto in Python per catturare e analizzare l'output della funzione TSNE () [3]. Tuttavia: i) sarebbe abbastanza stupido ricalcolare la divergenza di KL, quando TSNE () l'ha già calcolata, ii) sarebbe un po 'insolito in termini di codice.
Hai qualche altro suggerimento? Esiste un modo standard per ottenere queste informazioni utilizzando questa libreria?
Ho detto di aver provato la libreria tsne di R , ma preferirei che le risposte si concentrassero sull'implementazione di Python Sklearn.
Riferimenti
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call