Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SciPy全局最小曲线拟合_Python_Scipy_Scientific Computing_Curve Fitting_Simulated Annealing - Fatal编程技术网

Python SciPy全局最小曲线拟合

Python SciPy全局最小曲线拟合,python,scipy,scientific-computing,curve-fitting,simulated-annealing,Python,Scipy,Scientific Computing,Curve Fitting,Simulated Annealing,我使用的是scipy.optimize.curve\u 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.optimize.curve\u 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中没有全局曲线拟合器,您必须使用。但是请注意,这仍然不必收敛到您想要的值。大多数情况下都是这样


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

您可能希望尝试使用(曲线拟合实际使用此选项,但您无法获得完整输出)或代替曲线拟合

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

这是一个非常重要的问题。你考虑过使用进化策略吗?我在ecspy(请参阅)方面取得了巨大成功,社区规模虽小,但很有帮助。

感谢您的回答。我意识到全局优化的困难,但我猜测(希望)这个轮廓相对来说表现良好。我使用L2标准来衡量健康的方法正确吗?