Je suppose que vous connaissez déjà votre matrice est symétrique.
Un bon test positif pour la précision (en fait, la norme !) est d'essayer de calculer la factorisation de Cholesky. Il réussit iff votre matrice est définie positive.
C'est la façon la plus directe, car il a besoin de O(n^3) opérations (avec une petite constante), et vous aurait besoin d'au moins n de la matrice-vecteur de multiplications pour tester "directement".
je me demandait si il y a une méthode directe pour que. Merci quand même c'est le moyen le plus direct pour tester Ce est une méthode directe, et est plus rapide que n'importe quoi d'autre, sauf si vous avez d'autres a priori informations sur la matrice. Pour le semi-définie positive s'il reste vrai que un résumé de la proposition qu'une réelle symétrique (ou complexe Hermitian) de la matrice est semi-définie positive si et seulement si une factorisation de Cholesky existe. Avec une matrice définie positive de la d'habitude algorithme réussit, car tous les diagonales des entrées de L s.t. A =LL' sont positifs (une racine carrée d'être pris). Si l'on touche un zéro de pivot, le calcul s'arrête, mais la théorie se tient. en effet, l'existence de la décomposition de cholesky pour semidefinite matrices tient que par une limitation de l'argument.
La décomposition de Cholesky est une bonne option si vous travaillez avec définie positive (PD) des matrices.
Cependant, il jette le message d'erreur suivant sur positif semi-définie (PSD) de la matrice,
dire,
A = np.zeros((3,3))// the all-zero matrix is a PSD matrix
np.linalg.cholesky(A)LinAlgError:Matrixisnot positive definite -Cholesky decomposition cannot be computed
Pour PSD matrices, vous pouvez utiliser scipy/numpy de dix() pour vérifier que toutes les valeurs propres sont non-négatives.
>> E,V = scipy.linalg.eigh(np.zeros((3,3)))>> E
array([0.,0.,0.])
Cependant, vous aurez probablement rencontrer numérique des problèmes de stabilité.
Pour surmonter ces, vous pouvez utiliser la fonction suivante.
Qui retourne True en cas de matrices qui sont environ PSD jusqu'à un certain seuil de tolérance.
En fait, vous pouvez probablement s'accélérer isPSD() par le remplacement de huit() avec eigvalsh() qui ne calcule les valeurs propres (je n'ai pas testé). Je crois que scipy.linalg.eigh(A) doit être modifié pour np.linalg.eigh(A)
Vérifier si l'ensemble de valeurs propres d'une matrice symétrique A sont non-négatives est temps si A est très grand, tandis que le module scipy.sparse.linalg.arpack offre une bonne solution car on peut personnaliser le retour de valeurs propres par la spécification des paramètres.(voir Scipy.éparses.linalg.arpack pour plus d'informations)
Comme nous le savons si les deux extrémités du spectre de A sont non-négatif, puis le reste de valeurs propres doivent également être non-négatif. Donc on peut faire comme ceci:
from scipy.sparse.linalg import arpack
def isPSD(A, tol =1e-8):
vals, vecs = arpack.eigsh(A, k =2, which ='BE')# return the ends of spectrum of Areturn np.all(vals >-tol)
Nous avons seulement besoin de calculer deux valeurs propres de vérifier PSD, je pense que c'est très utile pour les grandes A
une méthode plus simple consiste à calculer les déterminants des mineurs pour ce matrx.
Le calcul de déterminants requiert n LU/QR/Cholesky de décompositions, il suffit donc de vérifier si Cholesky de l'ensemble de la matrice réussit devrait être plus rapide. Il est vrai qu'une réelle symétrique (resp. complexe Hermitian) de la matrice est semi-définie positive si et seulement si tous ses principaux mineurs sont non négatifs. Voir le note John Prussing ici corriger l'inexactitude parfois, il suffit de cocher le principal, les mineurs sont non négatifs. Cette dernière est nécessaire, mais pas suffisante, pour positive semi-précision.
Je suppose que vous connaissez déjà votre matrice est symétrique.
Un bon test positif pour la précision (en fait, la norme !) est d'essayer de calculer la factorisation de Cholesky. Il réussit iff votre matrice est définie positive.
C'est la façon la plus directe, car il a besoin de O(n^3) opérations (avec une petite constante), et vous aurait besoin d'au moins n de la matrice-vecteur de multiplications pour tester "directement".
c'est le moyen le plus direct pour tester
Ce est une méthode directe, et est plus rapide que n'importe quoi d'autre, sauf si vous avez d'autres a priori informations sur la matrice.
Pour le semi-définie positive s'il reste vrai que un résumé de la proposition qu'une réelle symétrique (ou complexe Hermitian) de la matrice est semi-définie positive si et seulement si une factorisation de Cholesky existe. Avec une matrice définie positive de la d'habitude algorithme réussit, car tous les diagonales des entrées de L s.t. A =LL' sont positifs (une racine carrée d'être pris). Si l'on touche un zéro de pivot, le calcul s'arrête, mais la théorie se tient.
en effet, l'existence de la décomposition de cholesky pour semidefinite matrices tient que par une limitation de l'argument.
OriginalL'auteur Alexandre C.
La décomposition de Cholesky est une bonne option si vous travaillez avec définie positive (PD) des matrices.
Cependant, il jette le message d'erreur suivant sur positif semi-définie (PSD) de la matrice,
dire,
Pour PSD matrices, vous pouvez utiliser scipy/numpy de dix() pour vérifier que toutes les valeurs propres sont non-négatives.
Cependant, vous aurez probablement rencontrer numérique des problèmes de stabilité.
Pour surmonter ces, vous pouvez utiliser la fonction suivante.
Qui retourne True en cas de matrices qui sont environ PSD jusqu'à un certain seuil de tolérance.
Je crois que
scipy.linalg.eigh(A)
doit être modifié pournp.linalg.eigh(A)
OriginalL'auteur Tomer Levinboim
Vérifier si l'ensemble de valeurs propres d'une matrice symétrique
A
sont non-négatives est temps siA
est très grand, tandis que le modulescipy.sparse.linalg.arpack
offre une bonne solution car on peut personnaliser le retour de valeurs propres par la spécification des paramètres.(voirScipy.éparses.linalg.arpack
pour plus d'informations)Comme nous le savons si les deux extrémités du spectre de
A
sont non-négatif, puis le reste de valeurs propres doivent également être non-négatif. Donc on peut faire comme ceci:Nous avons seulement besoin de calculer deux valeurs propres de vérifier PSD, je pense que c'est très utile pour les grandes
A
OriginalL'auteur LittleLittleQ
une méthode plus simple consiste à calculer les déterminants des mineurs pour ce matrx.
n
LU/QR/Cholesky de décompositions, il suffit donc de vérifier si Cholesky de l'ensemble de la matrice réussit devrait être plus rapide.Il est vrai qu'une réelle symétrique (resp. complexe Hermitian) de la matrice est semi-définie positive si et seulement si tous ses principaux mineurs sont non négatifs. Voir le note John Prussing ici corriger l'inexactitude parfois, il suffit de cocher le principal, les mineurs sont non négatifs. Cette dernière est nécessaire, mais pas suffisante, pour positive semi-précision.
OriginalL'auteur sramij
Une bonne solution est de calculer toutes les mineurs de déterminants et de vérifier qu'elles sont toutes non-négatifs.
OriginalL'auteur sramij