2014-02-17 122 views
6

代碼:提高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 

有什麼問題?

回答

12

這可能發生在數據中有inf或nan值時。

使用此刪除NaN值:

ori_data.dropna(inplace=True) 
+1

我已經檢查過我的數據了..數據中沒有inf和nans ..這個錯誤是否會引發其他的可能性? –

+0

沒有最低限度的工作示例,我無法分辨。 – jseabold

+0

@ user3317704無論您有缺失值還是無效值,可能在同一列中都有不同類型,等等。有沒有辦法讓我們看到您的文件來驗證它?你有沒有試過這個答案,並使用「dropna」函數,仍然得到錯誤? –

4

我沒有回答這個問題,但我有沒有 NaN和INF中再現場景。不幸的是,數據集非常大(96MB壓縮)。

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

這可能是由於的奇異性質你的輸入數據矩陣(你是feedi ng至PCA)

0

我正在使用numpy 1.11.0。如果矩陣的1個以上的eigvalues等於0,那麼'SVD不會收斂'。

0

即使您的數據是正確的,也可能因爲內存不足而發生。在我的情況下,從32位機器轉移到具有更大內存的64位機器解決了這個問題。

0

我知道這個帖子是舊的,但萬一別人遇到同樣的問題。 @jseabold說他的問題是nan或inf,當他說數據沒有nan或inf時,他可能是正確的。但是,如果在ori_data其中一列始終相同的值,數據會得到NaN的,因爲PCA在MLAB實施做

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

解決方案標準化的輸入數據是要做到:

result = PCA(ori_data, standardize=False) 

以這種方式,只有平均值將被除以標準偏差而被減去。