首先,出现在求逆矩阵的函数,注意还是伪逆矩阵。
下面是这个函数的解释:
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
接下来,重新运行自己的程序,按照理论,应该成功。
刚装完,我没成功了,不知道再应该修改哪里。。。。
第二天,重新跑,通了。
中间可能涉及到一些随机过程,反正是有能跑通的时候。。。多试几次
另外,有人说是内存的问题,我自己没试过。。。机器没法改。