【发布时间】:2017-02-26 17:42:31
【问题描述】:
我正在使用scipy.optimize.leastsq 进行曲线拟合。例如。对于高斯:
def fitGaussian(x, y, init=[1.0,0.0,4.0,0.1]):
fitfunc = lambda p, x: p[0]*np.exp(-(x-p[1])**2/(2*p[2]**2))+p[3] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
return fitfunc, final
现在,我想选择性地修复拟合中某些参数的值。我发现建议是使用不同的包lmfit,我想避免,或者非常笼统,比如here。 因为我需要一个解决方案,
- 适用于 numpy/scipy(没有其他包等)
- 独立于参数本身,
- 灵活,参数固定或不固定,
我想出了以下内容,对每个参数使用条件:
def fitGaussian2(x, y, init=[1.0,0.0,4.0,0.1], fix = [False, False, False, False]):
fitfunc = lambda p, x: (p[0] if not fix[0] else init[0])*np.exp(-(x-(p[1] if not fix[1] else init[1]))**2/(2*(p[2] if not fix[2] else init[2])**2))+(p[3] if not fix[3] else init[3])
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
final, success = scipy.optimize.leastsq(errfunc, init[:], args=(x, y))
return fitfunc, final
虽然这很好用,但它既不实用也不美观。 所以我的问题是:有没有更好的方法在 scipy 中为固定参数执行曲线拟合?或者是否有包装器,其中已经包含此类参数修复?
【问题讨论】:
-
在 scipy 中有这个功能会很好,但我不确定它是否存在。出于好奇,为什么要避免使用lmfit?根据我的经验,它使用起来非常简单。
-
我想避免使用其他软件包的原因是,我需要确保它们已正确安装在运行此程序的任何计算机上。
标签: numpy scipy curve-fitting