t-SNE, जैसा कि [1] में है, कुल्लबैक-लीब्लर (KL) विचलन को उत्तरोत्तर कम करके काम करता है, जब तक कि एक निश्चित स्थिति पूरी नहीं हो जाती। T-SNE के निर्माता विज़ुअलाइज़ेशन के लिए प्रदर्शन मानदंड के रूप में KL विचलन का उपयोग करने का सुझाव देते हैं:
आप K -back-Leibler divergences की तुलना t-SNE रिपोर्ट कर सकते हैं। टी-एसएनई को दस बार चलाना पूरी तरह से ठीक है, और सबसे कम केएल विचलन के साथ समाधान का चयन करें [2]
मैंने टी-एसएनई के दो कार्यान्वयनों की कोशिश की:
- अजगर : sklearn.manifold.TSNE ()।
- आर : tsne, लाइब्रेरी से (tsne)।
ये दोनों कार्यान्वयन, जब वाचालता सेट हो जाती है, तो प्रत्येक पुनरावृत्ति के लिए त्रुटि (कुल्बैक-लीब्लर विचलन) प्रिंट करें। हालांकि, वे उपयोगकर्ता को यह जानकारी प्राप्त करने की अनुमति नहीं देते हैं, जो मुझे थोड़ा अजीब लगता है।
उदाहरण के लिए, कोड:
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)
पैदा करता है:
[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
अब, जहां तक मैं समझता हूं, 0.270186 केएल विचलन होना चाहिए। हालाँकि मुझे यह जानकारी नहीं मिल सकती है, न तो मॉडल से और न ही टी से (जो एक साधारण संख्या है। भंडार)।
इस समस्या को हल करने के लिए मैं: i) मेरे स्वयं के द्वारा केएल विचलन की गणना कर सकता हूं, ii) TSNE को कैप्चर करने और पार्स करने के लिए अजगर में कुछ बुरा करें () फ़ंक्शन का आउटपुट [3]। हालांकि: i) केएल डायवर्जेंस की फिर से गणना करने के लिए काफी बेवकूफ होगा, जब TSNE () ने पहले ही इसकी गणना की है, ii) कोड के संदर्भ में थोड़ा असामान्य होगा।
क्या आपके पास कोई अन्य सुझाव है? क्या इस लाइब्रेरी का उपयोग करके यह जानकारी प्राप्त करने का कोई मानक तरीका है?
मैंने उल्लेख किया है कि मैंने आर के tsne पुस्तकालय की कोशिश की , लेकिन मैं पायथन स्केलेर कार्यान्वयन पर ध्यान केंद्रित करने के जवाब पसंद करूंगा ।
संदर्भ
[२] http://homepage.tudelft.nl/19j49/t-SNE.html
[३] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call