【问题标题】:scipy curve_fit and local minima: get to global minima as fast as possiblescipy curve_fit 和局部最小值:尽可能快地达到全局最小值
【发布时间】:2018-09-03 19:18:50
【问题描述】:

我手头的问题:我正在使用 scipy curve_fit 来拟合曲线 (https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html),但在许多情况下,为此类曲线估计的参数指的是本地众多 “本地”之一 最小值,而不是 “全局” 最小值。现在考虑到curve_fit 的设计方式,这是可以预料的。不过,我真的需要我的全球最低限度。

为了找到它,我最初的预感是乘以初始起点,运行多个 curve_fit 实例并选择拟合误差最低的一个,但我个人的初步猜测估计会受到许多偏差的影响(也可能组合的数量可能相当多,这将不利于性能)。

您是否碰巧知道如何进行的更好、更快和/或更合理的方法? (他们不需要通过最小二乘,如果需要我可以构建临时的东西)

【问题讨论】:

    标签: python scipy curve-fitting least-squares


    【解决方案1】:

    有几种可能的方法。一种方法是通过您的参数空间进行“蛮力”搜索,以在curve_fit 中找到本地求解器的候选起点。另一种是使用全局求解器,例如差分进化。当然,这两者都可能比单个curve_fit 慢得多,但它们确实旨在找到“全局最小值”。在scipy.optimize 中,这些方法分别是brutedifferential_evolution。应该注意的是,这些都不是实际上全局优化器,因为它们都需要所有参数的搜索空间的上限和下限。尽管如此,在这些范围内,他们确实会尝试找到最佳结果,而不仅仅是接近您的起始值的局部最小值。

    一种常见的方法是使用brute 对每个参数使用中等大小的步长,然后从其中最好的十个中使用Levenberg-Marquardt(来自leastsq,如curve_fit 中使用的),从每个参数开始这些。同样,您可以使用differential_evolution,然后进行细化。

    您可能会发现 lmfit (https://lmfit.github.io/lmfit-py) 很有帮助,因为它允许您设置一次模型并在求解器之间切换,包括 brutedifferential_evolutionleastsq。 Lmfit 还可以轻松修复某些参数或为某些参数设置上限/下限。它还为模型构建和曲线拟合提供了更高级别的接口,以及探索参数置信区间的方法。

    【讨论】:

    • 差分进化可以找到给定范围之外的参数,这些参数用于为遗传算法群体播种,算法不限于仅在该范围内进化解决方案。
    • @JamesPhillips 我可能是错的,但我的印象是scipy.optimize 中的差分进化版本确实需要并强制执行界限......猜猜应该澄清......跨度>
    • 我已经查看了我链接的源代码并做了一些简单的测试。您是正确的,scipy 的差分进化版本不会返回给定范围之外的参数。有趣,非常有趣。感谢您指出这一点。
    • @JamesPhillips 感谢您的验证。这是 scipy 版本一直困扰我的事情。我认为你的版本没有强加这个界限?我们是否应该考虑将您的实现添加到 lmfit?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2022-06-11
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2021-09-12
    相关资源
    最近更新 更多