/ / Déterminer si le déterminant est exactement nul - python, math, numpy, algèbre linéaire

Déterminer si le déterminant est exactement égal à zéro - python, math, numpy, linear-algebra

J'ai beaucoup de 10 par 10 (0,1) -matrices et je voudrais déterminer lesquelles ont un déterminant exactement 0 (c'est-à-dire qui sont singulières). En utilisant scipy.linalg.det Je reçois un nombre en virgule flottante que je dois tester pour voir s'il est proche de zéro. Est-il possible de faire le calcul exactement pour que je puisse être sûr de ne pas trouver de faux positifs?

D'autre part, peut-être existe-t-il une garantie sur la plus petite valeur propre pouvant être utilisée pour s'assurer que la méthode de la virgule flottante ne donne jamais un résultat faux positif?

Réponses:

3 pour la réponse № 1

Tant que vous utilisez des flotteurs, vous ne pouvez pas garantir que vous obtiendrez exactement zéro. Je voudrais utiliser ceci:

scipy.allclose(det, 0)

Vous pouvez contrôler la tolérance avec les kwargs.


Dans votre cas (matrices 10x10 avec 0,1 éléments), vous ne devriez pas avoir à vous soucier des faux positifs.

Je n’ai pas de preuve pour ça, mais c’est justeintuition géométrique: le groupe de 10 vecteurs avec des éléments 0/1 ne peut pas être "presque" linéairement dépendant de la manière qui vous serait nécessaire pour obtenir un faux positif en utilisant des flottants. En tant que vecteurs leurs "directions" sont nécessairement discrets / atomiques si les éléments sont en 0,1.

Pensez au cas 3D et généralisez vos pensées dans un espace à 10 dimensions;)


3 pour la réponse № 2

Vous pouvez utiliser l’élimination gaussienne pour amener lematrice à une forme triangulaire. Puisque vos éléments sont tous égaux à 0 ou 1, le calcul même en utilisant l'arithmétique à virgule flottante sera exact (vous ne faites que multiplier / diviser / ajouter / soustraire par -1, 0 et 1, ce qui est exact).

Le déterminant est alors 0 si un élément de la diagonale est nul et non nul sinon.

Donc, pour cet algorithme spécifique (élimination gaussienne), le calcul du déterminant sera exact même en arithmétique en virgule flottante.

Cet algorithme devrait également être assez efficace. Il peut même être implémenté en utilisant des entiers, ce qui est plus rapide et montre même de manière plus évidente que le problème peut être résolu exactement.

MODIFIER: le fait est qu'un algorithme qui fonctionne sur la matrice 0,1 peut être exact. Cela dépend de l'algorithme. Je voudrais vérifier comment det () est mis en œuvre et peut-être, il n'y a pas de problème avec le bruit numérique, et, en fait, vous pouvez simplement tester det (M) == 0.0 et ne pas obtenir de faux négatifs ni de faux positifs.


1 pour la réponse № 3

Je pense que vous devriez envisager d'examiner le numéro de condition plutôt que le déterminant. En python, vous voudriez

numpy.linalg.cond(x, p=None)

Référence http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.cond.html.

C’était le conseil du prof de mathématiques appliquées de la coursera sur l'informatique scientifique. Essentiellement, le numéro de condition vous donnera la meilleure indication de l’instabilité numérique pour des opérations telles que l’inversion de matrice, etc., ce qui vous intéresse probablement. Voir cette réponse sur scicomp stackexchange pour plus de détails.


0 pour la réponse № 4

que diriez-vous des lots d’essai en jouant avec la tolérance, puis décidez de la tolérance maximale acceptable, rincez et répétez: http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html


0 pour la réponse № 5

Comme les entrées dans les matrices sont 1 ou 0, la plus petite valeur absolue non-nulle d'un déterminant est 1. Il n'y a donc pas lieu de craindre une vraie valeur non nulle très proche de 0.

Alternativement, on peut apparemment utiliser sympy pour obtenir une réponse exacte.