14

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

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.pinv.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.pinv.html

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

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

4

1 回答 1

17

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

numpy.linalg.pinv使用 SVD(准确地说是 lapack 方法dgesdd)逼近 Moore-Penrose 伪逆,而scipy.linalg.pinv在最小二乘意义上求解模型线性系统以逼近伪逆(使用dgelss). 这就是他们的表现不同的原因。我希望得到的伪逆估计的整体准确性也会有所不同。

您可能会发现它的scipy.linalg.pinv2性能与 更相似 numpy.linalg.pinv,因为它也使用 SVD 方法,而不是最小平方近似。

于 2012-11-07T08:39:15.840 回答