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.lstsq
和scipy.optimize.leastsq
,后者也可以解决非线性优化问题。
如果我没看错源码(Numpy 1.8.2, Scipy 0.14.1
), numpy.linalg.lstsq()
使用 LAPACK 例程 xGELSD
而 scipy.linalg.lstsq()
使用 xGELSS
.
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()
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.lstsq
和scipy.optimize.leastsq
,后者也可以解决非线性优化问题。
如果我没看错源码(Numpy 1.8.2, Scipy 0.14.1
), numpy.linalg.lstsq()
使用 LAPACK 例程 xGELSD
而 scipy.linalg.lstsq()
使用 xGELSS
.
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
.