LinalGError verhogen (“SVD heeft”) Linalgerror niet convergeren: SVD heeft zich niet samengevoegd in Matplotlib PCA-bepaling

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)

Dit is mijn code. Hoewel mijn invoermatrix verstoken is van de NAN en INF, krijg ik de hieronder vermelde fout.

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

Wat is het probleem?


Antwoord 1, Autoriteit 100%

Dit kan gebeuren wanneer er INF- of NAN-waarden in de gegevens zijn.

Gebruik dit om NAN-waarden te verwijderen:

ori_data.dropna(inplace=True)

Antwoord 2, Autoriteit 30%

Ik weet dat dit bericht oud is, maar in het geval dat iemand anders hetzelfde probleem tegenkomt. @jseabold was goed toen hij zei dat het probleem NAN of INF is en het OP was waarschijnlijk goed toen hij zei dat de gegevens geen NAN’s of Inf hadden. Als een van de kolommen in ORI_DATA echter altijd dezelfde waarde heeft, krijgen de gegevens nans, aangezien de implementatie van PCA in MLAB de invoergegevens normaliseert door

te doen

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

De oplossing is om te doen:

result = PCA(ori_data, standardize=False)

Op deze manier wordt alleen het gemiddelde afgetrokken zonder te delen door de standaarddeviatie.


Antwoord 3, Autoriteit 15%

Als er geen INF- of NAN-waarden zijn, mogelijk is dat een geheugenprobleem. Probeer alsjeblieft in een machine met een hoger ram.


Antwoord 4, Autoriteit 13%

Ik heb geen antwoord op deze vraag, maar ik heb het reproductiescenario zonder
nans en Infs. Helaas is de datataset behoorlijk groot (96 MB getipt).

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)

die stijgen:

LinAlgError: SVD did not converge

Aan:

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

maar heeft geen uitzondering opgeleverd op:

>>> np.__version__
'1.8.2'
>>> import scipy
>>> scipy.__version__
'0.14.0'

Antwoord 5, Autoriteit 4%

Zelfs als uw gegevens correct zijn, kan het gebeuren omdat het uit het geheugen heeft. In mijn geval, verplaatsen van een 32-bits machine tot een 64-bits machine met een groter geheugen het probleem.


Antwoord 6, Autoriteit 4%

Volgen op @ C-Chavez antwoord, wat voor mij werkte, vervangte eerst Inf en -inf naar Nan en vervolgens Nan verwijderen.
Bijvoorbeeld:

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

Antwoord 7, Autoriteit 2%

Dit kan te wijten zijn aan de unieke aard van uw invoerdatamatrix (die u aan PCA voedt)


Antwoord 8, Autoriteit 2%

Dit is me overkomen toen ik per ongeluk een beeldgegevensset zou wijzigen aan (0, 64, 3). Probeer de vorm van uw dataset te controleren om te zien of een van de afmetingen 0 is.


Antwoord 9

Ik gebruik numpy 1.11.0. Als de matrix meer dan 1 eigvalues gelijk is aan 0, dan is ‘SVD niet samengevoegd’.

Other episodes