微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SciPy全局最小曲线拟合

如何解决SciPy全局最小曲线拟合

| 我正在使用
scipy.optimize.curve_fit
,但我怀疑它收敛到局部最小值,而不是全局最小值。 我尝试通过以下方式使用模拟退火:
def fit(params):
 return np.sum((ydata - specf(xdata,*params))**2)

p = scipy.optimize.anneal(fit,[1000,1E-10])
specf
是我要拟合的曲线。尽管返回值表明已达到全局最小值,但
p
中的结果显然比
curve_fit
返回的最小值差(请参阅退火)。 如何改善结果? SciPy中是否有全局曲线拟合器?     

解决方法

没错,由于它使用Levenburg-Marquardt算法,因此只会收敛到局部最小值(收敛时)。 SciPy中没有全局曲线拟合器,您必须使用现有的全局优化器编写自己的曲线。但是请注意,这仍然不必收敛到您想要的值。在大多数情况下,这是不可能的。 改善结果的唯一方法是很好地猜测起始参数。     ,您可能想尝试使用minimumsq()(curve_fit实际上使用了此方法,但没有获得完整的输出)或ODR包而不是curve_fit。 minimumsq()的完整输出为您提供了更多信息,例如卡方值(如果您想将其用作快速而肮脏的拟合优度测试)。 如果您需要权衡合适的身材,可以这样:
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,xerr),full_output=1)
chisq=sum(infodict[\'fvec\']*infodict[\'fvec\'])
    ,这是一个不平凡的问题。您是否考虑过使用进化策略?我在ecspy方面取得了巨大的成功(请参阅http://code.google.com/p/ecspy/),社区虽小,但非常有帮助。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。