我手头的问题是:我正在使用scipy
curve_fit
来拟合曲线(fit.html),但在许多情况下,估计这种曲线的参数指的是局部多个“局部”极小值之一,而不是“全局”最小值。考虑到curve_fit
是如何设计的,这是意料之中的。不过,我真的需要我的全球最低标准。
为了找到它,我最初的预感是乘以初始起点,运行多个curve_fit
实例,并选择一个拟合误差最小的实例,但在我个人的初步猜测估计中会有许多偏差(组合的数量可能很大,这将有损于性能)。
你是否碰巧知道如何进行更好、更快和/或方法更完善的方法?(他们不需要用最小二乘法,必要的话我可以做一些临时的东西)
发布于 2018-03-25 11:00:34
有几种可能的方法。一种方法是在参数空间中执行“蛮力”搜索,以便在curve_fit
中为本地求解器找到候选起点。另一种方法是使用全局求解器,例如差分进化。当然,这两种方法都可能比单个curve_fit
慢得多,但它们的目标是找到“全局极小值”。在scipy.optimize
中,这些方法分别是brute
和differential_evolution
。应该注意的是,这两种优化器实际上都不是全局优化器,因为它们都需要所有参数的搜索空间的上、下界。不过,在这些边界内,他们确实试图找到最好的结果,而不仅仅是接近起始值的局部最小值。
一种常见的方法是对每个参数使用中等大小的brute
,然后取其中最好的十个步骤,从每个参数开始使用Levenberg-Marquardt (来自leastsq
,在curve_fit
中使用)。类似地,您可以使用differential_evolution
,然后进行细化。
您可能会发现lmfit
(https://lmfit.github.io/lmfit-py)很有帮助,因为它允许您一次建立模型并在求解器(包括brute
、differential_evolution
和leastsq
)之间切换。Lmfit还可以方便地修复一些参数,或者在某些参数上放置上/下界。为模型建立和曲线拟合提供了较高层次的界面,并给出了参数置信区间的确定方法。
https://stackoverflow.com/questions/49478024
复制