12
votes

Vérifier la définition positive ou la semi-rigidité positive

Je veux vérifier si une matrice est positive de la semi-rigide définitive ou positive à l'aide de Python.

Comment puis-je faire ça? Y a-t-il une fonction dédiée à Scipify pour cela ou dans d'autres modules?


0 commentaires

5 Réponses :


18
votes

Je suppose que vous savez déjà que votre matrice est symétrique.

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.

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".


5 commentaires

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 une méthode directe et est plus rapide que toute autre chose, sauf si vous avez des informations supplémentaires a priori 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.



0
votes

Une méthode plus facile consiste à calculer les déterminants des mineurs pour cette matrx.


2 commentaires

Computing Les déterminants nécessitent des décompositions N 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.



0
votes

Une bonne solution consiste à calculer tous les mineurs de déterminants et de vérifier qu'ils sont tous non négatifs.


2 commentaires

Seuls les mineurs principaux.


N'est-ce pas O (n!)? La factorisation de la Cholesky est plus rapide



11
votes

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> xxx pré>

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)


2 commentaires

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) devrait être modifié vers np.linalg.eigh (a)



5
votes

Vérifiez si l'ensemble des valeurs propres d'une matrice symétrique A sont non négatifs de consommer du temps si A est très grand, tandis que le module sciped.sparse .linalg.arpack offre une bonne solution car on peut personnaliser les valeurs propres retournées en spécifiant des paramètres. (voir scipy.sparse.linalg.arpack pour plus d'informations)

Comme nous savons si les deux extrémités du spectre de A sont non négatives, les eigenvalues ​​de repos doivent également être non négatifs. Nous pouvons donc faire comme ça: xxx

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


1 commentaires

Est-ce que ça va bien avec 'SA' et K = 1?