引发LinAlgError(“SVD未收敛”)LinAlgError:在matplotlib pca确定中,SVD未收敛。

48

代码:

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)

虽然我的输入矩阵中没有naninf,但我仍然会遇到以下错误:

    raise LinAlgError("SVD did not converge")
LinAlgError: SVD did not converge

有什么问题吗?


这个代码给我报错了,显示AttributeError: 'numpy.ndarray' object has no attribute 'dropna',你是怎么让它正常工作的? - Charlie Parker
11个回答

57

当数据中存在inf或nan值时,就会出现这种情况。

使用以下方法来删除nan值:

ori_data.dropna(inplace=True)

11
我已经彻底检查了我的数据,数据中没有出现inf和nan。那么这个错误出现的其他可能性是什么? - user 3317704
1
@user3317704,你的数据可能存在缺失值或无效值,同一列中可能有不同类型的值等问题。我们能否查看您的文件以进行验证?您尝试过这个答案并使用“dropna”函数,但仍然出现错误吗? - c-chavez
1
@user3317704 我遇到了同样的问题,但在调试过程中,我注意到我错误地连接了两个数据框,所以新的数据框只包含 NaN 值。 - 32cupo
我不明白,我应该在哪里运行 ori_data.dropna(inplace=True),是在输入到SVD之前还是之后? - Charlie Parker
这给我一个错误:AttributeError: 'numpy.ndarray' object has no attribute 'dropna' - Charlie Parker

25

我知道这篇文章很旧,但如果有人遇到了同样的问题。@jseabold说问题是nan或inf,而且op可能是对的,数据没有nan或inf。然而,如果ori_data中的某一列始终具有相同的值,则数据将变为NaN,因为mlab中PCA的实现通过执行来规范化输入数据。

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

解决方案是做:

result = PCA(ori_data, standardize=False)

通过这种方式,只会减去平均值,而不会除以标准差。


10

如果没有inf或NaN值,那可能是内存问题。请尝试在具有更高RAM的机器上运行。


这是我的问题,我没有nan值,但打开任务管理器显示我已经用满了内存。 - Eric Hedengren
为什么错误信息没有提到内存或OMM?看起来很神秘,它会警告svd而不是其他东西... - Charlie Parker

7

我没有对这个问题的答案,但我有一个没有NaN和Inf的复制场景。不幸的是,数据集相当大(96MB 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'

2
你能否提交一个错误报告? - jseabold
那么这个 bug 的来源是什么? - Charlie Parker

4

继 @c-chavez 的答案之后,对我有效的方法是先将 inf 和 -inf 替换为 nan,然后移除 nan。例如:

data = data.replace(np.inf, np.nan).replace(-np.inf, np.nan).dropna()

3

这可能是由于您输入的datamatrix具有独特性(您正在将其提供给PCA)。


3
即使您的数据是正确的,也可能因为内存不足而出现问题。在我的情况下,从32位机器转移到具有更大内存的64位机器解决了这个问题。

3

我多次遇到了这个错误:

  • 如果数据的长度为1。那么它无法匹配任何内容
  • 如果一个值是无限大。你在处理中除以0了吗?
  • 如果一个值是。这很常见。

2

当我意外地将图像数据集的大小调整为(0,64,3)时,出现了这种情况。请检查您的数据集的形状,看看是否有一个维度为0。


1
我正在使用numpy 1.11.0。如果矩阵有超过1个等于0的特征值,则会引发“SVD未收敛”的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接