我一直在尝试使用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中指定(似乎程序正在读取我的高斯函数的输出作为值)。非常感谢你。
答案 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
,那么您必须更加具体。