2011-07-13 15 views
35

वर्तमान में नौकरी का उपयोग कर रहा हूँ जो नौकरी करता है। लेकिन, जैसा कि मैं कई हजारों पंक्तियों/स्तंभों के साथ matrices से निपट रहा हूं और बाद में यह आंकड़ा हजारों तक जायेगा, मैं सोच रहा था कि अस्तित्व में कोई पैकेज था या नहीं, जो इस तरह की गणनाओं को तेजी से कर सकता है?पायथन में eigenvalues ​​/ वैक्टर खोजने के लिए सबसे तेज़ तरीका क्या है?

+2

क्या numpy अच्छी तरह से स्केल नहीं करता है? मैंने सोचा कि यह इस तरह की चीजों के लिए बनाया गया था। क्या वे सदिश परिचालनों का पूरा बिंदु नहीं है? – JAB

उत्तर

48
  • ** अगर आपके मा: समानांतर का उपयोग कर MPI में गणना ट्राइक्स स्पैस है, फिर scipy.sparse से एक कन्स्ट्रक्टर का उपयोग करके अपने मैट्रिक्स को तत्काल करें, फिर spicy.sparse.linalg में समरूप eigenvector/eigenvalue विधियों का उपयोग करें। कैसे विरल यह है के अनुपात में छोटा होगा

    • अपने मैट्रिक्स, spicy.sparse निर्माता से बनाया गया,: देखने के एक प्रदर्शन बिंदु से, यह दो फायदे हैं।

    • विरल मैट्रिक्स के लिए eigenvalue/eigenvector methods (eigs, eigsh) एक वैकल्पिक तर्क स्वीकार करते हैं, कश्मीर जो आइजन्वेक्टर/eigenvalue जोड़े आप वापस आ करना चाहते हैं की संख्या है। लगभग हमेशा 99% भिन्नता के लिए खाते की आवश्यकता है, कॉलम की संख्या बहुत कम है, जिसे आप पूर्व पोस्ट सत्यापित कर सकते हैं; दूसरे शब्दों में, आप विधि को बता सकते हैं कि सभी eigenvectors/eigenvalue जोड़े की गणना न करें और (आमतौर पर) भिन्नता के लिए खाते के लिए आवश्यक छोटे सबसेट से परे, यह संभावना है कि आपको बाकी की आवश्यकता नहीं है।

  • में रेखीय बीजगणित लाइब्रेरी का उपयोग SciPy,scipy.linalg, बजाय एक ही नाम के NumPy पुस्तकालय की । इन दो पुस्तकालयों में समान नाम है और उसी विधि नाम का उपयोग करें। फिर भी प्रदर्शन में एक अंतर है। यह अंतर तथ्य यह है कि numpy.linalg अनुरूप LAPACK दिनचर्या पर एक कम वफादार आवरण जो , पोर्टेबिलिटी और सुविधा (यानी के लिए कुछ प्रदर्शन बलिदान NumPy डिजाइन लक्ष्य के साथ पालन करने के लिए है के कारण होता है कि संपूर्ण NumPy लाइब्रेरी फोरट्रान कंपाइलर के बिना बनाया जाना चाहिए)। linalg पर SciPy में दूसरी ओर LAPACK पर एक और अधिक पूरा आवरण है और f2py का उपयोग करता है।

  • आपके उपयोग के मामले के लिए समारोह उचित चयन करें; दूसरे शब्दों में, किसी फ़ंक्शन का उपयोग न करें जो आपको चाहिए उससे ज्यादा करता है। scipy.linalg में eigenvalues ​​की गणना करने के लिए कई फ़ंक्शन हैं; मतभेद बड़े नहीं हैं, हालांकि eigenvalues ​​की गणना करने के लिए फ़ंक्शन की सावधानीपूर्वक पसंद करके, आपको प्रदर्शन को बढ़ावा देना चाहिए। उदाहरण के लिए:

    • scipy.linalg.eig रिटर्न दोनों eigenvalues ​​और eigenvectors
    • scipy.linalg.eigvals, केवल eigenvalues ​​देता है। इसलिए यदि आपको केवल मैट्रिक्स के eigenvalues ​​की आवश्यकता है तो linalg.eig का उपयोग करें, linalg.eigvals का उपयोग करें।
    • यदि आप एक वास्तविक मूल्य वर्ग सममित मैट्रिक्स (अपने पक्षांतरित के बराबर) है तो scipy.linalg.eigsh
  • का उपयोग अपने SciPy का अनुकूलन निर्माण तैयार कर रहा है अपने SciPy निर्माण environement है साइप्री के setup.py स्क्रिप्ट में काफी हद तक किया गया। शायद सबसे महत्वपूर्ण विकल्प प्रदर्शन के लिहाज से किसी भी अनुकूलित LAPACK पुस्तकालयों को पहचानना है जैसे ATLAS या तेजी लाने/vecLib फ्रेमवर्क (ओएस एक्स केवल?) इतना है कि SciPy उन्हें पता लगाने और उनके खिलाफ निर्माण कर सकते हैं। इस समय आपके पास रिग के आधार पर, आपके SciPy को अनुकूलित करने के बाद फिर से इंस्टॉल करने से आपको पर्याप्त प्रदर्शन वृद्धि मिल सकती है। SciPy कोर टीम के अतिरिक्त नोट here हैं।

क्या ये कार्य बड़े matrices के लिए काम करेंगे?

मुझे ऐसा सोचना चाहिए। ये औद्योगिक ताकत मैट्रिक्स अपघटन विधियां हैं, और जो समान फोरट्रान LAPACK दिनचर्या पर पतले रैपर हैं।

मैंने लैटिन लाइब्रेरी में मैट्रिस को विघटित करने के लिए अधिकांश विधियों का उपयोग किया है जिसमें कॉलम की संख्या आमतौर पर लगभग 5 और 50 के बीच होती है, और जिसमें पंक्तियों की संख्या आमतौर पर 500,000 से अधिक हो जाती है। न तो एसवीडी और न ही eigenvalue विधियों को इस आकार के मैट्रिक्स को संभालने में कोई समस्या है।

SciPy पुस्तकालय linalg का उपयोग करके आप एक कॉल के साथ, eigenvectors और eigenvalues ​​गणना कर सकते हैं, इस लाइब्रेरी से कई तरीकों में से किसी का उपयोग कर, eig, eigvalsh, और eigh

>>> import numpy as NP 
>>> from scipy import linalg as LA 

>>> A = NP.random.randint(0, 10, 25).reshape(5, 5) 
>>> A 
    array([[9, 5, 4, 3, 7], 
      [3, 3, 2, 9, 7], 
      [6, 5, 3, 4, 0], 
      [7, 3, 5, 5, 5], 
      [2, 5, 4, 7, 8]]) 

>>> e_vals, e_vecs = LA.eig(A) 
+1

मेरी मशीन पर, numpy की eigvals वास्तव में scipy की तुलना में तेज़ है। –

+0

मैं 40,000 पर 40,000 सममित स्पैर मैट्रिक्स द्वारा scipy.sparse.linalg.eign.eigsh का उपयोग कर रहा हूं। 125 सबसे छोटे eigenvectors खोजने में मुझे लगभग 30 मिनट लगते हैं। इसलिए मैं यह भी सोच रहा हूं कि पाइथन में सबसे कुशल ईजिनवेक्टर सॉल्वर क्या है। – Wedoso

8

अपने मैट्रिक्स विरल हैं, तो आप, scipy का विरल eigenvalue समारोह का उपयोग कर कोशिश कर सकते हैं जो तेजी से किया जाना चाहिए:

http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html

तुम भी SLEPc जैसे विशेष पैकेज की जाँच कर सकता है, अजगर बाइंडिंग है और क्या कर सकते हैं

http://code.google.com/p/slepc4py/

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