我使用的是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有全局曲线拟合器吗?在
这是一个重要的问题。你考虑过使用进化策略吗?我在ecspy(见http://code.google.com/p/ecspy/)方面取得了巨大的成功,社区规模很小,但是非常有帮助。在
你是对的,它只会收敛到局部最小值(当它收敛时),因为它使用Levenburg-Marquardt算法。SciPy中没有全局曲线拟合器,您必须使用existing global optimizers编写自己的曲线。但是要知道,这仍然不需要收敛到你想要的值。大多数情况下是impossible。在
提高结果的唯一方法是很好地猜测起始参数。在
您可能想尝试使用leastsq()(曲线拟合实际上使用了这一点,但您无法获得完整的输出)或使用ODR package代替曲线拟合。在
leastsq()的完整输出为您提供了更多的信息,例如chisquared值(如果您想将其用作快速而肮脏的拟合优度测试)。在
如果您需要为合身部分称重,您可以这样做:
相关问题 更多 >
编程相关推荐