поднять 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)
таким образом, только значит будет вычитаться без деления на стандартное отклонение.
Я использую numpy 1.11.0. Если матрица имеет более 1 eigvalues равен 0, тогда 'СВД не сходятся' поднимается.
даже если ваши данные верны, это может произойти из-за нехватки памяти. В моем случае переход от 32-разрядной машины к 64-разрядной машине с большей памятью решил проблему.