के साथ सकारात्मक है, मुझे यह पता लगाना होगा कि मैट्रिक्स positive definite है या नहीं। मेरा मैट्रिक्स numpy मैट्रिक्स है। मैं numpy पुस्तकालय में कोई संबंधित विधि खोजने की उम्मीद कर रहा था, लेकिन कोई सफलता नहीं। मैं किसी भी मदद की सराहना करता हूं।पता लगाएं कि मैट्रिक्स सकारात्मक है, numpy
उत्तर
तुम भी जाँच कर सकते हैं सभी मैट्रिक्स eigenvalues के सकारात्मक रहे हैं, यदि ऐसा है तो मैट्रिक्स सकारात्मक निश्चित है:
import numpy as np
def is_pos_def(x):
return np.all(np.linalg.eigvals(x) > 0)
आप Cholesky अपघटन (numpy.linalg.cholesky
) की गणना करने का प्रयास कर सकते हैं। यदि मैट्रिक्स सकारात्मक निश्चित नहीं है तो यह LinAlgError
बढ़ाएगा।
बहुत बहुत धन्यवाद, सुरुचिपूर्ण नहीं बल्कि काम करता है! –
यह eigenvalue समाधान से काफी अधिक कुशल होना चाहिए। – MRocklin
सिर्फ एक नोट है कि सकारात्मक अर्ध-निश्चित मामले में, संख्यात्मक रूप से बोलते हुए, कोई भी मैट्रिक्स में थोड़ी सी पहचान जोड़ सकता है (इस प्रकार सभी ईजिनवेल्स को एक छोटी राशि जैसे कुछ बार मशीन परिशुद्धता स्थानांतरित कर सकते हैं) फिर सामान्य रूप से cholesky विधि का उपयोग करें। – jawknee
मैं नहीं जानता कि क्यों एनपीई का समाधान तो underrated है। ऐसा करने का यह सबसे अच्छा तरीका है। मुझे Wkipedia पर मिला है कि जटिलता घन है।
इसके अलावा, ऐसा कहा जाता है कि यह लू अपघटन की तुलना में अधिक संख्यात्मक रूप से स्थिर है। और लू अपघटन सभी eigenvalues खोजने की विधि से अधिक स्थिर है।
और, यह एक बहुत ही सुरुचिपूर्ण समाधान है, क्योंकि यह एक तथ्य है:
एक मैट्रिक्स एक Cholesky अपघटन यदि और केवल यदि यह सममित सकारात्मक है।
तो गणित का उपयोग क्यों नहीं करते? हो सकता है कि कुछ लोग अपवाद के उदय से डरते हैं, लेकिन यह भी सच है, अपवादों के साथ कार्यक्रम के लिए यह काफी उपयोगी है।
उसी विकिपीडिया पृष्ठ से, ऐसा लगता है कि आपका कथन गलत है। पृष्ठ कहता है " यदि मैट्रिक्स ए हेर्मिटियन और सकारात्मक अर्ध-निश्चित है, तो एल के विकर्ण प्रविष्टियों को शून्य होने की अनुमति होने पर यह ए = एलएल * के रूप में अभी भी एक अपघटन है। [3]" इस प्रकार एक मैट्रिक्स एक Cholesky अपघटन यह इंगित नहीं करता है कि मैट्रिक्स सममित सकारात्मक निश्चित है क्योंकि यह केवल अर्ध-निश्चित हो सकता है। क्या मैं इस गलत व्याख्या कर रहा हूँ? इसके अलावा, ऐसा लगता है कि आपने निहितार्थ में "सममित" फेंक दिया है। यानी यह नहीं होना चाहिए कि हर हर्मिटियन पॉजिटिव-निश्चित मैट्रिक्स में अद्वितीय चोलस्की अपघटन हो? – user3731622
वास्तविक मैट्रिक्स $ ए $ के लिए, हमारे पास $ 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)
कुछ रेडी-टू-उपयोग कोड के साथ @ एनपीई का जवाब समझने के लिए: एनपी के रूप में
आयात 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
आप कोड को अपने मूल उत्तर में कोड जोड़ने के लिए भी कहा जा सकता है। – Matthias
वहाँ ऊपर जवाब में से सभी में एक छोटा सा भ्रम होने लगता है कम से कम सवाल से संबंधित)।
असली 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 (ए, एटी) के लिए उपरोक्त फ़ंक्शन में।
- 1. पता लगाएं कि पाइथन
- 2. पता लगाएं कि Django
- 3. पता लगाएं कि स्ट्रिंग
- 4. पता लगाएं कि आईओएस
- 5. पता लगाएं कि
- 6. पता लगाएं कि लिनक्स
- 7. पता लगाएं कि पाइथन
- 8. पता लगाएं कि
- 9. पता लगाएं कि सी #
- 10. पता लगाएं कि फ़ाइल
- 11. पता लगाएं कि कोड
- 12. पता लगाएं कि UIScrollView
- 13. पता लगाएं कि परीक्षण
- 14. पता लगाएं कि सर्लेट
- 15. पता लगाएं कि एंड्रॉइड
- 16. पता लगाएं कि हैश
- 17. scipy eigh सकारात्मक semidefinite मैट्रिक्स
- 18. ईजिन - जांचें कि क्या मैट्रिक्स सकारात्मक है (अर्ध-) असीमित
- 19. पता लगाएं कि टाइप तत्काल
- 20. पता लगाएं कि क्या UILocalNotification
- 21. जेट्टी: पता लगाएं कि वेबपैप
- 22. पता लगाएं कि कोई वीडियोविव
- 23. पता लगाएं कि माउस जावास्क्रिप्ट
- 24. पता लगाएं कि उपयोगकर्ता टेक्स्टरेरा
- 25. पता लगाएं कि ओएस एक्स
- 26. पता लगाएं कि UITableView नीचे
- 27. पता लगाएं कि एंड्रॉइड SurfaceView
- 28. पता लगाएं कि AVAudioSession "Ducked"
- 29. पता लगाएं कि क्या यूआरआई
- 30. पता लगाएं कि वीबी 6
आप इसके बजाय np.linalg.eigvals का उपयोग कर सकते हैं, जो केवल eigenvalues की गणना करता है। फिर भी, यह @ एनपीई के दृष्टिकोण से अधिक धीमी है (10x10 मैट्रिस के लिए 3x, 1000x1000 के लिए 40x)। – jorgeca
@jorgeca, मैंने आपके सुझाव को दर्शाने के लिए अपना उत्तर अपडेट किया, धन्यवाद। समय के बारे में जानकारी के लिए भी धन्यवाद। – Akavall