scipy curve_fit 和局部最小值:尽快达到全局最小值

2024-02-26

我手头的问题:我正在使用scipy curve_fit拟合一条曲线(https://docs.scipy.org/doc/scipy/reference/ generated/scipy.optimize.curve_fit.html https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)但在许多情况下,为此类曲线估计的参数是指局部许多参数之一"local"最小值与否"global"最低限度。现在考虑到如何,这是可以预料的curve_fit被设计。尽管如此,我确实需要我的全局最低限度。

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

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


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

一个常见的方法是使用brute每个参数都采用中等大小的步长,然后选取其中最好的十个并使用 Levenberg-Marquardt(来自leastsq,如所用curve_fit)从每一个开始。同样,您可以使用differential_evolution然后精炼。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy curve_fit 和局部最小值:尽快达到全局最小值 的相关文章

随机推荐