我发现有两个版本的pinv()
函数,它在Scipy
和numpy
中计算矩阵的伪逆,文档可以在以下位置查看:
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
时,它花费了我超过20 it的内存。但是当我使用numpy.linalg.pinv
时,只使用了不到1 1GB的内存。
我想知道为什么numpy
和scipy
在不同的实现下都有一个pinv
。以及为什么他们的表现如此不同。
发布于 2012-11-07 08:39:16
我无法解释为什么在scipy和numpy中都有实现,但我可以解释为什么行为是不同的。
numpy.linalg.pinv
使用奇异值分解(精确地说是lapack方法dgesdd
)近似摩尔-彭罗斯伪逆,而scipy.linalg.pinv
在最小二乘意义下求解模型线性系统以近似伪逆(使用dgelss
)。这就是为什么他们的表现是不同的。我希望得到的伪逆估计的总体精度也会有所不同。
您可能会发现scipy.linalg.pinv2
的性能更类似于numpy.linalg.pinv
,因为它也使用奇异值分解方法,而不是最小平方近似。
https://stackoverflow.com/questions/13265299
复制相似问题