2013-02-04 17 views
5

के लिए अनियमित परिणाम मुझे लगता है कि 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 में इसी तरह की कोड में यह समस्या नहीं प्रतीत होती है।

+0

(+1) दिलचस्प http://www.nccs.nasa.gov/images/FloatingPoint_consistency.pdf देखें ... – NPE

+0

मैं इस का उपयोग कर NumPy 1.6.1/SciPy 0.10.1 पुन: पेश करने की कोशिश की, लेकिन नहीं कर सके। – NPE

+0

मैं numpy 1.6.1 और scipy 0.10.0 का उपयोग कर रहा हूँ। इसके अलावा, जब मैंने प्रतिलिपि का उपयोग नहीं किया था() मैं इस त्रुटि को उत्पन्न करने में सक्षम नहीं था (लेकिन यह मेरे बड़े एप्लिकेशन में मौजूद है जहां कॉपी() चल रहा है)। जिसका अर्थ बहुत ज्यादा नहीं है, क्योंकि यह दिमाग में असंगत है। – aestrivex

उत्तर

5

eigenvalue decompositions ए वी संतुष्ट = वी लैम्ब्डा, जो सभी क्या गारंटी है है --- उदाहरण के लिए eigenvalues ​​का आदेश नहीं है। अपने प्रश्न के दूसरे भाग के लिए

उत्तर:

आधुनिक compilers/रेखीय बीजगणित पुस्तकालयों का उत्पादन/कि अलग अलग बातें डेटा (जैसे) में 16-बाइट सीमाओं पर स्मृति में गठबंधन है जो इस पर निर्भर करता है कोड होता है। यह कंप्यूटेशंस में गोल करने वाली त्रुटि को प्रभावित करता है, क्योंकि फ़्लोटिंग पॉइंट ऑपरेशंस एक अलग क्रम में किया जाता है। राउंडिंग त्रुटि में छोटे बदलाव तब इग्निग्लूम (यहां, LAPACK/xGEEV) इस संबंध में संख्यात्मक स्थिरता की गारंटी नहीं देते हैं, जैसे eigenvalues ​​को ऑर्डर करने जैसी चीजों को प्रभावित कर सकते हैं।

(यदि आपका कोड इस तरह बातें के प्रति संवेदनशील है, यह सही नहीं है एक अलग मंच या अलग पुस्तकालय संस्करण पर चल रहा है जैसे यह एक ऐसी ही समस्या पैदा होता!।)

परिणामों को आम तौर अर्ध नियतात्मक हैं - - उदाहरण के लिए आपको 2 संभावित परिणामों में से एक मिलता है, भले ही सरणी स्मृति में गठबंधन हो या नहीं। यदि आप संरेखण के बारे में उत्सुक हैं, तो A.__array_interface__['data'][0] % 16 देखें।

के लिए और अधिक

+0

स्पष्टीकरण के अलावा यहां समस्या का समाधान शामिल करना बेहद उपयोगी होगा। मुझे नहीं पता कि 'ए .__ array_interface __ [' डेटा '] [0]% 16' का उपयोग कैसे करें और मूल रूप से, यह देखते हुए कि यह मेरी समस्या है, मैं अपना कोड कैसे बदलूं ताकि यह संवेदनशील न हो मार्ग? –

2

मुझे लगता है कि आपकी समस्या यह है कि आप किसी विशेष क्रम में ईगेंवल्यू वापस लौटने की उम्मीद कर रहे हैं, और वे हमेशा बाहर नहीं आते हैं। उन्हें क्रमबद्ध करें, और आप अपने रास्ते पर होंगे। मैं निम्नलिखित मिल अगर मैं अपने कोड और ddxeig साथ उत्पन्न करने के लिए चलाएँ:

>>> np.max(d - dx) 
(19.275224236664116+0j) 

... लेकिन

>>> d_i = np.argsort(d) 
>>> dx_i = np.argsort(dx) 
>>> np.max(d[d_i] - dx[dx_i]) 
(1.1368683772161603e-13+0j) 
+0

आह।यह काफी सही जवाब नहीं है, लेकिन यह काफी करीब है कि उसने मुझे सही दिशा में इंगित किया। मेरे कार्यक्रम में क्या चल रहा था यह है कि मेरे कोड में कहीं और मैं उन स्थानों पर eigenvectors अनुक्रमणित कर रहा था जहां वे नहीं थे। इससे मुझे मेरी बग को ठीक करने में मदद मिली (इसलिए धन्यवाद) लेकिन यह मेरे द्वारा उत्पन्न किए गए प्रश्न की व्याख्या नहीं करता है, यही कारण है कि यह गणना अलग-अलग उत्तरों - या एक अलग ऑर्डरिंग प्रदान करती है - कई बार चलाने पर। यही है, ठीक है, eigenvalues ​​किसी भी विशेष क्रम में होने की गारंटी नहीं है, लेकिन यदि आप इसे इनपुट के रूप में एक ही मैट्रिक्स देते हैं तो वे क्यों बदलेंगे? – aestrivex