2016-03-24 4 views
-1

Я пытаюсь создать кривую, подходящую для моей гистограммы, используя scipy.optimize.curve_fit. Вот пример кода я работаю над:Как определить функцию для 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') 

где х Binned х значений (выход из моей гистограммы), у есть вес, соответствующие этим Binned х (выход из гистограммы, а). Во время выполнения кода, я получаю сообщение об ошибке:

global name 'a' is not defined 

И я понимаю, почему эта ошибка пробуждать, но не может найти способ, чтобы исправить это. Поскольку curve_fit имеет 1-й параметр как вызываемую функцию, я не знаю, как указать это в Python (кажется, что программа считывает вывод моей гауссовой функции в качестве значения). Большое спасибо.

+0

Когда я пытаюсь это сделать, мне нужно определить 'mean' или передать его как параметр' curvefit', иначе я получу ошибку, которая 'mean' не определена. Вы пробовали это? Кроме того, 'gauss_function' должен быть' gaussian'? –

+0

Просьба представить полный рабочий пример, который приведет к ошибке. – egpbos

ответ

0

Хотя без полного рабочего примера ответить невозможно, я много страдал от подобных проблем при работе с scipy. Код становится довольно неясным довольно быстро.

Я поэтому думаю, что вам поможет с помощью пакета symfit. Полное опровержение: я создаю этот пакет, чтобы сделать более питонову после того, как ярость покинула scipy за n-й раз.

Ваша проблема будет выглядеть следующим образом:

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, вам нужно быть более конкретным.

Смежные вопросы