Python &引用;numpy.linalg.linalg.LinAlgError:SVD未收敛“;举一个非常简单的例子

Python &引用;numpy.linalg.linalg.LinAlgError:SVD未收敛“;举一个非常简单的例子,python,numpy,svd,Python,Numpy,Svd,我正在做一个非常简单的任务,即获取矩阵'm1203.raw.mat'的奇异值分解,这是一个非常稀疏的矩阵,只包含少数值,即 awk '{for(i=1;i<=NF;++i){print $i}}' m1203.raw.mat | sort | uniq -c 但是矩阵的大小几乎是一MB(否则我会附加它) 无论如何,这是一项简单的任务 import numpy a = numpy.loadtxt('m1203.raw.mat') s = [float(i) for i in range

我正在做一个非常简单的任务,即获取矩阵'm1203.raw.mat'的奇异值分解,这是一个非常稀疏的矩阵,只包含少数值,即

awk '{for(i=1;i<=NF;++i){print $i}}' m1203.raw.mat | sort | uniq -c
但是矩阵的大小几乎是一MB(否则我会附加它)

无论如何,这是一项简单的任务

import numpy

a = numpy.loadtxt('m1203.raw.mat')

s = [float(i) for i in range(-7,8)]

for r in a :
  for c in r :
    assert(c in s)

numpy.linalg.svd(a)
给予

回溯(最近一次呼叫最后一次):
文件“trial.py”,第4行,在
numpy.linalg.svd(a)
svd中的文件“/usr/lib/python2.7/dist packages/numpy/linalg/linalg.py”,第1327行
u、 s,vt=gufunc(a,signature=signature,exportbj=exportbj)
文件“/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py”,第99行,在“raise\LINALGEROR\U svd\U NONCOVERNCE”中
raise LINALGEROR(“SVD未收敛”)
numpy.linalg.linalg.linalgeror:SVD未收敛

有什么想法吗?

这通常发生在南斯面前。请确保矩阵文件没有任何垃圾,并且您已正确读取。通常,NaN或无穷大值的存在将引发ValueError。事实并非如此,因为上面的awk命令已证明矩阵仅由以下集合中的值组成:[0,-1,1,-2,2,-3,-4,4,-7,7]只是另一件事,我在R中尝试了同样的方法,但在svd方法中得到了同样的错误。然后我在Matlab中尝试了它,它成功了。这很奇怪,因为这三个(Python、R和Matlab)都依赖LAPACK进行SVD计算,而这种计算通常是在NAN存在的情况下进行的。请确保矩阵文件没有任何垃圾,并且您已正确读取。通常,NaN或无穷大值的存在将引发ValueError。事实并非如此,因为上面的awk命令已证明矩阵仅由以下集合中的值组成:[0,-1,1,-2,2,-3,-4,4,-7,7]只是另一件事,我在R中尝试了同样的方法,但在svd方法中得到了同样的错误。然后我在Matlab中尝试了它,它成功了。这很奇怪,因为这三种方法(Python、R和Matlab)都依赖LAPACK进行SVD计算
import numpy

a = numpy.loadtxt('m1203.raw.mat')

s = [float(i) for i in range(-7,8)]

for r in a :
  for c in r :
    assert(c in s)

numpy.linalg.svd(a)
Traceback (most recent call last):
  File "trial.py", line 4, in <module>
    numpy.linalg.svd(a)
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 1327, in svd
    u, s, vt = gufunc(a, signature=signature, extobj=extobj)
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 99, in _raise_linalgerror_svd_nonconvergence
    raise LinAlgError("SVD did not converge")
numpy.linalg.linalg.LinAlgError: SVD did not converge