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

код:

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)

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

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

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

Ответ 1

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

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

ori_data.dropna(inplace=True)

Ответ 2

У меня нет ответа на этот вопрос, но у меня есть сценарий воспроизведения без nans и infs. К сожалению, набор данных довольно большой (96 МБ 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

на

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

но не вызывает исключения:

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

Ответ 3

Я знаю, что этот пост старый, но в случае, если кто-то сталкивается с той же проблемой. @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)

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

После ответа @c-chavez у меня сработало сначала заменить inf и -inf на nan, а затем удалить nan. Например:

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

Ответ 8

Если значения inf или NaN отсутствуют, возможно, это проблема памяти. Пожалуйста, попробуйте в машине с более высокой оперативной памятью.