2014-02-17 3 views
6

код:повышение LinAlgError ("SVD не сходятся") LinAlgError: SVD не сходятся в определении PCA Matplotlib

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 

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

ответ

12

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

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

ori_data.dropna(inplace=True) 
+1

Я проверил свои данные в точности. В данных нет никаких inf и nans. Какие еще возможности эта проблема возникает? –

+0

Не могу сказать без минимального рабочего примера. – jseabold

+0

@ user3317704 либо у вас отсутствуют значения, либо недопустимые, могут иметь разные типы в одном столбце и т. Д. Есть ли способ увидеть, как ваш файл проверяет его? Вы пробовали этот ответ и используете функцию «dropna» и все еще получаете ошибку? –

4

У меня нет ответа на этот вопрос, но у меня есть сценарий воспроизведения без каких-либо 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' 
+0

Можете ли вы подать отчет об ошибке? – jseabold

0

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

0

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

0

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

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) 

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

Смежные вопросы