2011-08-22 13 views
5

मैं अपने मैट्रिक्स (3241 x 12596) पर एसवीडी लागू करने की कोशिश कर रहा हूं जो कुछ पाठ प्रसंस्करण (लेटेंट सेमेन्टिक विश्लेषण करने के अंतिम लक्ष्य के साथ) के बाद प्राप्त किया गया था और मुझे यह समझने में असमर्थ है कि यह मेरी 64-बिट मशीन के रूप में क्यों हो रहा है 16 जीबी रैम है। पल svd(self.A) कहा जाता है, यह एक त्रुटि फेंकता है। सटीक त्रुटि नीचे दिया गया हैएसवीडी लागू करने से तुरंत मेमोरी त्रुटि फेंकता है?

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 71, in svd 
    return numpy.linalg.svd(a, full_matrices=0, compute_uv=compute_uv) 
    File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 1317, in svd 
    work = zeros((lwork,), t) 
MemoryError 

इस अपेक्षा की इतनी बड़ी होने के लिए है:

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 81, in svd 
    overwrite_a = overwrite_a) 
MemoryError 

तो मैं

self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 

और इस समय का उपयोग कर की कोशिश की है, यह निम्न त्रुटि फेंकता मैट्रिक्स कि न्यूम्पी संभाल नहीं सकता है और क्या ऐसा कुछ है जो मैं इस चरण में पद्धति को बदलने के बिना कर सकता हूं?

+0

एसवीडी की गणना करने की कोशिश करने वाले बिंदु पर पाइथन कितनी मेमोरी है? क्या आप 32-बिट या 64-बिट पायथन चला रहे हैं? –

+0

@ फ़र्डिनेंड बेयर: यह क्रैश होने पर 380 एमबी का उपयोग कर रहा है। आह! :(मैं 32-बिट पायथन का उपयोग कर रहा हूं। मैं आगे बढ़ूंगा और 64-बिट संस्करण स्थापित करूंगा। – Legend

+0

@ फ़र्डिनेंड बेयर: आप एक असली उद्धारकर्ता हैं! किसी भी तरह से उस बिंदु ने मेरे दिमाग को छोड़ दिया। यह अब पूरी तरह से ठीक काम करता है! बहुत धन्यवाद बहुत – Legend

उत्तर

2

जाहिर है, जैसा कि यह पता चला है, @ फ़र्डिनेंड बेयर के लिए धन्यवाद, मैंने यह नहीं देखा कि मैं अपनी 64-बिट मशीन पर पाइथन के 32-बिट संस्करण का उपयोग कर रहा था।

पायथन के 64-बिट संस्करण का उपयोग करके और सभी पुस्तकालयों को पुनर्स्थापित करने से समस्या हल हो गई।

8

हाँ, scipy.linalg.svd को full_matrices पैरामीटर महत्वपूर्ण है: अपने इनपुट अत्यधिक रैंक की कमी (रैंक अधिकतम 3,241) है, तो आप V के लिए पूरे 12,596 एक्स 12,596 मैट्रिक्स आवंटित करने के लिए नहीं चाहता!

अधिक महत्वपूर्ण बात यह है कि पाठ प्रसंस्करण से आने वाली मैट्रिस बहुत स्पैस हैं। scipy.linalg.svd घना है और छिड़काव एसवीडी की पेशकश नहीं करता है, जिसके परिणामस्वरूप एक) दुखद प्रदर्शन और बी) बहुत बर्बाद स्मृति।

पीपीपीआई से sparseSVD पैकेज पर एक नज़र डालें, जो स्पैस इनपुट पर काम करता है और आप केवल शीर्ष K कारकों के लिए पूछ सकते हैं। या scipy.sparse.linalg.svd आज़माएं, हालांकि यह उतना कुशल नहीं है और केवल scipy के नए संस्करणों में उपलब्ध है।

या, पूरी तरह से किरकिरा विवरण से बचने के लिए, एक पैकेज का उपयोग करें जो आपके लिए कुशल एलएसए पारदर्शी रूप से करता है, जैसे कि gensim

संबंधित मुद्दे