Calculer le Rang de la Matrice à l'aide de scipy
Je voudrais calculer la mathématiques 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 le 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
la dimension, où je suis à la recherche d'une réponse de 3
.
- J'ai vérifié le rang à l'aide de Mathematica - c'est en effet 3. La fonction que vous appelez dans Python est incorrect ou que vous l'utilisez mal.
- L'utilisation est correcte - c'est ce qui m'a dérouté à la première place. Dans le post que j'ai expliquer que rang: il calcule la dimension de la matrice. Un "grade 3" tableau serait une liste de listes de listes.
- Notez que le terme "grade" est quelque peu ambigu. Pour un tenseur, le titre vous indique le nombre d'indices (par exemple, un scalaire est un rang 0 tenseur, un vecteur de rang 1 et une matrice de rang 2). Pour l'algèbre linéaire il y a aussi la définition que vous citez ci-dessus. À partir de la docstring, il est clair que Numpy utilise l'ancien.
Vous devez vous connecter pour publier un commentaire.
Numpy fournit
numpy.linalg.matrix_rank()
:De fournir une rude extrait de code pour les personnes qui ont besoin d'obtenir ce fait dans la pratique. N'hésitez pas à améliorer.
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.
Avis 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 de
[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)Cette réponse est hors de date.
La réponse est non—il n'y a actuellement pas de fonction dédiée pour le calcul de la matrice de rang d'une matrice/matrice dans scipy. L'ajout de l'un a été discuté avant, mais si ça va arriver, je ne crois pas qu'il a encore.
numpy.linalg.matrix_rank()
. Voir ma réponse.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.
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.
La fonctions d'algèbre linéaire sont généralement regroupés dans
numpy.linalg
. (Ils sont également disponibles à partir descipy.linalg
, qui a plus de fonctionnalités.) Cela permet le polymorphisme: les fonctions peuvent accepter aucune des types de SciPy poignées.Donc, oui, la
numpy.linalg.lstsq
fonction fait ce que vous demandez. Pourquoi est-ce insuffisant?scipy
contient maintenant une efficace la méthode d'interpolation pour estimer le rang d'une matrice/LinearOperator à l'aide de random méthodes, qui peuvent souvent être assez précis: