2012-11-07 71 views
9

我發現有很pinv()功能,其計算Scipynumpy矩陣的僞逆的兩個版本的差異,這些文件可以在觀看http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.pinv.html僞逆SciPy的和numpy的之間

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

的問題是,我有一個50000 * 5000矩陣,使用scipy.linalg.pinv的時候,它的成本比我的內存20GB以上。但是,當我使用numpy.linalg.pinv,只有不到1GB的內存使用..

我想知道爲什麼numpyscipy都有不同的實現下pinv。爲什麼他們的表演如此不同。

回答

10

我不能說爲什麼在scipy和numpy中都有實現,但我可以解釋爲什麼行爲是不同的。

numpy.linalg.pinv近似於使用SVD(該LAPACK方法dgesdd要準確)的摩爾-彭羅斯僞逆,而在scipy.linalg.pinv最小二乘解決了模型的線性系統感測(使用dgelss)來近似僞逆。這就是他們的表現不同的原因。我預計所得到的僞逆估計的總體準確度也會有所不同。

您可能會發現scipy.linalg.pinv2numpy.linalg.pinv執行更類似,因爲它也使用SVD方法,而不是使用最小方差近似。

+0

'SVD'方法和'最小二乘法',哪一個更好.. –

+0

「更好」是一個非常主觀的術語。只有你知道你首先需要僞逆。大概你也有關於算法的性能和數值穩定性的標準。無論哪一個「更好」都是最符合您標準的。 – talonmies