t-SNE, seperti pada [1], bekerja dengan secara progresif mengurangi divergensi Kullback-Leibler (KL), sampai kondisi tertentu terpenuhi. Pembuat t-SNE menyarankan untuk menggunakan KL divergence sebagai kriteria kinerja untuk visualisasi:
Anda dapat membandingkan divergensi Kullback-Leibler yang dilaporkan oleh t-SNE. Sangat baik untuk menjalankan t-SNE sepuluh kali, dan pilih solusi dengan divergensi KL terendah [2]
Saya mencoba dua implementasi t-SNE:
- python : sklearn.manifold.TSNE ().
- R : tsne, dari library (tsne).
Kedua implementasi ini, ketika verbosity diatur, mencetak kesalahan (Kullback-Leibler divergence) untuk setiap iterasi. Namun, mereka tidak mengizinkan pengguna untuk mendapatkan informasi ini, yang terlihat agak aneh bagi saya.
Misalnya, kode:
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)
menghasilkan:
[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
Sekarang, sejauh yang saya mengerti, 0,270186 harus menjadi divergensi KL. Namun saya tidak bisa mendapatkan informasi ini, baik dari model maupun dari t (yang merupakan numpy.ndarray sederhana).
Untuk mengatasi masalah ini, saya dapat: i) Menghitung divergence KL sendiri, ii) Melakukan sesuatu yang tidak menyenangkan dengan python untuk menangkap dan mem-parsing output fungsi TSNE () [3]. Namun: i) akan sangat bodoh untuk menghitung ulang divergensi KL, ketika TSNE () telah menghitungnya, ii) akan sedikit tidak biasa dalam hal kode.
Apakah Anda punya saran lain? Apakah ada cara standar untuk mendapatkan informasi ini menggunakan perpustakaan ini?
Saya sebutkan saya sudah mencoba perpustakaan tsne R , tapi saya lebih suka jawaban untuk fokus pada implementasi sklearn python .
Referensi
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call