SciPy全局最小曲线fi

2024-10-01 09:17:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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返回的最小值差,即使返回值表明达到了全局最小值(see anneal)。在

我怎样才能提高成绩?SciPy有全局曲线拟合器吗?在


Tags: returndefnp方式局部scipyparams全局
3条回答

这是一个重要的问题。你考虑过使用进化策略吗?我在ecspy(见http://code.google.com/p/ecspy/)方面取得了巨大的成功,社区规模很小,但是非常有帮助。在

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

提高结果的唯一方法是很好地猜测起始参数。在

您可能想尝试使用leastsq()(曲线拟合实际上使用了这一点,但您无法获得完整的输出)或使用ODR package代替曲线拟合。在

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

如果您需要为合身部分称重,您可以这样做:

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'])

相关问题 更多 >