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

lum*_*ric 27 python numpy scipy least-squares

lstsq试图解决Ax=b最小化问题|b - Ax|.scipy和numpy都提供了一个linalg.lstsq具有非常相似的界面的功能.该文件没有提及使用哪种算法,既不scipy.linalg.lstsq也不对numpy.linalg.lstsq,但似乎做几乎相同.

对于scipy.linalg.lstsqnumpy.linalg.lstsq,实现似乎有所不同.两者似乎都使用LAPACK,两种算法似乎都使用了SVD.

区别在哪里?我应该使用哪一个?

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

Die*_*ich 21

如果我正确阅读源代码(Numpy 1.8.2,Scipy 0.14.1),则 numpy.linalg.lstsq()使用LAPACK例程xGELSDscipy.linalg.lstsq()使用xGELSS.

LAPACK手册秒.2.4

子程序xGELSD明显快于旧版xGELSS,特别是对于大问题,但根据矩阵尺寸可能需要更多的工作空间.

这意味着Numpy更快但使用更多内存.

2017年8月更新:

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


div*_*nex 16

Numpy 1.13 - 2017年6月

随着NumPy的1.13和0.19 SciPy的,的两个 scipy.linalg.lstsq()numpy.linalg.lstsq()默认调用相同的LAPACK代码DSGELD(见LAPACK文档).

但是,两个函数之间当前的重要区别在于采用的默认RCOND LAPACK参数(rcond由Numpy和condScipy 调用),它定义了奇异值的阈值.

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

Numpy的默认方法在实际应用中基本上是无用的,并且当A几乎排序不足时通常会导致非常简并的解决方案,浪费了DSGELD使用的奇异值分解SVD的准确性.这意味着在Numpy中rcond始终使用可选参数.

更新:Numpy 1.14 - 2018年1月

rcondnumpy.linalg.lstsq()中报告了不正确的默认值(参见上面的章节),现在该函数FutureWarning在Numpy 1.14中引发了一个(参见Future Changes).

未来的行为在scipy.linalg.lstsq()numpy.linalg.lstsq()中都是相同的.换句话说,Scipy和Numpy不仅会使用相同的LAPACK代码,还会使用相同的默认值.

要开始在Numpy 1.14中使用正确的(即将来的)默认值,应该使用显式调用numpy.linalg.lstsq()rcond=None.