Savoir si la matrice est définie positive avec numpy
J'ai besoin de savoir si la matrice est définie positive. Ma matrice est numpy de la matrice. Je m'attendais à trouver toute méthode dans numpy bibliothèque, mais sans succès.
J'apprécie toute l'aide.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez aussi vérifier si toutes les valeurs propres de la matrice sont positifs, si la matrice est définie positive:
np.linalg.cholesky
(il n'a pas le vérifier et peut retourner un résultat faux, que votre exemple montre également). Je me demande comment vérifier si un non symétrique de la matrice est définie positive peut être fait numériquement...np.all(x-x.T==0)
pour vérifier la symétrieVous pouvez essayer de calcul de la décomposition de Cholesky (
numpy.linalg.cholesky
). Cela contribuera à accroître laLinAlgError
si la matrice est définie positive.Il semble y avoir une petite confusion dans toutes les réponses ci-dessus (au moins sur la question).
Pour les matrices réelles, les tests positifs de valeurs propres et les principaux termes de la np.linalg.cholesky ne s'applique que si la matrice est symétrique. Alors d'abord on a besoin de tester si la matrice est symétrique et ensuite appliquer l'une de ces méthodes (valeurs propres positives ou décomposition de Cholesky).
Par exemple:
La matrice A n'est pas symétrique, mais les valeurs propres sont positives et Numpy renvoie une décomposition de Cholesky de ce qui est mauvais. Vous pouvez vérifier que:
est différent de celui de A.
Vous pouvez également vérifier que toutes les fonctions python ci-dessus serait un test positif pour "positif la précision'. Cela pourrait être un sérieux problème si vous essayez d'utiliser la décomposition de Cholesky pour calculer l'inverse, depuis:
sont différents.
En résumé, je voudrais suggérer l'ajout d'une ligne à l'une des fonctions ci-dessus pour vérifier si la matrice est symétrique, par exemple:
Vous voudrez peut-être remplacer np.array_equal(A, A. T) dans la fonction ci-dessus pour les np.allclose(A, A. T) pour éviter des différences qui sont dues à virgule flottante erreurs.
numpy.linalg.LinAlgError
à moins que vous importez avecfrom numpy.linalg import LinAlgError
, ce qui n'est pas une chose que je voudrais faire si je ne l'attraper cette exception spécifique une fois ou deux fois dans mon code.if
déclaration pournp.allclose(A, A.T)
). À l'aide denp.allclose(A, A.H)
va corriger cela (l'OP dit qu'il travaille avec numpy matrice, si l'on travaille avec ndarray, utilisezA.conj().T
au lieu de.H
Je ne sais pas pourquoi la solution de NPE est donc sous-estimée. C'est le meilleur moyen pour ce faire. J'ai trouvé sur Wkipedia que la complexité est cubique.
En outre, il est dit qu'il est plus numériquement stable que la décomposition Lu. Et la décomposition Lu est plus stable que la méthode de recherche de toutes les valeurs propres.
Et, il est très élégante, une solution, parce que c'est un fait :
Une matrice a une décomposition de Cholesky si et seulement si elle est symétrique positive.
Alors pourquoi ne pas utiliser les mathématiques ? Peut-être que certaines personnes de peur de la relance de l'exception, mais il a fait trop, il est très utile pour programmer avec des exceptions.
Pour illustrer @NPE, en réponse à certaines de prêt-à-utiliser le code:
Pour une véritable matrice $A$, nous avons $x^Impôt=\frac{1}{2}(x^T(A+A^T)x)$, et $A+A^T$ est symétrique réelle de la matrice. Si $A$ est définie positive ssi $A+A^T$ est définie positive, le forum de toutes les valeurs propres de $A+A^T$ sont positifs.