t-SNE, jak w [1], działa poprzez stopniowe zmniejszanie dywergencji Kullbacka-Leiblera (KL), aż do spełnienia pewnego warunku. Twórcy t-SNE sugerują wykorzystanie dywergencji KL jako kryterium wydajności dla wizualizacji:
można porównać rozbieżności Kullbacka-Leiblera zgłoszone przez t-SNE. Dziesięć razy można uruchomić t-SNE i wybrać rozwiązanie o najniższej dywergencji KL [2]
Próbowałem dwóch implementacji t-SNE:
- python : sklearn.manifold.TSNE ().
- R : tsne, z biblioteki (tsne).
Obie te implementacje, po ustawieniu gadatliwości, drukują błąd (rozbieżność Kullbacka-Leiblera) dla każdej iteracji. Jednak nie pozwalają użytkownikowi uzyskać tych informacji, co wydaje mi się nieco dziwne.
Na przykład kod:
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)
produkuje:
[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
O ile rozumiem, 0.270186 powinno być dywergencją KL. Jednak nie mogę uzyskać tych informacji, ani z modelu, ani z t (co jest prostym numpy.ndarray).
Aby rozwiązać ten problem, mogę: i) Wyliczyć rozbieżność KL samodzielnie, ii) Zrobić coś paskudnego w pythonie do przechwytywania i analizowania danych wyjściowych funkcji TSNE () [3]. Jednak: i) byłoby głupotą, aby ponownie obliczyć rozbieżność KL, gdy TSNE () już ją obliczyła, ii) byłoby trochę nietypowe pod względem kodu.
Czy masz jakieś inne sugestie? Czy istnieje standardowy sposób na uzyskanie tych informacji przy użyciu tej biblioteki?
Wspomniałem, że wypróbowałem bibliotekę tsne R , ale wolę, aby odpowiedzi koncentrowały się na implementacji sklearn w Pythonie .
Bibliografia
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call