t-SNE, như trong [1], hoạt động bằng cách giảm dần phân kỳ Kullback-Leibler (KL), cho đến khi một điều kiện nhất định được đáp ứng. Những người tạo ra t-SNE đề nghị sử dụng phân kỳ KL làm tiêu chí hiệu suất cho các hình ảnh trực quan:
bạn có thể so sánh các phân kỳ Kullback-Leibler mà t-SNE báo cáo. Hoàn toàn ổn khi chạy t-SNE mười lần và chọn giải pháp có độ phân kỳ KL thấp nhất [2]
Tôi đã thử hai triển khai của t-SNE:
- trăn : sklearn.manifold.TSNE ().
- R : tsne, từ thư viện (tsne).
Cả hai triển khai này, khi độ dài được đặt, in lỗi (phân kỳ Kullback-Leibler) cho mỗi lần lặp. Tuy nhiên, họ không cho phép người dùng nhận thông tin này, điều này có vẻ hơi lạ đối với tôi.
Ví dụ: mã:
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)
sản xuất:
[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
Bây giờ, theo tôi hiểu, 0,270186 phải là phân kỳ KL. Tuy nhiên tôi không thể có được thông tin này, từ mô hình cũng như từ t (đó là một numpy.ndarray đơn giản).
Để giải quyết vấn đề này, tôi có thể: i) Tự tính toán phân kỳ KL, ii) Làm điều gì đó khó chịu trong python để chụp và phân tích đầu ra của hàm TSNE () [3]. Tuy nhiên: i) sẽ khá ngu ngốc khi tính lại phân kỳ KL, khi TSNE () đã tính toán nó, ii) sẽ hơi bất thường về mặt mã.
Bạn có đề nghị nào khác không? Có một cách tiêu chuẩn để có được thông tin này bằng thư viện này?
Tôi đã đề cập rằng tôi đã thử thư viện tsne của R , nhưng tôi thích các câu trả lời tập trung vào việc thực hiện sklearn python .
Người giới thiệu
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-feft-call