Je veux vérifier si une matrice est positive de la semi-rigide définitive ou positive à l'aide de Python. P>
Comment puis-je faire ça? Y a-t-il une fonction dédiée à Scipify pour cela ou dans d'autres modules? P>
5 Réponses :
Je suppose que vous savez déjà que votre matrice est symétrique. p>
Un bon test pour une définition positive (en réalité, le standard!) est d'essayer de calculer sa factorisation de la Cholesky. Il réussit si votre matrice est positive définie. P>
Ceci est la voie la plus directe, car elle nécessite des opérations O (N ^ 3) (avec une petite constante), et vous auriez besoin d'au moins N multiplications de la matrice-vecteur pour tester "directement". P>
Je demandais s'il y a une méthode directe pour cela. Merci quand même
@sramij c'est la voie la plus directe de tester
@sramij: Ceci est i> une méthode directe et est plus rapide que toute autre chose, sauf si vous avez des informations supplémentaires a priori i> sur la matrice.
Pour le cas semi-défini positif, il reste vrai comme une proposition abstraite qu'un La matrice réelle symétrique (ou complexe hermitien) est positive semi-définie si et uniquement si une factorisation de la Cholesky existe. Avec une matrice définie positive, le Algorithme habituel réussit parce que toutes les entrées diagonales de l st A = ll 'sont positifs (une racine carrée étant prise). Si nous frappons un zéro pivot, le calcul s'arrête, mais la théorie tient.
@HARDMATH: En effet, l'existence de la décomposition de la Cholesky pour les matrices semi-rigides est titulaire d'un argument limitant.
Une méthode plus facile consiste à calculer les déterminants des mineurs pour cette matrx. p>
Computing Les déterminants nécessitent des décompositions code> N CODE> LU / QR / NR / PROCHESKY, alors vérifiez si les Cholesky de toute la matrice réussissent devraient être plus rapides.
Il est vrai qu'un véritable matrice symétrique (resp. Hermitien complexe) est positif semi-défini si et seulement si tous ses mineurs principaux sont non négatifs. Voir La note de John Prouping ICI Correction de la mauvaise stassation a parfois fait qu'il suffit à vérifier que les principaux mineurs principaux sont non négatifs. Ce dernier est nécessaire mais pas suffisant pour une demi-définition positive.
Une bonne solution consiste à calculer tous les mineurs de déterminants et de vérifier qu'ils sont tous non négatifs. P>
Seuls les mineurs principaux.
N'est-ce pas O (n!)? La factorisation de la Cholesky est plus rapide
la décomposition de la Cholesky est une bonne option si vous travaillez avec des matrices définies positives (PD).
Cependant, il jette l'erreur suivante sur une matrice SEMI STRAND> -DEFINITE (PSD) positive,
dire, p> pour les matrices PSD, vous pouvez utiliser EIMPY / NUMPY'S'S Eigh () pour vérifier que toutes les valeurs propres sont non négatives. P> def isPSD(A, tol=1e-8):
E = np.linalg.eigvalsh(A)
return np.all(E > -tol)
En fait, vous pouvez probablement accélérer ISPSD () en remplaçant Eigh () avec Eigvalsh () qui calcule uniquement les valeurs propres (je n'ai pas testé cela).
Je crois que scipy.linalg.eigh (a) code> devrait être modifié vers
np.linalg.eigh (a) code>
Vérifiez si l'ensemble des valeurs propres d'une matrice symétrique Comme nous savons si les deux extrémités du spectre de par ceci, nous n'avons besoin que de calculer deux eigenvalues pour vérifier le PSD, je pense qu'il est très utile pour le grand A code> sont non négatifs de consommer du temps si
A code> est très grand, tandis que le module
sciped.sparse .linalg.arpack code> offre une bonne solution car on peut personnaliser les valeurs propres retournées en spécifiant des paramètres. (voir
scipy.sparse.linalg.arpack code> pour plus d'informations)
A code> sont non négatives, les eigenvalues de repos doivent également être non négatifs. Nous pouvons donc faire comme ça: p>
A code> p> p>
Est-ce que ça va bien avec 'SA' et K = 1?