t-SNE Implementasi Python: Kullback-Leibler divergence


11

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

[1] http://nbviewer.ipython.org/urls/gist.githubusercontent.com/AlexanderFabisch/1a0c648de22eff4a2a3e/raw/59d5bc5ed8f8bfd9ff1f7b095aa97d5a/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

Jawaban:


4

Sumber TSNE di scikit-learn menggunakan Python murni. fit_transform()Metode Fit sebenarnya memanggil _fit()fungsi pribadi yang kemudian memanggil _tsne()fungsi pribadi . Bahwa _tsne()fungsi memiliki variabel lokal erroryang dicetak pada akhir fit. Sepertinya Anda dapat dengan mudah mengubah satu atau dua baris kode sumber untuk mengembalikan nilai tersebut fit_transform().


Pada dasarnya apa yang bisa saya lakukan adalah mengatur self.error = error di akhir _tsne (), untuk mengambilnya dari instance TSNE sesudahnya. Ya, tapi itu berarti mengubah kode sklearn.manifold, dan saya bertanya-tanya apakah pengembang memikirkan beberapa cara lain untuk mendapatkan informasi atau jika tidak mengapa mereka tidak melakukannya (yaitu: apakah 'kesalahan' dianggap tidak berguna oleh mereka?). Selain itu, jika saya mengubah kode itu, saya akan membutuhkan semua orang yang menjalankan kode saya untuk memiliki retasan yang sama pada instalasi sklearn mereka. Apakah itu yang Anda sarankan, atau saya salah?
Joker

Ya, itulah yang saya sarankan sebagai solusi yang memungkinkan. Karena scikit-learn adalah open source, Anda juga bisa mengirimkan solusi Anda sebagai permintaan tarik dan melihat apakah penulis akan memasukkannya dalam rilis mendatang. Saya tidak dapat berbicara mengapa mereka melakukan atau tidak memasukkan berbagai hal.
Trey

2
Terima kasih. Jika ada orang lain yang tertarik dengan ini, github.com/scikit-learn/scikit-learn/pull/3422 .
Joker
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.