PCA और TruncatedSVD के scikit-learn कार्यान्वयन के बीच अंतर


12

मैं बीजगणितीय / सटीक स्तर पर प्रधान घटक विश्लेषण और एकवचन मूल्य अपघटन के बीच के संबंध को समझता हूं। मेरा प्रश्न स्कोर-लर्न कार्यान्वयन के बारे में है

प्रलेखन कहता है: " [ट्रंचकेटेडएसवीडी] पीसीए के समान है, लेकिन एक कोवरियन मैट्रिक्स के बजाय सीधे नमूना वैक्टर पर संचालित होता है। ", जो दोनों दृष्टिकोणों के बीच बीजीय अंतर को दर्शाएगा। हालाँकि, यह बाद में कहता है: " यह अनुमानक [TruncatedSVD] दो एल्गोरिथ्म का समर्थन करता है: एक तेज यादृच्छिक एसवीडी सॉल्वर, और एक" भोला "एल्गोरिथ्म जो ARPACK का उपयोग आइगेंसोल्वर (X * XT) या (XT * X) के रूप में करता है, जो भी अधिक हो कुशल। ”। पीसीए के बारे में, यह कहता है: "यह प्रोजेक्ट करने के लिए डेटा के एकवचन मूल्य अपघटन का उपयोग करके रैखिक गतिशीलता में कमी ..."। और PCA कार्यान्वयन समान दो एल्गोरिदम (रैंडमाइज्ड और ARPACK) सॉल्वरों को एक और एक, LAPACK का समर्थन करता है। कोड में देखकर मैं देख सकता हूं कि दोनों PCA और TruncatedSVD दोनों में ARPACK और LAPACK नमूना डेटा X पर svd करते हैं, ARPACK विरल मैट्रिसेस (svds का उपयोग करके) से निपटने में सक्षम है।

इसलिए, अलग-अलग विशेषताओं और विधियों से और पीसीए इसके अलावा LAPACK, PCA और TruncatedSVD scikit-learn कार्यान्वयन का उपयोग करके सटीक पूर्ण विलक्षण मूल्य अपघटन कर सकता है जो बिल्कुल एक ही एल्गोरिथ्म लगता है। पहला सवाल: क्या यह सही है?

दूसरा सवाल: भले ही LAPACK और ARPACK उपयोग scipy.linalg.svd (एक्स) और scipy.linalg.svds (एक्स), किया जा रहा है एक्स नमूना मैट्रिक्स, वे विलक्षण मूल्य अपघटन या की eigen-अपघटन गणना या आंतरिक रूप से। जबकि "यादृच्छिक" सॉल्वर को उत्पाद की गणना करने की आवश्यकता नहीं है। (यह संख्यात्मक स्थिरता के संबंध में प्रासंगिक है, देखें कि डेटा के एसवीडी के माध्यम से डेटा का पीसीए क्यों? )। क्या ये सही है?XTXXXT

प्रासंगिक कोड: पीसीए लाइन 415। ट्रंचकेटेड वीडी लाइन 137।


1
आप
seanv507

1
ड्रेक - मुझे लगता है कि मैं आपके साथ पहले Q से सहमत हूं। दूसरे को मत समझिए। आपका क्या मतलब है 'वे एकवचन मान के अपघटन या एक्सटीटी के एक्सजेन-अपघटन की गणना करते हैं' एक्सटीटी 'एक्स या एक्स ∗ एक्सटीएक्स T एक्सटी आंतरिक रूप से' - आपने अभी कोड दिखाया है जहां यह एक्स पर एसवीडी का उपयोग करके किया गया है? - संख्यात्मक मुद्दे पहले कंप्यूटिंग कोवरिएन मैट्रिक्स (इसे सी कहते हैं) को संदर्भित करते हैं, फिर सी के
सिवनी के खोजकर्ता

@ seanv507 द्वितीय प्रश्न के बारे में - मुझे लगता है कि scipy.linalg.svd (X) या / और ईजेन-अपघटन कर svd की गणना करता है । Linalg.svds (X) के लिए समान बात। उद्धरण: "एक तेज यादृच्छिक एसवीडी सॉल्वर, और एक" भोला "एल्गोरिथ्म जो ARPACK का उपयोग एक जिंजर पर (एक्स * एक्सटी) या (एक्सटी * एक्स) के रूप में करता है"। Docs.scipy.org/doc/scipy/reference/generated/… में अंतिम पंक्ति भी देखें । पहला तरीका जो मैं समझ सकता हूं, वह यह है कि रैंडमाइज्ड एल्गोरिथ्म एकमात्र ऐसा है जो सहसंयोजक / ग्राम मैट्रिक्स की गणना नहीं करता हैXTXXXT
ड्रेक

1
मुझे लगता है कि ARPACK दृष्टिकोण का अर्नोल्डी पुनरावृत्ति जैसी किसी चीज़ से लेना-देना है, इसलिए इसे केवल मैट्रिक्स-वेक्टर उत्पादों को करना होगा। (सिद्धांत रूप में इन प्रकार के पुनरावृत्त तरीकों में एक स्पष्ट भी नहीं है , बस दिनचर्या की एक जोड़ी और । यह पीडीई XXtimes()Xt_times()
सॉल्वर्स

@ GeoMatt22 क्या आप अपनी टिप्पणी पर विस्तार से बता सकते हैं? क्या आपका मतलब है कि ARPACK या LAPACK दृष्टिकोण संख्यात्मक अस्थिरताओं से ग्रस्त नहीं हैं क्योंकि उन्हें सहसंयोजक मैट्रिक्स की गणना करने की आवश्यकता नहीं है?
ड्रेक

जवाबों:


13

PCA और TruncatedSVD scikit-learn कार्यान्वयन समान रूप से एल्गोरिथम प्रतीत होते हैं।

नहीं: पीसीए केंद्रित डेटा पर (छोटा-बजाया) SVD है (प्रति-सुविधा माध्य विकल्प द्वारा)। यदि डेटा पहले से ही केंद्रित है, तो वे दो वर्ग भी ऐसा ही करेंगे।

व्यवहार TruncatedSVDमें बड़े विरल डेटासेट पर उपयोगी है जो मेमोरी उपयोग विस्फोट किए बिना केंद्रित नहीं किया जा सकता है।

  • numpy.linalg.svdऔर scipy.linalg.svdदोनों यहाँ वर्णित LAPACK _GESDD पर भरोसा करते हैं: http://www.netlib.org/lapack/lug/node32.html (ड्राइवर को विभाजित और जीतें)

  • scipy.sparse.linalg.svdsXT के एक eigen मूल्य अपघटन करने के लिए ARPACK पर निर्भर करता है। एक्स या एक्स। अर्नोल्डी पुनरावृत्ति विधि के माध्यम से एक्सटी (डेटा के आकार के आधार पर)। ARPACK के HTML उपयोगकर्ता गाइड में एक टूटी हुई प्रारूपण है जो कम्प्यूटेशनल विवरण को छुपाता है लेकिन अर्नोल्डी पुनरावृत्ति को विकिपीडिया पर अच्छी तरह से वर्णित किया गया है: https://en.wikipedia.org/wiki/Arnoldi_iteration

यहाँ स्काइप में ARPACK- आधारित SVD के लिए कोड है:

स्रोत कोड में लाइन परिवर्तन की स्थिति में https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (स्ट्रिंग को "डीफ़ svds" के लिए खोजें) )।


2
एक विरल डेटा का कुशलता से समर्थन कर सकता है (TruncatedSVD), दूसरा नहीं कर सकता (PCA)। यही कारण है कि हमारे पास 2 कक्षाएं हैं।
ऑग्रेसेल

1
यदि यह कारण है, तो मैं भ्रम से बचने के लिए उन्हें SVD और SparseSVD (या समान) कहूंगा।
ड्रेक

2
लेकिन लोग पीसीए चाहते हैं और उन्हें पता नहीं हो सकता है कि पीसीए केवल केंद्रित डेटा पर एसवीडी है।
7

5
@ ड्रेक मैं असहमत हूं कि "प्रक्रियाएं अलग हैं (पीसीए सहसंयोजक मैट्रिक्स का उपयोग करता है और एसवीडी डेटा मैट्रिक्स का उपयोग करता है)"। पीसीए विश्लेषण के प्रकार के लिए एक नाम है। इसे अलग-अलग एल्गोरिदम और कार्यान्वयन के लिए उपयोग किया जा सकता है। कोव मैट्रिक्स का ईआईजी एक विधि है, केंद्रित डेटा मैट्रिक्स का एसवीडी एक और तरीका है, और फिर ईआईजी और एसवीडी विभिन्न तरीकों से भी किया जा सकता है। कोई फर्क नहीं पड़ता - यह सब पीसीए है।
अमीबा

1
@amoeba शब्दावली पर स्पष्टीकरण / सुधार के लिए धन्यवाद। आप क्या कहना बनाता है मेरे लिए और अधिक समझ में, यह देखते हुए कि SVD और ईआईजी बीजीय प्रमेयों / पीसीए से एक व्यापक गुंजाइश के साथ तरीके हैं
ड्रेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.