numpy.linalg.lstsq 和 scipy.linalg.lstsq 有什么区别?

What is the difference between numpy.linalg.lstsq and scipy.linalg.lstsq?

lstsq 尝试解决 Ax=b 最小化 |b - Ax|。 scipy 和 numpy 都提供了具有非常相似界面的 linalg.lstsq 函数。文档没有提到使用了哪种算法,scipy.linalg.lstsq nor for numpy.linalg.lstsq 也没有提到,但它看起来几乎是一样的。

scipy.linalg.lstsq and numpy.linalg.lstsq 的实现似乎有所不同。两者似乎都使用 LAPACK,两种算法似乎都使用 SVD。

哪里不一样了?我应该使用哪一个?

注意:不要混淆linalg.lstsqscipy.optimize.leastsq,后者也可以解决非线性优化问题。

如果我没看错源码(Numpy 1.8.2, Scipy 0.14.1 ), numpy.linalg.lstsq() 使用 LAPACK 例程 xGELSDscipy.linalg.lstsq() 使用 xGELSS.

LAPACK Manual Sec. 2.4

The subroutine xGELSD is significantly faster than its older counterpart xGELSS, especially for large problems, but may require somewhat more workspace depending on the matrix dimensions.

这意味着 Numpy 速度更快但使用的内存更多。

2017 年 8 月更新:

Scipy 现在默认使用 xGELSD https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html

Numpy 1.13 - 2017 年 6 月

从 Numpy 1.13 和 Scipy0.19 开始,两者 scipy.linalg.lstsq() and numpy.linalg.lstsq() call by default the same LAPACK code DSGELD (see LAPACK documentation).

然而,目前这两个函数之间的一个重要区别在于采用的默认 RCOND LAPACK 参数(Numpy 称为 rcond,Scipy 称为 cond),它定义了阈值对于奇异值。

Scipy使用了一个好的和健壮的默认阈值RCOND=eps*max(A.shape)*S[0],其中S[0]A的最大奇异值,而Numpy使用默认阈值[=15] =],这对应于在 LAPACK 中设置等于机器精度的阈值,而不管 A.

的值如何

Numpy 的默认方法在实际应用中基本上没有用,并且通常会在 A 接近秩亏时导致非常退化的解决方案,浪费 DSGELD 使用的奇异值分解 SVD 的准确性。这意味着在 Numpy 中,可选参数 rcond 应该 always 使用。

更新:Numpy 1.14 - 2018 年 1 月

我在 numpy.linalg.lstsq() and the function now raises a FutureWarning in Numpy 1.14 (see Future Changes 中报告了 rcond 的不正确默认值(参见上一节)。

未来的行为在 scipy.linalg.lstsq() and in numpy.linalg.lstsq() 中将是相同的。也就是说,Scipy和Numpy不仅会使用相同的LAPACK代码,还会使用相同的默认值。

要开始在 Numpy 1.14 中使用正确的(即未来的)默认设置,应该使用显式 rcond=None.

调用 numpy.linalg.lstsq()