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_squares
。 least_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
现已废弃,不推荐用于新代码。
我想知道这两种方法有什么区别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_squares
。 least_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
现已废弃,不推荐用于新代码。