web-dev-qa-db-fra.com

raise LinAlgError ("SVD n'a pas convergé") LinAlgError: SVD n'a pas convergé dans la détermination de pca de matplotlib

code: 

import numpy
from matplotlib.mlab import PCA
file_name = "store1_pca_matrix.txt"
ori_data = numpy.loadtxt(file_name,dtype='float', comments='#', delimiter=None,                 converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
result = PCA(ori_data)

c'est mon code. bien que ma matrice d'entrée soit dépourvue de nan et d'inf, j'obtiens l'erreur indiquée ci-dessous.

raise LinAlgError("SVD did not converge") LinAlgError: SVD did not converge

quel est le problème?

14
user 3317704

Cela peut arriver quand il y a des valeurs inf ou nan dans les données.

Utilisez ceci pour supprimer les valeurs nan: 

ori_data.dropna(inplace=True)
24
jseabold

Je n'ai pas de réponse à cette question mais j'ai le scénario de reproduction avec no Nans et infs. Malheureusement, le jeu de données est assez volumineux (96 Mo compressé).

import numpy as np
from StringIO import StringIO
from scipy import linalg
import urllib2
import gzip

url = 'http://physics.muni.cz/~vazny/gauss/X.gz'
X = np.loadtxt(gzip.GzipFile(fileobj=StringIO(urllib2.urlopen(url).read())), delimiter=',')
linalg.svd(X, full_matrices=False)

qui montent:

LinAlgError: SVD did not converge

sur:

>>> np.__version__
'1.8.1'
>>> import scipy
>>> scipy.__version__
'0.10.1'

mais n'a pas soulevé d'exception sur:

>>> np.__version__
'1.8.2'
>>> import scipy
>>> scipy.__version__
'0.14.0'
5
Jiří Polcar

Je sais que ce post est vieux, mais au cas où quelqu'un d'autre rencontrerait le même problème. @jseabold avait raison quand il a dit que le problème était nan ou inf et que l'op avait probablement raison lorsqu'il a déclaré que les données n'avaient ni nan ni inf. Cependant, si l'une des colonnes de ori_data a toujours la même valeur, les données obtiendront des Nans, car la mise en oeuvre de PCA dans mlab normalise les données d'entrée en faisant 

ori_data = (ori_data - mean(ori_data)) / std(ori_data).

La solution est de faire: 

result = PCA(ori_data, standardize=False)

De cette manière, seule la moyenne sera soustraite sans division par l’écart type.

3
Vlamir

J'utilise numpy 1.11.0. Si la matrice a plus de 1 valeurs propres égales à 0, le message 'SVD n'a pas convergé' est alors généré.

0
nos

Cela peut être dû au caractère singulier de votre datamatrix d’entrée (que vous transmettez à PCA)

0
Sumit Waghmare

Même si vos données sont correctes, cela peut arriver car elles manquent de mémoire. Dans mon cas, le passage d'une machine 32 bits à une machine 64 bits avec une mémoire plus importante a résolu le problème.

0
Slava