मैं शून्य (शून्य से 30000x30000 तक) बड़े सममित वर्ग विरल-मैट्रिस (30000x30000 तक) के सबसे छोटे eigenvalues के अनुरूप कुछ (5-500) eigenvectors को गैर-शून्य होने की कोशिश कर रहा हूं।
मैं वर्तमान में scipy.sparse.linalg.eigsh इन शिफ्ट-इनवर्ट मोड (सिग्मा = 0.0) का उपयोग कर रहा हूं, जिसे मैंने इस विषय पर विभिन्न पदों के माध्यम से समझा है। हालांकि, ज्यादातर मामलों में समस्या को हल करने में 1h तक का समय लगता है। दूसरी ओर, फ़ंक्शन बहुत तेज़ है, अगर मैं सबसे बड़ा ईगेंवल्यूज़ (अपने सिस्टम पर सब सेकंड) मांगता हूं, जो प्रलेखन से अपेक्षित था।
चूंकि मैं काम से मैटलैब से अधिक परिचित हूं, इसलिए मैंने ऑक्टेव में समस्या को हल करने की कोशिश की, जिसने मुझे कुछ ही सेकंड (10 के दशक) में ईग्स (सिग्मा = 0) का उपयोग करके एक ही परिणाम दिया। चूँकि मैं eigenvector संगणना सहित एल्गोरिथ्म के एक पैरामीटर स्वीप करना चाहता हूं, उस तरह का समय लाभ अजगर में भी होना बहुत अच्छा होगा।
मैंने पहले पैरामीटर (विशेष रूप से सहिष्णुता) को बदल दिया, लेकिन वह टाइमस्केल्स पर बहुत अधिक नहीं बदला।
मैं विंडोज पर एनाकोंडा का उपयोग कर रहा हूं, लेकिन mkl (डिफ़ॉल्ट एनाकोंडा) से OpenBlas (प्रलेखन के अनुसार ऑक्टेव द्वारा उपयोग किया गया) से स्केपी द्वारा इस्तेमाल किया गया LAPACK / BLAS (जो एक बहुत बड़ा दर्द था) को स्विच करने की कोशिश की, लेकिन इसमें कोई बदलाव नहीं देखा जा सकता है प्रदर्शन।
मैं यह पता लगाने में सक्षम नहीं था कि क्या इस्तेमाल किए गए ARPACK (और कैसे) के बारे में कुछ बदलना है?
मैंने निम्न ड्रॉपबॉक्स-फ़ोल्डर के नीचे दिए गए कोड के लिए एक टेस्टकेस अपलोड किया: https://www.dropbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnjRaETQmka.dl=0
पायथन में
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
ओक्टेव में:
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
किसी भी मदद के लिए appriciated है!
कुछ अतिरिक्त विकल्प जो मैंने टिप्पणियों और सुझावों के आधार पर आजमाए:
सप्तक:
eigs(M,6,0)
और eigs(M,6,'sm')
मुझे एक ही परिणाम दे:
[1.8725e-05 1.0189e-05 7.5622e-06 7.5420e-07 -1.2239e-18 -2.5674e-16]
जबकि eigs(M,6,'sa',struct('tol',2))
अभिसरण करता है
[1.0423 2.7604 6.1548 11.1310 18.0207 25.3933]
बहुत तेजी से, लेकिन केवल अगर सहिष्णुता मान 2 से ऊपर है, अन्यथा यह बिल्कुल भी नहीं जुटता है और मान दृढ़ता से भिन्न होते हैं।
पायथन:
eigsh(M,k=6,which='SA')
और eigsh(M,k=6,which='SM')
दोनों अभिसरण नहीं करते हैं (ARPACK त्रुटि पर कोई अभिसरण नहीं पहुंचा)। केवल eigsh(M,k=6,sigma=0.0)
कुछ प्रतिजन (लगभग एक घंटे के बाद) देता है, जो सबसे छोटे लोगों के लिए अष्टक के लिए अलग होते हैं (यहां तक कि 1 अतिरिक्त छोटा मान भी पाया जाता है):
[3.82923317e-17 3.32269886e-16 2.78039665e-10 7.54202273e-07 7.56251500e-06 1.01893934e-05]
यदि सहिष्णुता पर्याप्त है तो मुझे इसके परिणाम भी मिलते हैं eigsh(M,k=6,which='SA',tol='1')
, जो अन्य प्राप्त मूल्यों के करीब आते हैं
[4.28732218e-14 7.54194948e-07 7.56220703e-06 1.01889544e-05, 1.87247350e-05 2.02652719e-05]
फिर से एक अलग संख्या में छोटे eigenvalues के साथ। गणना का समय अभी भी लगभग 30min है। जबकि विभिन्न बहुत छोटे मूल्य समझ में आ सकते हैं, क्योंकि वे 0 के गुणकों का प्रतिनिधित्व कर सकते हैं, अलग-अलग गुणन मुझे चकरा देते हैं।
इसके अतिरिक्त, SciPy और Octave में कुछ मूलभूत अंतर हैं, जिन्हें मैं अभी तक समझ नहीं पाया हूं।