2013-04-28 9 views
23

के साथ सकारात्मक है, मुझे यह पता लगाना होगा कि मैट्रिक्स positive definite है या नहीं। मेरा मैट्रिक्स numpy मैट्रिक्स है। मैं numpy पुस्तकालय में कोई संबंधित विधि खोजने की उम्मीद कर रहा था, लेकिन कोई सफलता नहीं। मैं किसी भी मदद की सराहना करता हूं।पता लगाएं कि मैट्रिक्स सकारात्मक है, numpy

उत्तर

31

तुम भी जाँच कर सकते हैं सभी मैट्रिक्स eigenvalues ​​के सकारात्मक रहे हैं, यदि ऐसा है तो मैट्रिक्स सकारात्मक निश्चित है:

import numpy as np 

def is_pos_def(x): 
    return np.all(np.linalg.eigvals(x) > 0) 
+1

आप इसके बजाय np.linalg.eigvals का उपयोग कर सकते हैं, जो केवल eigenvalues ​​की गणना करता है। फिर भी, यह @ एनपीई के दृष्टिकोण से अधिक धीमी है (10x10 मैट्रिस के लिए 3x, 1000x1000 के लिए 40x)। – jorgeca

+0

@jorgeca, मैंने आपके सुझाव को दर्शाने के लिए अपना उत्तर अपडेट किया, धन्यवाद। समय के बारे में जानकारी के लिए भी धन्यवाद। – Akavall

+8

यह सामान्य रूप से सच नहीं है कि सभी सकारात्मक eigenvalues ​​सकारात्मक निश्चितता का तात्पर्य है, जब तक कि आप नहीं जानते कि मैट्रिक्स सममित (असली मामला) या Hermitian (जटिल मामला) है। उदाहरण के लिए, ए = सरणी ([[1, -100], [0, 2]]) सकारात्मक निश्चित नहीं है। कुछ में "सकारात्मक निश्चित" की * परिभाषा * के हिस्से के रूप में सममित या Hermitian शामिल हो सकता है, लेकिन यह सार्वभौमिक नहीं है।

33

आप Cholesky अपघटन (numpy.linalg.cholesky) की गणना करने का प्रयास कर सकते हैं। यदि मैट्रिक्स सकारात्मक निश्चित नहीं है तो यह LinAlgError बढ़ाएगा।

+0

बहुत बहुत धन्यवाद, सुरुचिपूर्ण नहीं बल्कि काम करता है! –

+4

यह eigenvalue समाधान से काफी अधिक कुशल होना चाहिए। – MRocklin

+0

सिर्फ एक नोट है कि सकारात्मक अर्ध-निश्चित मामले में, संख्यात्मक रूप से बोलते हुए, कोई भी मैट्रिक्स में थोड़ी सी पहचान जोड़ सकता है (इस प्रकार सभी ईजिनवेल्स को एक छोटी राशि जैसे कुछ बार मशीन परिशुद्धता स्थानांतरित कर सकते हैं) फिर सामान्य रूप से cholesky विधि का उपयोग करें। – jawknee

4

मैं नहीं जानता कि क्यों एनपीई का समाधान तो underrated है। ऐसा करने का यह सबसे अच्छा तरीका है। मुझे Wkipedia पर मिला है कि जटिलता घन है।

इसके अलावा, ऐसा कहा जाता है कि यह लू अपघटन की तुलना में अधिक संख्यात्मक रूप से स्थिर है। और लू अपघटन सभी eigenvalues ​​खोजने की विधि से अधिक स्थिर है।

और, यह एक बहुत ही सुरुचिपूर्ण समाधान है, क्योंकि यह एक तथ्य है:

एक मैट्रिक्स एक Cholesky अपघटन यदि और केवल यदि यह सममित सकारात्मक है।

तो गणित का उपयोग क्यों नहीं करते? हो सकता है कि कुछ लोग अपवाद के उदय से डरते हैं, लेकिन यह भी सच है, अपवादों के साथ कार्यक्रम के लिए यह काफी उपयोगी है।

+1

उसी विकिपीडिया पृष्ठ से, ऐसा लगता है कि आपका कथन गलत है। पृष्ठ कहता है " यदि मैट्रिक्स ए हेर्मिटियन और सकारात्मक अर्ध-निश्चित है, तो एल के विकर्ण प्रविष्टियों को शून्य होने की अनुमति होने पर यह ए = एलएल * के रूप में अभी भी एक अपघटन है। [3]" इस प्रकार एक मैट्रिक्स एक Cholesky अपघटन यह इंगित नहीं करता है कि मैट्रिक्स सममित सकारात्मक निश्चित है क्योंकि यह केवल अर्ध-निश्चित हो सकता है। क्या मैं इस गलत व्याख्या कर रहा हूँ? इसके अलावा, ऐसा लगता है कि आपने निहितार्थ में "सममित" फेंक दिया है। यानी यह नहीं होना चाहिए कि हर हर्मिटियन पॉजिटिव-निश्चित मैट्रिक्स में अद्वितीय चोलस्की अपघटन हो? – user3731622

0

वास्तविक मैट्रिक्स $ ए $ के लिए, हमारे पास $ x^TAx = \ frac {1} {2} (x^टी (ए + ए^टी) x) $, और $ ए + ए^टी $ है सममित वास्तविक मैट्रिक्स है। तो $ ए $ सकारात्मक निश्चित है iff $ ए + ए^टी $ सकारात्मक निश्चित है, अगर $ ए + ए^टी $ के सभी eigenvalues ​​सकारात्मक हैं।

import numpy as np 

def is_pos_def(A): 
    M = np.matrix(A) 
    return np.all(np.linalg.eigvals(M+M.transpose()) > 0) 
1

कुछ रेडी-टू-उपयोग कोड के साथ @ एनपीई का जवाब समझने के लिए: एनपी के रूप में

आयात numpy (

def is_pd(K): 
    try: 
     np.linalg.cholesky(K) 
     return 1 
    except np.linalg.linalg.LinAlgError as err: 
     if 'Matrix is not positive definite' in err.message: 
      return 0 
     else: 
    raise 
+1

आप कोड को अपने मूल उत्तर में कोड जोड़ने के लिए भी कहा जा सकता है। – Matthias

2

वहाँ ऊपर जवाब में से सभी में एक छोटा सा भ्रम होने लगता है कम से कम सवाल से संबंधित)।

असली matrices के लिए, सकारात्मक eigenvalues ​​के लिए परीक्षण और np.linalg.cholesky में सकारात्मक अग्रणी शब्द केवल मैट्रिक्स सममित है लागू होता है। तो पहले मैट्रिक्स सममित है या नहीं और फिर उन विधियों में से एक (सकारात्मक eigenvalues ​​या Cholesky अपघटन) लागू करने के लिए परीक्षण करने की जरूरत है।

उदाहरण के लिए:

import numpy as np 

#A nonsymmetric matrix 
A = np.array([[9,7],[6,14]]) 

#check that all eigenvalues are positive: 
np.all(np.linalg.eigvals(A) > 0) 

#take a 'Cholesky' decomposition: 
chol_A = np.linalg.cholesky(A) 

मैट्रिक्स एक सममित नहीं है, लेकिन eigenvalues ​​सकारात्मक रहे हैं और Numpy एक Cholesky अपघटन कि गलत है देता है। आप देख सकते हैं कि:

chol_A.dot(chol_A.T) 

तुम भी जाँच कर सकते हैं कि सभी अजगर ऊपर कार्यों 'सकारात्मक-निश्चितता' के लिए सकारात्मक का परीक्षण होगा की तुलना में अलग है।

>np.linalg.inv(A) 
array([[ 0.16666667, -0.08333333], 
    [-0.07142857, 0.10714286]]) 

>np.linalg.inv(chol_A.T).dot(np.linalg.inv(chol_A)) 
array([[ 0.15555556, -0.06666667], 
    [-0.06666667, 0.1  ]]) 

अलग हैं: यह संभवतः एक गंभीर समस्या है, तो आप, उलटा गणना करने के लिए Cholesky अपघटन उपयोग करने के लिए कोशिश कर रहे थे के बाद से हो सकता है।

def is_pos_def(A): 
    if np.array_equal(A, A.T): 
     try: 
      np.linalg.cholesky(A) 
      return True 
     except LinAlgError: 
      return False 
    else: 
     return False 

आप np.array_equal को बदलने के लिए चाहते हो सकता है (ए, एटी):

सारांश में, मैं अगर मैट्रिक्स सममित है की जाँच करने के, उदाहरण के लिए ऊपर किसी भी कार्य के लिए एक लाइन जोड़ने का सुझाव फ्लोटिंग पॉइंट त्रुटियों के कारण होने वाले मतभेदों से बचने के लिए np.allclose (ए, एटी) के लिए उपरोक्त फ़ंक्शन में।

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