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

问题描述 投票:14回答:7

代码:

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

有什么问题?

python matplotlib pca
7个回答
26
投票

当数据中存在inf或nan值时,可能会发生这种情况。

使用它来删除nan值:

ori_data.dropna(inplace=True)

5
投票

我没有这个问题的答案,但我有没有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'

4
投票

我知道这篇文章很老,但万一有人遇到同样的问题。 @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)

这样,只减去平均值而不除以标准差。


0
投票

这可能是由于您的输入数据矩阵(您正在向PCA提供)的单一性质


0
投票

我正在使用numpy 1.11.0。如果矩阵具有等于0的1个以上的eigvalues,则提出“SVD不收敛”。


0
投票

即使您的数据是正确的,也可能因为内存不足而发生。就我而言,从32位机器转移到具有更大内存的64位机器解决了这个问题。


0
投票

继@ c-chavez回答之后,对我有用的是首先将inf和-inf替换为nan,然后删除nan。例如:

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

0
投票

如果没有inf或NaN值,可能是内存问题。请尝试使用内存较高的机器。

© www.soinside.com 2019 - 2024. All rights reserved.