如何为scipy.optimize.curve_fit定义函数?

时间:2016-03-24 05:02:33

标签: scipy curve-fitting

我一直在尝试使用scipy.optimize.curve_fit为我的直方图拟合曲线。以下是我正在处理的示例代码:

def gaussian(x,a,b,c):
    return a * exp(-(x - b)**2 / c**2) 

def curvefit(gaussian, x, y,sigma):
    popt, pcov = curve_fit(gaussian, x, y, p0 = [1, mean, sigma])
    image = plt.plot(x, gauss_function(x, *popt), label='fit')

其中x是分箱x值(从我的直方图输出),y是与分箱x相对应的权重(也是直方图的输出)。在运行代码时,我不断收到错误:

global name 'a' is not defined

我理解为什么这个错误引起但无法找到修复它的方法。由于curve_fit具有第一个参数作为可调用函数,我不知道如何在Python中指定(似乎程序正在读取我的高斯函数的输出作为值)。非常感谢你。

1 个答案:

答案 0 :(得分:0)

虽然没有一个完整的工作示例,但这是不可能回答的,但在使用scipy时,我遇到了类似的问题。代码变得非常模糊得很快。

因此,我认为使用symfit包可以帮助您。完全免责声明:我建立了这个包,以便在第n次愤怒退出scipy后使拟合更加pythonic。

你的问题看起来像这样:

from symfit import Parameter, Variable, Fit, exp
import numpy as np
import matplotlib.pyplot as plt

x = Variable()
A = Parameter()
sig = Parameter(value=1.4, min=1.0, max=2.0)
x0 = Parameter(value=15.0, min=0.0)
# Gaussian distrubution
model = A * exp(-((x - x0)**2/(2 * sig**2)))

fit = Fit(model, xdata, ydata)
fit_result = fit.execute()

y = model(x=xdata, **fit_result.params)
plt.plot(xdata, ydata)
plt.plot(xdata, y)
plt.show()

我认为这会让你的生活更轻松,因为我经历了为你包裹curve_fit的所有痛苦。如果您真的想使用curve_fit,那么您必须更加具体。