के लिए अनियमित परिणाम मुझे लगता है कि scipy.linalg.eig कभी-कभी असंगत परिणाम देता है। लेकिन हर बार नहीं।numpy/scipy eigendecompositions
>>> import numpy as np
>>> import scipy.linalg as lin
>>> modmat=np.random.random((150,150))
>>> modmat=modmat+modmat.T # the data i am interested in is described by real symmetric matrices
>>> d,v=lin.eig(modmat)
>>> dx=d.copy()
>>> vx=v.copy()
>>> d,v=lin.eig(modmat)
>>> np.all(d==dx)
False
>>> np.all(v==vx)
False
>>> e,w=lin.eigh(modmat)
>>> ex=e.copy()
>>> wx=w.copy()
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
True
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
False
जब मैं बड़ी रेखीय बीजगणित जादूगर नहीं हूँ, मुझे समझ नहीं है कि eigendecomposition स्वाभाविक अजीब राउंडिंग त्रुटियों के अधीन है, लेकिन मुझे समझ नहीं आता क्यों गणना दोहरा भिन्न मान जाएगी। लेकिन मेरे परिणाम और पुनरुत्पादन भिन्न हैं।
समस्या की प्रकृति वास्तव में क्या है - ठीक है, कभी-कभी परिणाम स्वीकार्य रूप से भिन्न होते हैं, और कभी-कभी वे नहीं होते हैं। यहां कुछ उदाहरण दिए गए हैं:
>>> d[1]
(9.8986888573772465+0j)
>>> dx[1]
(9.8986888573772092+0j)
~ 3e-13 के ऊपर का अंतर एक बहुत बड़ा सौदा नहीं लगता है। इसके बजाए, असली समस्या (कम से कम मेरे वर्तमान प्रोजेक्ट के लिए) यह है कि कुछ ईजीनवे उचित संकेत पर सहमत नहीं लग सकते हैं।
>>> np.all(np.sign(d)==np.sign(dx))
False
>>> np.nonzero(np.sign(d)!=np.sign(dx))
(array([ 38, 39, 40, 41, 42, 45, 46, 47, 79, 80, 81, 82, 83,
84, 109, 112]),)
>>> d[38]
(-6.4011617320002525+0j)
>>> dx[38]
(6.1888785138080209+0j)
MATLAB में इसी तरह की कोड में यह समस्या नहीं प्रतीत होती है।
(+1) दिलचस्प http://www.nccs.nasa.gov/images/FloatingPoint_consistency.pdf देखें ... – NPE
मैं इस का उपयोग कर NumPy 1.6.1/SciPy 0.10.1 पुन: पेश करने की कोशिश की, लेकिन नहीं कर सके। – NPE
मैं numpy 1.6.1 और scipy 0.10.0 का उपयोग कर रहा हूँ। इसके अलावा, जब मैंने प्रतिलिपि का उपयोग नहीं किया था() मैं इस त्रुटि को उत्पन्न करने में सक्षम नहीं था (लेकिन यह मेरे बड़े एप्लिकेशन में मौजूद है जहां कॉपी() चल रहा है)। जिसका अर्थ बहुत ज्यादा नहीं है, क्योंकि यह दिमाग में असंगत है। – aestrivex