LinearAlgebraError: SVD did not converge (PYTHON)

首先,出现在求逆矩阵的函数,注意还是伪逆矩阵。
下面是这个函数的解释:

numpy.linalg.pinv¶

numpy.linalg.pinv(a, rcond=1e-15)[source]
Compute the (Moore-Penrose) pseudo-inverse of a matrix.

Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

Changed in version 1.14: Can now operate on stacks of matrices

Parameters: 
a : (…, M, N) array_like
Matrix or stack of matrices to be pseudo-inverted.
rcond : (…) array_like of float
Cutoff for small singular values. Singular values smaller (in modulus) than rcond * largest_singular_value (again, in modulus) are set to zero. Broadcasts against the stack of matrices
Returns:    
B : (…, N, M) ndarray
The pseudo-inverse of a. If a is a matrix instance, then so is B.
Raises: 
LinAlgError
If the SVD computation does not converge.

对输入A,要求是个矩阵就行了,内容也没有要求。
再往深处挖,这个错误出现的原因,是SVD函数的错误,正如字面意思,不收敛。
一个神奇的错误,按照这里的说法,the SVD decomposition always exists。也就是说不应该啊。
然后仔细按照上面链接的内容往下看,最后说是要修改迭代次数。具体位置往下看。

File: Src/dlapack_lite.c
Subroutine: dlasd4_
Line: 22562

首先是github上下载numpy源码,然后根据下图的目录
这里写图片描述
这里有两个.C文件,前面的解决方案是说要修改dlapack_lite.c的22562行。
尴尬的是,我下的版本总共只有359行。。。
于是我试着修改了,unmath_linalg.c文件。
但是总共也没那么多行啊。。。
于是我定位到2256行。
在他的上面找到了几行代码。
这里写图片描述
之前试着直接修改过第一个绿字的op_count,然后神奇的爆了错误Segmentation Fault,简单来说就是所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间。差不多到此为止,然后重新想办法修改。
这里写图片描述

修改完了之后使用源码安装的方式运行:

pip setup.py install

接下来,重新运行自己的程序,按照理论,应该成功。

刚装完,我没成功了,不知道再应该修改哪里。。。。

第二天,重新跑,通了。

中间可能涉及到一些随机过程,反正是有能跑通的时候。。。多试几次

另外,有人说是内存的问题,我自己没试过。。。机器没法改。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 这个错误提示意味着numpy的线性代数库在进行奇异值分解(SVD)时没有收敛,即算法无法得出稳定的结果。 通常,出现这个错误的原因可能是矩阵过大,或者矩阵中有过多的奇异值,使得算法无法正确处理。解决这个问题的方法可能包括使用更高效的奇异值分解算法,或者对矩阵进行预处理以减少奇异值的数量。 此外,还有可能是数据本身存在问题,例如有缺失值或异常值,也可能导致奇异值分解失败。在这种情况下,需要先对数据进行处理或清洗,以便能够正确地进行奇异值分解。 ### 回答2: numpy.linalg.linalgerror: svd did not converge。这个错误是在进行矩阵奇异值分解(Singular Value Decomposition,SVD)时出现的。SVD是矩阵分解的一种方法,它将任何矩阵分解成三个矩阵的积:一个左奇异矩阵、一个右奇异矩阵和一个对角线上是奇异值(Singular Value)的矩阵。 在使用SVD时,会遇到奇异矩阵无法收敛的情况,这种情况非常罕见,一般是由于矩阵的性质不够好。在实际应用中,通常可以通过以下几种方式来解决这个问题: 1. 检查数据的有效性:在使用SVD进行分解之前,应该检查数据是否有明显的异常值、缺失值或者不完整的数据。如果出现了这些问题,很可能会导致SVD无法收敛。需要对数据进行清理和处理。 2. 减小矩阵的维度:如果矩阵的维度非常高,可以考虑通过特征提取或者降维的方式来降低矩阵的维度,从而使SVD更容易收敛。 3. 选择其他的奇异值分解方法:如果SVD无法收敛,可以尝试使用其他的矩阵分解方法,比如QR分解或者LU分解。 4. 调整参数:在使用SVD时,可以尝试调整一些参数,比如tol、max_iter等参数,从而使算法更容易收敛。 总之,numpy.linalg.linalgerror: svd did not converge这个错误出现的原因比较复杂,需要具体情况具体分析。在实际应用中,需要仔细检查数据和算法,然后尝试不同的解决方案,才能解决这个问题。 ### 回答3: numpy.linalg.linalgerror: svd did not converge 是一个 numpy 包中出现的错误提示信息,表明了在进行奇异值分解(SVD)操作过程中,该操作无法达到收敛状态。奇异值分解是一种矩阵分解方式,用于找到一个矩阵的奇异值和奇异向量。这个分解方式在数学上非常重要,被广泛用于科学计算和工程领域。 SVD 的算法是一个迭代式的过程,在过程中会对矩阵进行逐步缩减,直到矩阵达到一个指定的阈值或者收敛状态。当出现 numpy.linalg.linalgerror: svd did not converge 这个错误提示时,说明在迭代过程中,矩阵没有收敛,可能有以下几个原因: 1. 矩阵过于复杂:在进行奇异值分解时,可能会碰到一些非常复杂的矩阵,这些矩阵的特征值和特征向量十分复杂,从而导致分解过程无法收敛。 2. 矩阵过于稀疏:如果矩阵中有很多零元素,可能会导致在进行 SVD 分解过程中,迭代过程过于复杂,从而导致无法收敛。 3. 不同的矩阵分解算法:SVD 算法有多种不同的实现方式,在不同的实现方式中,可能会出现收敛性能差异,可能导致某些算法无法达到目标收敛精度。 如果出现了这个错误提示,我们可以尝试以下方法: 1. 调整收敛阈值:运行时,可以尝试调整收敛的阈值,适当降低该值,从而使得 SVD 分解过程加速收敛。 2. 使用其他算法:如果使用的 SVD 算法无法收敛,可以尝试使用其他的矩阵分解算法,如 QR 分解、LU 分解等。 3. 增大计算精度:通过提高计算精度,可以使得 SVD 分解过程更加稳定,降低迭代过程中的收敛难度。 numpy.linalg.linalgerror: svd did not converge 这个错误提示表明了在进行 SVD 分解过程中出现的问题,使用以上方法可以帮助我们解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binqiang2wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值