आंशिक विलयन मूल्य विसंगतियों (एसवीडी) की स्मृति कुशल कार्यान्वयन


10

मॉडल में कमी के लिए, मैं बाएं से जुड़े एकवचन वैक्टर की गणना करना चाहता हूं - 20 का कहना है - मैट्रिक्स सबसे बड़ा एकवचन मान , जहां और । दुर्भाग्य से, मेरी मैट्रिक्स बिना किसी संरचना के घनी होगी। एन ≈ 10 6 कश्मीर ≈ 10 3 एए∈आरएन,कएन≈106क≈103ए

यदि मैं इस आकार के एक यादृच्छिक मैट्रिक्स के लिए पायथन में मॉड्यूल svdसे रूटीन को कॉल करता numpy.linalgहूं, तो मैं एक मेमोरी त्रुटि में चला जाता हूं। यह विघटन लिए के आवंटन के कारण है । ए = वी एस यूवी∈आरएन,एनए=वीएसयू

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

मैं गणना समय और सटीकता में व्यापार करने के लिए तैयार हूं।


1
दिलचस्प है, ऐसा लगता है कि नम्पी को पता नहीं है कि कैसे एक पतली एसवीडी करना है ...
— जेएम

संकेत के लिए धन्यवाद। वास्तव में, numpy.linalg.svd में विकल्प है full_matricesकि गलत पर सेट किया जाए ताकि केवल 'नॉनजरो' भागों की गणना की जा सके। फिर भी, क्या गणना को आगे भी कम करने का एक तरीका है?
— जन

3
numpyबैकएंड fortran कोड, का उपयोग करता है LAPACKE_dgesvdमानक SVD के लिए नियमित। हालाँकि, आमतौर पर आपका मैट्रिक्स C_CONTIGOUS(साथ जांचें matrix.flags) है। इसलिए यह फोरट्रान संरेखण के डेटा की प्रतिलिपि बनाता है। इसके अतिरिक्त लैपैक रूटीन को चलाने के दौरान आपके मैट्रिक्स की एक और कॉपी की जरूरत होती है (या इसके लिए कम से कम मेमोरी)। आप एक प्रति से छुटकारा पा सकते हैं यदि आप सुनिश्चित करें कि स्मृति संरेखण शुरुआत से ही फोरट्रान शैली है।
— बोर्ट

जवाबों:


6

यदि आप केवल कुछ एकवचन मान / वैक्टर चाहते हैं, तो ARPACK को चाल चलनी चाहिए। SVD डॉक्स महान नहीं हैं, और इस वितरण तारीख तक अधिक है।

संपादित करें: यदि आप अजगर में ऐसा करना चाहते हैं, तो SciPy के पास एक आवरण है । चूंकि आपका मैट्रिक्स घना है, आप ब्लॉक स्पर पंक्ति (बीएसआर) प्रारूप को आज़मा सकते हैं ।


मेरे पास एक नज़र होगी, कैसे ARPACK अजगर के साथ एकीकृत करता है ...
— Jan

1
लगता है कि स्कैपी में रैपर हैं। मैं उन्हें शरीर का जवाब देने के लिए जोड़ूंगा।
— मैक्स हचिंसन

2

पर एक नजर डालें sklearn.decomposition.TruncatedSVD में सीखने scikit 0.14-rc।
(मेरा मानना ​​है कि scikit- जानने वाले लोग stackoverflow.com/questions/tagged/scikit-learn का अनुसरण करते हैं , इसलिए मैं वहां विस्तृत प्रश्न पूछूंगा।)

(आपके पास कितनी मेमोरी है? 10 6 + 3 डबल्स पहले से ही 8G है।)6+3


106×103

2

शायद आप यह कोशिश कर सकते हैं।

https://github.com/jakevdp/pypropack

यह PROPACK पैकेज के लिए एक पायथन रैपर है, जो बड़े विरल मैट्रिस और लीनियर ऑपरेटरों के कुशल आंशिक विलयन मूल्य विघटन को लागू करता है।


2

इंटेल MKL नए जैकोबी-एसवीडी एल्गोरिथ्म को लागू करता है। यहाँ कार्यान्वयन विवरण हैं: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

और लेपैक रूटीन: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1-1

कार्य आकार निश्चित रूप से समायोज्य है। आप पायथन से सी फ़ंक्शन को आसानी से साइथन, SWIG या किसी अन्य रैपिंग तंत्र का उपयोग करके कॉल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.