Matrix SciPy与Numpy伪逆的区别

Matrix SciPy与Numpy伪逆的区别,matrix,numpy,scipy,Matrix,Numpy,Scipy,我发现有两个版本的pinv()函数,用于计算Scipy和numpy中矩阵的伪逆,可以在以下位置查看文档: 问题是我有一个50000*5000的矩阵,当使用scipy.linalg.pinv时,它占用了我超过20GB的内存。但是当我使用numpy.linalg.pinv时,只使用了不到1GB的内存 我想知道为什么numpy和scipy在不同的实现下都有一个pinv。以及为什么他们的表现如此不同 我不能解释为什么scipy和numpy都有实现,但我可以解释为什么行为不同 numpy.linalg

我发现有两个版本的
pinv()
函数,用于计算
Scipy
numpy
中矩阵的伪逆,可以在以下位置查看文档:

问题是我有一个50000*5000的矩阵,当使用
scipy.linalg.pinv
时,它占用了我超过20GB的内存。但是当我使用
numpy.linalg.pinv
时,只使用了不到1GB的内存


我想知道为什么
numpy
scipy
在不同的实现下都有一个
pinv
。以及为什么他们的表现如此不同

我不能解释为什么scipy和numpy都有实现,但我可以解释为什么行为不同

numpy.linalg.pinv
使用奇异值分解(精确地说,是拉帕克方法
dgesdd
)近似摩尔-彭罗斯伪逆,而
scipy.linalg.pinv
在最小二乘意义上求解模型线性系统以近似伪逆(使用
dgelss
)。这就是他们表现不同的原因。我希望得到的伪逆估计的总体精度也会有所不同

您可能会发现,
scipy.linalg.pinv2
的性能更类似于
numpy.linalg.pinv
,因为它也使用SVD方法,而不是最小平方近似。“更好”是一个非常主观的术语。只有你知道你首先需要伪逆的原因。大概你也有关于算法性能和数值稳定性的标准。无论哪个“更好”,都是最符合您标准的。