43 votes

Calculer le classement matriciel à l'aide de scipy

J'aimerais calculer la mathématique rang d'une matrice à l'aide de scipy. La fonction la plus évidente numpy.rank calcule la dimension d'un tableau (c'est à dire. les scalaires avoir de dimension 0, les vecteurs 1, les matrices 2, etc...). Je suis conscient que l' numpy.linalg.lstsq module est équipé de cette fonction, mais je me demandais si une telle opération fondamentale est intégré dans la classe matrix quelque part.

Voici un exemple explicite:

from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)

Cela donne 2 de la dimension, où je suis à la recherche d'une réponse de l' 3.

62voto

Simon Points 8717

Numpy fournit numpy.linalg.matrix_rank() :

 >>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3
 

15voto

Fournir un extrait de code approximatif aux personnes qui en ont besoin dans la pratique. N'hésitez pas à vous améliorer.

 u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
 

7voto

Escualo Points 12584

Si numpy n'offre pas un rang installation, pourquoi ne pas écrire votre propre?

Un moyen efficace pour calculer le rang est par l'intermédiaire de la Décomposition en valeurs Singulières - le rang de la matrice est égal au nombre de non-zéro valeurs singulières.

def rank(A, eps=1e-12):
    u, s, vh = numpy.linalg.svd(A)
     return len([x for x in s if abs(x) > eps])

Notez que eps dépend de votre application - la plupart seraient d'accord que 1e-12 correspond à zéro, mais vous peut être témoin d'instabilité numérique, même pour les eps=1e-9.

À l'aide de votre exemple, la réponse est de trois. Si vous modifiez la deuxième ligne d' [2, 6, 14] (linéairement dépendante avec une ligne), la réponse est de deux (le "zéro" de valeur propre est 4.9960 E-16)

3voto

Mike Graham Points 22480

Cette réponse est obsolète.

La réponse est non-il n'y a actuellement aucune fonction dédiée au calcul du rang de matrice d'un tableau / matrice dans scipy. En ajouter un a déjà été discuté, mais si cela va arriver, je ne crois pas que ce soit déjà le cas.

1voto

Brooks Moses Points 6205

Je ne sais pas à propos de Numpy en particulier, mais qui est peu susceptible d'être intégré dans l'opération sur une matrice; elle implique assez intensive des calculs numériques (associée à des préoccupations au sujet de virgule flottante de l'erreur d'arrondi et ainsi de suite) et le seuil des sélections qui peut ou peut ne pas être appropriée dans un contexte donné, et de l'algorithme de sélection est important de l'informatique avec précision et rapidement.

Les choses qui sont intégrés dans les classes de base ont tendance à être des choses qui peuvent être effectuées dans un unique et de façon simple, comme la matrice de multiplications à la plus complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X