【问题标题】:sklearn PCA producing numpy.linalg.linalg.LinAlgErrorsklearn PCA 产生 numpy.linalg.linalg.LinAlgError
【发布时间】:2015-07-07 20:39:08
【问题描述】:

我想在矩阵上运行 pca,但只得到一个 numpy.linalg.linalg.LinAlgError。 我附上了矩阵和我的代码。

在此处获取矩阵:http://workupload.com/file/YvSVhGJA

import numpy as np
from sklearn.decomposition import PCA
matrix = np.load("matrix.npy")
transformed = PCA(n_components=3).fit_transform(matrix)

这是完整的堆栈跟踪,但我认为您可以重现它。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/anaconda/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 242, in fit_transform
    U, S, V = self._fit(X)
  File "/home/user/anaconda/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 275, in _fit
    U, S, V = linalg.svd(X, full_matrices=False)
  File "/home/user/anaconda/lib/python2.7/site-packages/scipy/linalg/decomp_svd.py", line 109, in svd
    raise LinAlgError("SVD did not converge")
numpy.linalg.linalg.LinAlgError: SVD did not converge

感谢任何帮助。

PS:

np.__version__
'1.9.2'

sklearn.__version__
'0.15.2'

PPS:我正在运行 Linux

【问题讨论】:

  • 我正在调查。这不完全是您问题的答案,但您可以使用 RandomizedPCA 作为替代方案,我没有收到任何错误。
  • 我无法在我的 Mac 上重现此内容。
  • @cel 错误来自 lapack 例程。您可能有一个不同的版本在计算 SVD 方面做得更好。
  • @user3914041,可能,但很难相信。我也用anaconda运行代码,所以我没有自己编译numpy/scipy。为什么lapack 附带的lapack 实现应该对osx 有更好的算法?
  • Anaconda 加速:numpy 1.9.2,sklearn 15.2。无法重现此错误(ubuntu 64 位(

标签: python numpy anaconda pca svd


【解决方案1】:

它适用于 Mac,我想这对你没有多大帮助。
试试X[:,:100] 然后:1000 ?

LAPACK tests for SVD;他们看起来令人生畏。
“告诉我有关我的 LAPACK 安装的所有信息”命令会很有用, 但我没有看到这一点。

from __future__ import division
import platform
import sys
import numpy as np
from numpy.distutils.system_info import get_info


np.set_printoptions( threshold=100, edgeitems=10, linewidth=80,
        formatter = dict( float = lambda x: "%.2g" % x ))  # float arrays %.2g

def versions():
    print "versions: numpy %s  python %s " % (
        np.__version__, sys.version.split()[0] )
    if platform.system() == "Darwin":
        print "mac %s" % platform.mac_ver()[0]
    else:
        print platform.platform( terse=1 )  # ?
    for info in "blas_opt lapack_opt " .split():
        print "%s: %s" % (info, get_info( info, 0 ))
    print ""

versions()

#...............................................................................
X = np.load( "matrix.npy" )
print "X:", X.shape, np.percentile( X, q=[0,25,50,75,100] )

U, sing, Vt = np.linalg.svd( X, full_matrices=False )

print "np.linalg.svd: X %s -> U %s  sing %s  Vt %s" % (
    X.shape, U.shape, sing.shape, Vt.shape )
print "svd sing:", sing

versions: numpy 1.9.2  python 2.7.6 
mac 10.8.3
blas_opt: {'extra_link_args': ['-Wl,-framework', '-Wl,Accelerate'], 'extra_compile_args': ['-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH', '-I/System/Library/Frameworks/vecLib.framework/Headers'], 'define_macros': [('NO_ATLAS_INFO', 3)]}
lapack_opt: {'extra_link_args': ['-Wl,-framework', '-Wl,Accelerate'], 'extra_compile_args': ['-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH'], 'define_macros': [('NO_ATLAS_INFO', 3)]}

X: (384, 5000) [-4.4e+02 -20 -0.27 17 4.5e+02]
np.linalg.svd: X (384, 5000) -> U (384, 384)  sing (384,)  Vt (384, 5000)
svd sing: [5e+04 2.3e+04 2.1e+04 1.3e+04 1.2e+04 1.1e+04 1.1e+04 4.3e+03 3.3e+03 1.8e+03
 ..., 0.00014 0.00014 0.00013 0.00013 0.00011 5.3e-12 5.3e-12 5.1e-16 1.3e-16
 3.3e-17]

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2021-03-24
    • 2017-07-19
    • 2015-09-27
    • 2019-04-03
    • 2020-12-22
    • 2018-09-13
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多