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 中,这些方法分别是 brutedifferential_evolution。应该注意的是,这些都不是 实际上 全局优化器,因为它们都需要上限和下限来搜索 space 所有参数。尽管如此,在这些范围内,他们确实会尝试找到最佳结果,而不仅仅是接近您的起始值的局部最小值。

一种常见的方法是对每个参数使用 brute 和 medium-sized 个步骤,然后取其中最好的十个并使用 Levenberg-Marquardt(来自 leastsq,作为在 curve_fit) 中使用,从每一个开始。同样,你可以使用differential_evolution,然后进行细化。

您可能会发现 lmfit (https://lmfit.github.io/lmfit-py) 很有帮助,因为它允许您设置一次模型并在求解器之间切换,包括 brutedifferential_evolutionleastsq。 Lmfit 还可以轻松修复某些参数或对某些参数设置 upper/lower 界限。它还提供了一个 higher-level 模型构建界面和 curve-fitting,以及探索参数置信区间的方法。