web-dev-qa-db-fra.com

Problème de matrice singulière avec Numpy

J'essaie de multiplier un vecteur (3 par 1) par sa transposition (1 par 3). Je reçois un tableau (3 par 3) mais je ne peux pas obtenir son inverse. Une idée pourquoi?

import numpy as np

c=array([1, 8, 50])
np.transpose(c[np.newaxis]) * c
array([[   1,    8,   50],
   [   8,   64,  400],
   [  50,  400, 2500]])
np.linalg.inv(np.transpose(c[np.newaxis]) * c)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 445, in inv
    return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
  File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 328, in solve
    raise LinAlgError, 'Singular matrix'
LinAlgError: Singular matrix
17
Neerav

La matrice que vous avez collée 

[[   1,    8,   50],
 [   8,   64,  400],
 [  50,  400, 2500]]

A un déterminant de zéro. C'est la définition d'une matrice singulière (pour laquelle l'inverse n'existe pas)

http://en.wikipedia.org/wiki/Invertible_matrix

31
kaveman

Par définition, en multipliant un vecteur 1D par sa transposition, vous avez créé une matrice singulière.

Chaque ligne est une combinaison linéaire de la première ligne. 

Notez que la deuxième ligne ne représente que 8 fois la première ligne.

De même, la troisième ligne est 50x la première ligne.

Il n'y a qu'une seule ligne indépendante dans votre matrice.

28
Joe Kington

Comme cela a déjà été mentionné dans les réponses précédentes, votre matrice ne peut pas être inversée, car son déterminant est 0. Mais si vous souhaitez toujours obtenir une matrice inverse, vous pouvez utiliser np.linalg.pinv, qui utilise SVD pour approcher la matrice initiale.

0
Dilshat