scipy.leastsq 和 scipy.least_squares 之间的区别

Difference between scipy.leastsq and scipy.least_squares

我想知道这两种方法有什么区别scipy.optimize.leastsq and scipy.optimize.least_squares

当我实施它们时,它们在 chi^2 方面的差异很小:

>>> solution0 = ((p0.fun).reshape(100,100))
>>> # p0.fun are the residuals of my fit function np.ravel'ed as returned by least_squares
>>> print(np.sum(np.square(solution0))) 
0.542899505806

>>> solution1 = np.square((median-solution1))
>>> # solution1 is the solution found by least_sq, it does not yield residuals thus I have to subtract it from the median to get the residuals (my special case)
>>> print(np.sum((solution1)))
0.54402852325

任何人都可以对此进行扩展或指出我在哪里可以找到替代文档,来自 scipy 的文档有点含糊。

least_squares中你可以为每个变量给出上限和下限

如果您比较文档字符串,还有一些 leastsq 不提供的功能

least_squares 的文档来看,leastsq 似乎是一个较旧的包装器。

See also

leastsq   A legacy wrapper for the MINPACK implementation of the Levenberg-Marquadt algorithm.

所以你应该只使用 least_squaresleast_squares 似乎有额外的功能。其中最重要的是使用的默认"method"(即算法)不同:

  • trf : Trust Region Reflective algorithm, particularly suitable for large sparse problems with bounds. Generally robust method.
  • dogbox : dogleg algorithm with rectangular trust regions, typical use case is small problems with bounds. Not recommended for problems with rank-deficient Jacobian.
  • lm : Levenberg-Marquardt algorithm as implemented in MINPACK. Doesn’t handle bounds and sparse Jacobians. Usually the most efficient method for small unconstrained problems.

Default is trf. See Notes for more information.

旧的 leastsq 算法只是 lm 方法的包装器,正如文档所说,它只适用于小的无约束问题。

您在结果中看到的差异可能是由于所采用的算法不同所致。

编写新的 Scipy 函数 least_squares 关键原因 是允许变量的上限和下限(也称为 "box constraints").这是一项非常受欢迎的功能。

这个看似简单的加法实际上远非微不足道,需要全新的算法,特别是狗腿(least_squares 中的method="dogleg")和信赖域反射(method="trf"),这允许对框约束进行稳健和有效的处理(算法的详细信息在相关 Scipy documentation 的参考文献中给出)。

对大规模问题和稀疏雅可比矩阵的支持也很重要。

当不需要变量边界且问题不是很大时,新 Scipy 函数 least_squares 中的算法相对于 Levenberg 几乎没有优势(如果有的话) -Marquardt MINPACK 实现在旧 leastsq 中使用。

但是,旧的 leastsq 和新的 least_squares 使用选项 method="lm" 调用了完全相同的 MINPACK Fortran 代码。因此,旧的 leastsq 现已废弃,不推荐用于新代码。