अजगर में एक बहुत बड़े और विरल आसन्न मैट्रिक्स के सभी eigenvalues ​​की गणना करने का सबसे तेज़ तरीका क्या है?


12

मैं यह पता लगाने की कोशिश कर रहा हूं कि scipy.sparse.linalg.eigsh का उपयोग करने की तुलना में बहुत बड़े और विरल आसन्न मैट्रिक्स के सभी eigenvalues ​​और eigenvectors की गणना करने के लिए एक तेज़ तरीका है जहां तक ​​मुझे पता है, यह विधियां केवल स्पार्सिटी और का उपयोग करती हैं मैट्रिक्स की समरूपता विशेषताएँ। एक आसन्न मैट्रिक्स भी द्विआधारी है, जो मुझे लगता है कि ऐसा करने का एक तेज़ तरीका है।

मैंने एक यादृच्छिक 1000x1000 विरल आसन्न मैट्रिक्स बनाया, और मेरे x230 ubuntu 13.0434 पर कई तरीकों के बीच तुलना की:

  • scipy.sparse.linalg.eigs: 0.65 सेकंड
  • scipy.sparse.linalg.eigsh: 0.44 सेकंड
  • scipy.linalg.eig: 6.09 सेकंड
  • scipy.linalg.eigh: 1.60 सेकंड

विरल अंजीर और ईगश के साथ, मैंने मैट्रिक्स की रैंक होने के लिए, वांछित ईजेनवेल्यूज और ईजेनवेक्टर्स की संख्या k निर्धारित की है।

समस्या बड़े मेट्रिक्स के साथ शुरू होती है - 9000x9000 मैट्रिक्स पर, यह scipy.sparse.linalg.eigsh 45 मिनट ले लिया!


1
एनबी। scipy.sparse.linalg.eigsh ARPACK
pv है।

4
अनुवर्ती कार्रवाई करने के लिए, आपका मैट्रिक्स जितना बड़ा होगा, आंतरिक उंनगलन की गणना करने की कम संभावना है (यानी, न तो सबसे बड़ा या सबसे छोटा eigenvalues) सटीक रूप से। जिस मैट्रिक्स को आप डिकम्पोज कर रहे हैं, उससे आपको क्या जानकारी चाहिए?
ज्योफ ऑक्सबेरी

1
यह प्रश्न यहाँ क्रॉस-पोस्ट किया गया है । मैं अनुशंसा कर रहा हूं कि क्रॉस-पोस्ट किया गया संस्करण बंद हो।
अरोन अहमदिया

2
मैं ए ^ के की गणना करना चाहता हूं। पुनर्विचार के बाद, मुझे लगता है कि इस तरह के मैट्रिक्स के साथ प्रत्यक्ष गुणन (ए ए ...) रथेन की गणना करने के लिए बहुत तेजी से होता है जो ईगेंडेकोम्पोजिशन का उपयोग कर रहा है। बेशक, यह कश्मीर पर निर्भर करता है।
नोम पेलेड

2
हाँ, इसे सीधे करें। Eigendecomposition के परिणाम विरल नहीं हैं, इसलिए आपके पास भंडारण के मुद्दे होंगे (तब फिर से, न तो ए ^ के है यदि के काफी बड़ा है)। संबंधित stackoverflow.com/a/9495457/424631
dranxo

जवाबों:


6

FILTLAN विरल सममित मैट्रिक्स के आंतरिक eigenvalues ​​की गणना के लिए एक C ++ पुस्तकालय है। तथ्य यह है कि सिर्फ यह करने के लिए समर्पित एक पूरा पैकेज है कि आपको बता दें कि यह एक बहुत कठिन समस्या है। सममित मैट्रिक्स के सबसे बड़े या सबसे छोटे कुछ प्रतिजन को खोजना, लैंज़ोज़ एल्गोरिथ्म को शिफ्टिंग / इनवर्टिंग और उपयोग करके किया जा सकता है, लेकिन स्पेक्ट्रम के मध्य एक और मामला है। यदि आप इसका उपयोग करना चाहते हैं, तो आप अजगर से C ++ प्रोग्राम को कॉल करने के लिए SWIG का उपयोग कर सकते हैं।

यदि आपका अंतिम लक्ष्य मैट्रिक्स की बड़ी शक्तियों की गणना करना है, तो आप सिर्फ सबसे बड़े eigenvalues ​​के अनुरूप eigenvectors की गणना कर सकते हैं, इस ज्ञान की सामग्री कि आप बड़ी शक्तियों को लेने के लिए छोटे मोड कम महत्वपूर्ण होंगे।

उस ने कहा, आप वास्तव में सीधे शक्तियों की गणना से बेहतर हो सकते हैं। जब आप उच्च शक्तियों की गणना करते हैं, तो वे कम और कम विरल हो जाएंगे, जिसका अर्थ है कि अधिक मेमोरी लेना; कितनी ऊँची पर निर्भर करता है, आप अंततः एक घने मैट्रिक्स पर स्विच करना चाह सकते हैं।k

मुझे माफ कर दो अगर ये पहले से ही आपके लिए स्पष्ट हैं: आप मैट्रिक्स की द्विआधारी प्रकृति का उपयोग करके यह बता सकते हैं कि यह फ्लॉपी के बजाय पूर्णांक के होते हैं, का उपयोग करके कहते हैं

a = np.zeros(100,dtype=np.uint)

इससे (उम्मीद है) कुछ जगह बच जाएगी। मैट्रिक्स गुणा को रोककर आप समय (लेकिन स्मृति नहीं) बचा सकते हैं। कहते हैं कि आप गणना करना चाहते हैं ; आप गणना करते हैं , तो प्राप्त करने के लिए इसे वर्गाकार करें, प्राप्त करने के लिए इसे वर्गाकार करें , और इसी तरह। इस तरह, आप कर मेट्रिक्स के बजाय गुणा गुणा।A16A2A4A8log2k

अगर गति आपकी चिंता का विषय है और आपके पास एक NVIDIA GPU है, तो आप पायथन से CUSP या cuSPARSE जैसे एक समानांतर विरल रैखिक बीजगणित पुस्तकालय को भी देख सकते हैं।


1

मैं डैनियल शेपरो के जवाब पर टिप्पणी करना चाहूंगा लेकिन मेरे पास पर्याप्त एसई प्रतिष्ठा नहीं है।

स्वीकृत उत्तर मुझे बहुत भ्रमित करता है। मुझे लगता है कि शिफ्ट-इनवर्ट मोड को आसानी से आंतरिक eigenvalues ​​की गणना करने के लिए उपयोग किया जा सकता है। देखें: https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html

मूल प्रश्न का उत्तर देने के लिए: यह शायद ही कभी ऐसा होता है कि आप एक बड़े विरल मैट्रिक्स के सभी eigenvalues ​​चाहते हैं। आमतौर पर, आप extrems या आंतरिक मूल्यों के कुछ क्लस्टर चाहते हैं। उस मामले में, एक हर्मिटियन मैट्रिक्स के eigshलिए तेज है। गैर-हर्मिटियन के लिए, आपको साथ जाना होगा eigs। और वे सुन्न eigया की तुलना में बहुत तेज हैं eigh

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