【问题标题】:SciPy global minimum curve fitSciPy 全局最小曲线拟合
【发布时间】:2011-07-20 05:41:14
【问题描述】:

我正在使用scipy.optimize.curve_fit,但我怀疑它正在收敛到局部最小值而不是全局最小值。

我尝试通过以下方式使用模拟退火:

def fit(params):
 return np.sum((ydata - specf(xdata,*params))**2)

p = scipy.optimize.anneal(fit,[1000,1E-10])

specf 是我想要拟合的曲线。尽管返回值表明已达到全局最小值 (see anneal),但 p 中的结果明显低于 curve_fit 返回的最小值。

如何改进结果? SciPy 中有全局曲线拟合器吗?

【问题讨论】:

    标签: python scipy scientific-computing curve-fitting simulated-annealing


    【解决方案1】:

    您是对的,因为它使用 Levenburg-Marquardt 算法,所以它只会收敛到局部最小值(当它收敛时)。 SciPy 中没有全局曲线拟合器,您必须使用 existing global optimizers 编写您自己的。但请注意,这仍然不必收敛到您想要的值。大多数情况下是impossible

    改善结果的唯一方法是很好地猜测起始参数。

    【讨论】:

    • 感谢您的回答。我意识到全局优化的麻烦,但我猜测(希望)这个轮廓的表现相对较好。我使用 L2 范数来衡量适应度的方法是否正确?
    【解决方案2】:

    您可能想尝试使用leastsq()(curve_fit 实际上使用它,但您没有得到完整的输出)或ODR package 而不是curve_fit。

    leastsq() 的完整输出为您提供了更多信息,例如卡方值(如果您想将其用作快速而肮脏的拟合优度测试)。

    如果您需要调整合身度,您可以这样:

    fitfunc = lambda p,x: p[0]+ p[1]*exp(-x)
    errfunc = lambda p, x, y, xerr: (y-fitfunc(p,x))/xerr
    out = leastsq(errfunc, pinit, args=(x,y, xerr), full_output=1)
    chisq=sum(infodict['fvec']*infodict['fvec'])
    

    【讨论】:

      【解决方案3】:

      这是一个不平凡的问题。您是否考虑过使用进化策略?我在 ecspy 上取得了巨大的成功(请参阅 http://code.google.com/p/ecspy/),社区虽小但很有帮助。

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 2021-11-01
        • 2020-07-12
        • 2017-04-21
        • 2018-11-20
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 2014-03-05
        相关资源
        最近更新 更多