it-swarm.com.de

erhöhung von LinAlgError ("SVD konvergierte nicht") LinAlgError: SVD konvergierte bei der Bestimmung von matplotlib pca nicht

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)

das ist mein Code. obwohl meine eingabematrix kein nan und inf enthält, erhalte ich den unten angegebenen fehler.

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

was ist das Problem?

14
user 3317704

Dies kann passieren, wenn die Daten inf- oder nan-Werte enthalten.

Verwenden Sie diese Option, um nan-Werte zu entfernen: 

ori_data.dropna(inplace=True)
24
jseabold

Ich habe keine Antwort auf diese Frage, aber ich habe das Reproduktionsszenario mit Nein Nans und Infs. Leider ist das Dataset ziemlich groß (96 MB groß).

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)

welcher Aufstieg:

LinAlgError: SVD did not converge

auf:

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

hat aber keine Ausnahme gemacht bei:

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

Ich weiß, dass dieser Beitrag alt ist, aber falls jemand anderes auf dasselbe Problem stößt. @jseabold hatte recht, als er sagte, das Problem sei nan oder inf, und die Operation sei wahrscheinlich richtig gewesen, als er sagte, dass die Daten weder nans noch inf hätten. Wenn jedoch eine der Spalten in ori_data immer denselben Wert hat, erhalten die Daten Nans, da die Implementierung von PCA in mlab die Eingabedaten normalisiert 

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

Die Lösung ist zu tun: 

result = PCA(ori_data, standardize=False)

Auf diese Weise wird nur der Mittelwert ohne Division durch die Standardabweichung abgezogen.

3
Vlamir

Wenn es keine inf- oder NaN-Werte gibt, liegt möglicherweise ein Speicherproblem vor. Bitte versuchen Sie es in einem Computer mit höherem RAM.

0
Paritosh Gupta

Ich verwende numpy 1.11.0. Wenn die Matrix mehr als 1 Eigwerte gleich 0 hat, wird 'SVD nicht konvergiert' angehoben.

0
nos

Dies kann auf die Singularität Ihrer Eingabedatamatrix zurückzuführen sein (die Sie in PCA einspeisen)

0
Sumit Waghmare

Selbst wenn Ihre Daten korrekt sind, kann es passieren, dass nicht genügend Speicherplatz zur Verfügung steht. In meinem Fall löste der Wechsel von einer 32-Bit-Maschine zu einer 64-Bit-Maschine mit größerem Speicher das Problem.

0
Slava

Nach der Antwort von @ c-chavez funktionierte es für mich, zuerst inf und -inf durch nan zu ersetzen und dann nan zu entfernen. Zum Beispiel:

data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()
0
hevronig