t-SNE Python कार्यान्वयन: कुल्बैक-लीब्लर विचलन


11

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://nbviewer.ipython.org/urls/gist.githubusercontent.com/AlexanderFabisch/1a0c648de22eff4a2a3e/raw/59/5bc5ed8f8bfd9ff1f7fa77dd7bd7bd5b5/5aaaaaaaaa/

[२] http://homepage.tudelft.nl/19j49/t-SNE.html

[३] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call

जवाबों:


4

स्किकिट-लर्न में TSNE स्रोत शुद्ध पायथन में है। फिट fit_transform()विधि वास्तव में एक निजी _fit()फ़ंक्शन को कॉल कर रही है जो फिर एक निजी _tsne()फ़ंक्शन को कॉल करती है । उस _tsne()फ़ंक्शन का एक स्थानीय चर है errorजो फिट के अंत में मुद्रित किया गया है। लगता है कि आप बहुत आसानी से स्रोत कोड की एक या दो पंक्तियों को बदल सकते हैं ताकि मान वापस आ जाए fit_transform()


अनिवार्य रूप से मैं क्या कर सकता है कि _tsne = त्रुटि को _tsne () के अंत में सेट करें, ताकि बाद में TSNE उदाहरण से इसे पुनः प्राप्त किया जा सके। हां, लेकिन इसका मतलब होगा कि स्केलेरन.मान कोड को बदलना, और मैं सोच रहा था कि क्या डेवलपर्स ने जानकारी प्राप्त करने के कुछ अन्य तरीकों के बारे में सोचा था या नहीं तो उन्होंने ऐसा क्यों नहीं किया (यानी: 'त्रुटि' उनके द्वारा बेकार माना गया है?)। इसके अलावा, अगर मैंने उस कोड को बदल दिया, तो मुझे अपने कोड चलाने वाले सभी लोगों को अपने स्केलेर इंस्टॉलेशन पर समान हैक करने की आवश्यकता होगी। क्या आप जो सुझाव देते हैं, क्या वह गलत है?
जोकर

हां, यही मैंने एक संभावित समाधान के रूप में सुझाया है। चूंकि स्किकिट-लर्न ओपन सोर्स है, आप अपने समाधान को एक पुल अनुरोध के रूप में भी प्रस्तुत कर सकते हैं और देखें कि क्या लेखक भविष्य के रिलीज में इसे शामिल करेंगे। मैं नहीं बोल सकता कि उन्होंने क्यों किया या विभिन्न चीजों को शामिल नहीं किया।
ट्रे

2
धन्यवाद। यदि कोई अन्य व्यक्ति इसमें रुचि रखता है, तो github.com/scikit-learn/scikit-learn/pull/3422
जोकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.