【问题标题】:raise LinAlgError("SVD did not converge") LinAlgError: SVD did not converge in matplotlib pca determinationraise LinAlgError("SVD没有收敛") LinAlgError: SVD没有在matplotlib pca确定中收敛
【发布时间】:2014-02-17 11:16:57
【问题描述】:

代码:

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

有什么问题?

【问题讨论】:

  • 这给了我一个错误AttributeError: 'numpy.ndarray' object has no attribute 'dropna',你是怎么让它工作的?

标签: python matplotlib pca


【解决方案1】:

当数据中有 inf 或 nan 值时会发生这种情况。

使用它来删除 nan 值:

ori_data.dropna(inplace=True)

【讨论】:

  • 我已经彻底检查了我的数据.. 数据中没有 inf 和 nans.. 还有什么其他可能性会引发此错误?
  • @user3317704 您有缺失值或无效值,同一列中可能有不同的类型,等等。有没有一种方法可以让我们查看您的文件来验证它?您是否尝试过这个答案,并使用“dropna”功能仍然收到错误?
  • @user3317704 我遇到了同样的问题,但是在调试过程中,我注意到我错误地连接了两个数据帧,所以新的数据帧只包含 NaN 值
  • 我不明白,在输入到 SVD 之前或何时运行ori_data.dropna(inplace=True)
  • 这给了我一个错误AttributeError: 'numpy.ndarray' object has no attribute 'dropna'
【解决方案2】:

我知道这篇文章很旧,但以防其他人遇到同样的问题。 @jseabold 说问题是 nan 或 inf 时是对的,而当他说数据没有 nan 或 inf 时操作可能是正确的。但是,如果 ori_data 中的一列始终具有相同的值,则数据将获得 Nans,因为 mlab 中的 PCA 实现通过执行对输入数据进行归一化

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

解决办法是:

result = PCA(ori_data, standardize=False)

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

【讨论】:

    【解决方案3】:

    如果没有 inf 或 NaN 值,则可能是内存问题。请在 RAM 更大的机器上尝试。

    【讨论】:

    • 这是我的问题,我没有 nan 值,但打开任务管理器显示我的 RAM 已用尽。
    • 为什么错误信息没有提到内存或OMM?似乎很神秘,它会警告 svd...
    【解决方案4】:

    我没有这个问题的答案,但我有没有的复制场景 nans 和 infs。不幸的是,数据集非常大(压缩后为 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'
    

    【讨论】:

    • 你能提交错误报告吗?
    • 那么问题的根源是什么?
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        这可能是由于您的输入数据矩阵(您将其提供给 PCA)的奇异性质

        【讨论】:

          【解决方案8】:

          当我不小心将图像数据集的大小调整为 (0, 64, 3) 时,这发生在我身上。尝试检查数据集的形状,看看其中一个维度是否为 0。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-05
              • 1970-01-01
              • 1970-01-01
              • 2014-08-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多