поднять LinAlgError ("SVD не сходился") LinAlgError: SVD не сходился в определении matplotlib pca

код :

import numpy
from matplotlib.mlab import PCA
file_name = "C:/Documents and Settings/862629/My Documents/53135/programs/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)

Это мой код. хотя моя входная матрица лишена nan и inf, я получаю ошибку, указанную ниже.

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

в чем проблема?

6 ответов


Это может произойти, когда в данных есть значения inf или nan.

используйте это для удаления значений nan:

ori_data.dropna(inplace=True)

у меня нет ответа на этот вопрос, но у меня есть сценарий воспроизведения без Наны и инфы. К сожалению, datataset довольно большой (96MB gzipped).

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)

, которые поднимаются:

LinAlgError: SVD did not converge

on:

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

но не поднял исключение на:

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

Я знаю, что этот пост старый, но если кто-то еще сталкивается с той же проблемой. @jseabold был прав, когда сказал, что проблема в nan или inf, и op, вероятно, был прав, когда он сказал, что данные не имеют nan или inf. Однако, если один из столбцов в ori_data всегда имеет одно и то же значение, данные получат Nans, так как реализация PCA в mlab нормализует входные данные, делая

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

решение состоит в том, чтобы сделать:

result = PCA(ori_data, standardize=False)

таким образом, только значит будет вычитаться без деления на стандартное отклонение.


Это может быть связано с особой природой вашей входной datamatrix (которую вы подаете в PCA)


Я использую numpy 1.11.0. Если матрица имеет более 1 eigvalues равен 0, тогда 'СВД не сходятся' поднимается.


даже если ваши данные верны, это может произойти из-за нехватки памяти. В моем случае переход от 32-разрядной машины к 64-разрядной машине с большей памятью решил проблему.