Ho bisogno di scoprire se la matrice è positive definite. La mia matrice è una matrice numpy. Mi aspettavo di trovare qualsiasi metodo correlato nella libreria numpy, ma senza successo. Apprezzo qualsiasi aiuto.Scopri se la matrice è definita positiva con numpy
risposta
si può anche verificare se tutti gli autovalori di matrici sono positivi, in tal caso la matrice è definita positiva:
import numpy as np
def is_pos_def(x):
return np.all(np.linalg.eigvals(x) > 0)
Si potrebbe provare a calcolare la scomposizione di Cholesky (numpy.linalg.cholesky
). Questo aumenterà LinAlgError
se la matrice non è definita positiva.
Grazie mille, non variare elegante ma funziona! –
Questo dovrebbe essere sostanzialmente più efficiente della soluzione autovalore. – MRocklin
Solo una nota che nel caso semi-definito positivo, numericamente parlando, si può anche aggiungere una piccola identità alla matrice (spostando così tutti gli autovalori di una piccola quantità per esempio alcune volte la precisione della macchina) quindi utilizzare il metodo Cholesky come al solito. – jawknee
Non so il motivo per cui la soluzione di NPE è così sottovalutato. È il modo migliore per farlo. Ho trovato su Wkipedia che la complessità è cubica.
Inoltre, si dice che è più numericamente stabile della decomposizione Lu. E la decomposizione di Lu è più stabile del metodo di trovare tutti gli autovalori.
E, si tratta di una soluzione molto elegante, perché è un dato di fatto:
Una matrice ha una decomposizione di Cholesky se e solo se è simmetrica positiva.
Quindi perché non usare la matematica? Forse alcune persone hanno paura del rilancio dell'eccezione, ma è un dato di fatto, è abbastanza utile programmare con eccezioni.
Dalla stessa pagina di Wikipedia, sembra che la tua affermazione sia errata. La pagina dice " Se la matrice A è Hermitiana e semi-definita positiva, allora ha ancora una scomposizione della forma A = LL * se le voci diagonali di L sono consentite per essere zero. [3]" Così una matrice con una scomposizione di Cholesky non implica che la matrice sia definita positivamente simmetrica poiché potrebbe essere solo semi-definita. Sto interpretando questo torto? Inoltre, sembra che tu abbia appena lanciato un "simmetrico" attraverso l'implicazione. cioè, non dovrebbe essere che ogni matrice Hermitiana positiva-definita abbia una decomposizione di Cholesky unica? – user3731622
Per una matrice reale $ A $, abbiamo $ x^TAx = \ frac {1} {2} (x^T (A + A^T) x) $ e $ A + A^T $ è una matrice reale simmetrica. Quindi $ A $ è definito positivo se $ A + A^T $ è positivo definito, se tutti gli autovalori di $ A + A^T $ sono positivi.
import numpy as np
def is_pos_def(A):
M = np.matrix(A)
return np.all(np.linalg.eigvals(M+M.transpose()) > 0)
Per illustrare la risposta @ NPE con un po 'di codice pronto per l'uso:
importazione NumPy come np
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
Si potrebbe anche chiedere a @NPE di aggiungere il codice alla propria risposta originale. – Matthias
Sembra che ci sia una piccola confusione tutte le risposte di cui sopra (almeno riguardo alla domanda).
Per le matrici reali, i test per autovalori positivi e termini a conduzione positiva in np.linalg.cholesky si applicano solo se la matrice è simmetrica. Quindi, per prima cosa è necessario testare se la matrice è simmetrica e quindi applicare uno di questi metodi (autovalori positivi o scomposizione di Cholesky).
Ad esempio:
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)
La matrice A non è simmetrica, ma gli autovalori sono positivi e Numpy restituisce una decomposizione di Cholesky che è sbagliato. È possibile verificare che:
chol_A.dot(chol_A.T)
è diverso da A.
Si può anche verificare che tutte le funzioni di cui sopra sarebbero pitone test positivo per 'positiva determinatezza'.Questo potrebbe potenzialmente essere un problema grave se si stava tentando di utilizzare la decomposizione di Cholesky per calcolare l'inverso, in quanto:
>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 ]])
sono diversi.
In sintesi, vorrei suggerire l'aggiunta di una linea ad una qualsiasi delle funzioni di cui sopra per verificare se la matrice è simmetrica, per esempio:
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
Si consiglia di sostituire np.array_equal (A, AT) nella funzione sopra per np.allclose (A, AT) per evitare differenze dovute a errori in virgola mobile.
- 1. Eigen - Verifica se la matrice è positiva (semi-) Definita
- 2. Come posso calcolare la matrice semi-definita positiva più vicina?
- 3. Scopri se ActionBar è impilato
- 4. numpy: indicatore affidabile (non conservativo) se la matrice numpy è vista
- 5. Testare se NumPy matrice contiene solo zeri
- 6. scipy eigh fornisce autovalori negativi per matrice semidefinita positiva
- 7. Come decidere se una matrice è singolare in python-numpy?
- 8. Scopri se una proprietà è dichiarata virtuale
- 9. Scopri se un URL è rotto?
- 10. GVim: scopri se guifont è disponibile
- 11. Numpy: come verificare se la matrice contiene determinati numeri?
- 12. Matrice di oggetti con numpy
- 13. Inversione matrice senza Numpy
- 14. calcola rapidamente la matrice numpy 3D casuale dall'array numpy 2D
- 15. Scopri se esiste una variabile
- 16. ricampionare matrice NumPy
- 17. Converti matrice 1D in matrice numpy
- 18. Come verificare se la variabile del modello django è definita?
- 19. NumPy matrice non è JSON serializzabile
- 20. Perché la struttura sockaddr_storage è definita come è definita?
- 21. Test se la matrice è invertibile su campo finito
- 22. Cosa succederà se la funzione ricorsiva è definita come inline?
- 23. pitone matrice NumPy sostituzione
- 24. Calcolando la curtosi da una matrice numpy?
- 25. Fai la matrice diagonale speciale nel Numpy
- 26. Perché la moltiplicazione della matrice è più veloce con numpy che con ctypes in Python?
- 27. controllo JavaScript se la proprietà definita
- 28. Scopri di programmazione se un processo è esigente input dell'utente
- 29. Verifica se una costante è già definita
- 30. Applicazione funzione su matrice/riga matrice numpy
È possibile utilizzare invece np.linalg.eigvals, che calcola solo gli autovalori. Anche in questo caso, è molto più lento dell'approccio di @ NPE (3x per matrici 10x10, 40x per 1000x1000). – jorgeca
@jorgeca, ho aggiornato la mia risposta per riflettere il tuo suggerimento, grazie. Grazie per le informazioni sull'ora. – Akavall