podnieść LinAlgError ("SVD nie zbiegł się") LinAlgError: SVD nie pasuje do definicji pca matplotlib


kod :
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)

to jest mój kod. chociaż moja macierz wejściowa jest pozbawiona nan i inf, otrzymuję poniższy błąd.
raise LinAlgError("SVD did not converge") LinAlgError: SVD did not converge

Jaki jest problem?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Może się tak zdarzyć, jeśli dane zawierają wartości inf lub nan.
Użyj tego, aby usunąć wartości nan:
ori_data.dropna(inplace=True)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że ten post jest stary, ale na wypadek, gdyby ktoś inny napotkał ten sam problem. @jseabold miał rację, gdy powiedział, że problem to nan lub inf, a op prawdopodobnie miał rację, gdy powiedział, że dane nie mają nan ani inf. Jeśli jednak jedna z kolumn w ori_data ma zawsze tę samą wartość, dane otrzymają Nans, ponieważ implementacja PCA w mlab normalizuje dane wejściowe, wykonując
ori_data = (ori_data - mean(ori_data))/std(ori_data).

Rozwiązaniem jest:
result = PCA(ori_data, standardize=False)

W związku z tym tylko średnia zostanie odjęta bez dzielenia przez odchylenie standardowe.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie mam odpowiedzi na to pytanie, ale mam scenariusz propagacji bez
Nana i informacje. Niestety zbiór danych jest dość duży (96 MB spakowany gzipem).
import numpy as np
from StringIO import StringIO
from scipy import linalg
import urllib2
import gzipurl = '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)

jakiej wysokości:
LinAlgError: SVD did not converge

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

ale nie zgłosił wyjątku do:
>>> np.__version__
'1.8.2'
>>> import scipy
>>> scipy.__version__
'0.14.0'
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli nie ma wartości inf lub NaN, może to być problem z pamięcią. Spróbuj na komputerze z większą pamięcią RAM.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po odpowiedzi @ c-chavez, co zadziałało, to najpierw zastąpienie inf i -in przez nan, a następnie usunięcie nan.
Na przykład:
data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Może to wynikać ze szczególnego charakteru macierzy danych wejściowych (którą przekazujesz do PCA)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nawet jeśli dane są poprawne, może się to zdarzyć z powodu niewystarczającej ilości pamięci. W moim przypadku przejście z maszyny 32-bitowej na 64-bitową z większą ilością pamięci rozwiązało problem.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zdarzyło mi się to, gdy przypadkowo zmieniłem rozmiar zestawu danych obrazu na (0, 64, 3). Spróbuj sprawdzić kształt swojego zbioru danych, aby zobaczyć, czy jeden z wymiarów ma wartość 0.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używam numpy 1.11.0. Jeśli macierz ma więcej niż 1 wartość własną równą 0, wówczas podniesiony zostanie komunikat „SVD nie zbieżny”.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się