代码:
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
有什么问题?
当数据中存在inf或nan值时,可能会发生这种情况。
使用它来删除nan值:
ori_data.dropna(inplace=True)
我没有这个问题的答案,但我有没有nans和infs的复制场景。不幸的是,datataset非常大(96MB gzip)。
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'
我知道这篇文章很老,但万一有人遇到同样的问题。 @jseabold是正确的,当他说问题是nan或inf时,当他说数据没有nan或inf时,op可能是正确的。但是,如果ori_data中的一列始终具有相同的值,则数据将获得Nans,因为mlab中的PCA实现通过执行来规范化输入数据
ori_data = (ori_data - mean(ori_data)) / std(ori_data).
解决方案是:
result = PCA(ori_data, standardize=False)
这样,只减去平均值而不除以标准差。
这可能是由于您的输入数据矩阵(您正在向PCA提供)的单一性质
我正在使用numpy 1.11.0。如果矩阵具有等于0的1个以上的eigvalues,则提出“SVD不收敛”。
即使您的数据是正确的,也可能因为内存不足而发生。就我而言,从32位机器转移到具有更大内存的64位机器解决了这个问题。
继@ c-chavez回答之后,对我有用的是首先将inf和-inf替换为nan,然后删除nan。例如:
data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()
如果没有inf或NaN值,可能是内存问题。请尝试使用内存较高的机器。