scipy curve_fit 和局部最小值:尽快达到全局最小值
scipy curve_fit and local minima: get to global minima as fast as possible
我手头的问题:我正在使用 scipy
curve_fit
来拟合曲线 (https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html) 但在许多情况下,为此类曲线估计的参数是指局部许多 "local" 最小值而不是 "global" 最小值。现在,鉴于 curve_fit
的设计方式,这是可以预料的。不过,我真的需要我的全球最低限度。
为了找到它,我最初的直觉是乘以初始起点,运行 多个 curve_fit
实例并选择拟合误差最低的一个,但我会遇到一个数字我个人初始猜测估计中的偏差(也可能组合的数量可能相当大,这将不利于性能)。
您是否碰巧知道更好、更快的 and/or 方法上更合理的方法? (他们不需要通过最小二乘法,如有必要我可以构建临时的东西)
有几种可能的方法。一种方法是通过您的参数 space 进行 "brute force" 搜索,以在 curve_fit
中找到局部求解器的候选起点。另一种方法是使用全局求解器,例如微分进化。当然,这两者都可能比单个 curve_fit
慢得多,但它们确实旨在找到 "global minima"。在 scipy.optimize
中,这些方法分别是 brute
和 differential_evolution
。应该注意的是,这些都不是 实际上 全局优化器,因为它们都需要上限和下限来搜索 space 所有参数。尽管如此,在这些范围内,他们确实会尝试找到最佳结果,而不仅仅是接近您的起始值的局部最小值。
一种常见的方法是对每个参数使用 brute
和 medium-sized 个步骤,然后取其中最好的十个并使用 Levenberg-Marquardt(来自 leastsq
,作为在 curve_fit
) 中使用,从每一个开始。同样,你可以使用differential_evolution
,然后进行细化。
您可能会发现 lmfit
(https://lmfit.github.io/lmfit-py) 很有帮助,因为它允许您设置一次模型并在求解器之间切换,包括
brute
、differential_evolution
和 leastsq
。 Lmfit 还可以轻松修复某些参数或对某些参数设置 upper/lower 界限。它还提供了一个 higher-level 模型构建界面和 curve-fitting,以及探索参数置信区间的方法。
我手头的问题:我正在使用 scipy
curve_fit
来拟合曲线 (https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html) 但在许多情况下,为此类曲线估计的参数是指局部许多 "local" 最小值而不是 "global" 最小值。现在,鉴于 curve_fit
的设计方式,这是可以预料的。不过,我真的需要我的全球最低限度。
为了找到它,我最初的直觉是乘以初始起点,运行 多个 curve_fit
实例并选择拟合误差最低的一个,但我会遇到一个数字我个人初始猜测估计中的偏差(也可能组合的数量可能相当大,这将不利于性能)。
您是否碰巧知道更好、更快的 and/or 方法上更合理的方法? (他们不需要通过最小二乘法,如有必要我可以构建临时的东西)
有几种可能的方法。一种方法是通过您的参数 space 进行 "brute force" 搜索,以在 curve_fit
中找到局部求解器的候选起点。另一种方法是使用全局求解器,例如微分进化。当然,这两者都可能比单个 curve_fit
慢得多,但它们确实旨在找到 "global minima"。在 scipy.optimize
中,这些方法分别是 brute
和 differential_evolution
。应该注意的是,这些都不是 实际上 全局优化器,因为它们都需要上限和下限来搜索 space 所有参数。尽管如此,在这些范围内,他们确实会尝试找到最佳结果,而不仅仅是接近您的起始值的局部最小值。
一种常见的方法是对每个参数使用 brute
和 medium-sized 个步骤,然后取其中最好的十个并使用 Levenberg-Marquardt(来自 leastsq
,作为在 curve_fit
) 中使用,从每一个开始。同样,你可以使用differential_evolution
,然后进行细化。
您可能会发现 lmfit
(https://lmfit.github.io/lmfit-py) 很有帮助,因为它允许您设置一次模型并在求解器之间切换,包括
brute
、differential_evolution
和 leastsq
。 Lmfit 还可以轻松修复某些参数或对某些参数设置 upper/lower 界限。它还提供了一个 higher-level 模型构建界面和 curve-fitting,以及探索参数置信区间的方法。