代码:
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
问题是什么?
答案 0 :(得分:24)
当数据中存在inf或nan值时,可能会发生这种情况。
使用此选项删除nan值:
ori_data.dropna(inplace=True)
答案 1 :(得分:5)
我对这个问题没有答案,但我有没有的复制方案 nans和infs。不幸的是,datataset非常大(压缩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'
答案 2 :(得分:3)
我知道这篇文章很老,但万一有人遇到同样的问题。 @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)
这样,只减去平均值而不除以标准差。
答案 3 :(得分:1)
当我不小心将图像数据集的大小调整为(0,64,3)时,这发生在我身上。尝试检查数据集的形状,以查看维度之一是否为0。
答案 4 :(得分:0)
这可能是由于输入数据矩阵的特殊性质(您正在向PCA提供)
答案 5 :(得分:0)
我正在使用numpy 1.11.0。如果矩阵的1个以上的eigvalues等于0,那么“SVD不会收敛”就会被提升。
答案 6 :(得分:0)
即使您的数据正确,也可能因为内存不足而发生。就我而言,从32位机器转移到具有更大内存的64位机器解决了这个问题。
答案 7 :(得分:0)
在@ c-chavez答案之后,对我有用的是先将inf和-inf替换为nan,然后删除nan。 例如:
data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()
答案 8 :(得分:0)
如果没有inf或NaN值,则可能是内存问题。请尝试使用具有更高RAM的计算机。