提升LinAlgError(“SVD没有收敛”)LinAlgError:SVD没有收敛于matplotlib pca确定

时间:2014-02-17 11:16:57

标签: python matplotlib pca

代码:

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

问题是什么?

9 个答案:

答案 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的计算机。