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?
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)
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'
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.
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é.
Cela peut être dû au caractère singulier de votre datamatrix d’entrée (que vous transmettez à PCA)
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.