2016-03-24 48 views
-1

Scipy.optimize.curve_fit kullanarak histogramım için uygun bir eğri yapmaya çalışıyorum. Burada üzerinde çalışıyorum örnek kod:Scipy.optimize.curve_fit işlevi nasıl tanımlanır?

x, y (aynı zamanda histogram çıktı) o binned x tekabül eden ağırlığı binned x değeri (ki histogram çıkış) olan bir
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') 

.

global name 'a' is not defined 

Ve bu hata uyandırmak ama bunu düzeltmek için bir yol bulamıyorum neden anlamıyorum: kod çalışırken, bir hata almaya devam. Curve_fit, callable işlevi olarak 1. parametreye sahip olduğundan, bunu Python'da nasıl tanımlayacağımı bilmiyorum (program, gauss fonksiyonumun değerini bir değer olarak okuyor gibi görünüyor). Çok teşekkür ederim.

+0

Bunu denediğimde, 'mean'ı tanımlamam ya da 'curvefit' parametresine bir parametre olarak aktarmalıyım, yoksa' mean' undefined olduğu bir hata alıyorum. Bunu denedin mi? Ayrıca, 'gauss_function' gaussian' olması gerekiyordu? –

+0

Lütfen hatayı üreten eksiksiz bir çalışma örneği sağlayın. – egpbos

cevap

0

Tam bir çalışma örneği olmasa da, bunun yanıtlanması imkansız olsa da, scipy ile çalışırken benzer sorunlardan çok sıkıntı çektim. Kod oldukça hızlı bir şekilde belirsizleşiyor.

Bu nedenle symfit paketini kullanarak size yardımcı olacağını düşünüyorum. Tam sorumluluk reddi beyanı: Bu paketi, n-th süresi için öfke scipy'dan çıktıktan sonra daha pythonic yapmak için yapıyorum.

Senin sorunun şu şekilde görünecektir:

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() 

senin için curve_fit sarma tüm acı uğradığından bu hayatınızı kolaylaştıracak düşünüyorum. Eğer gerçekten curve_fit kullanmak istiyorsanız, daha spesifik olmanız gerekir.

İlgili konular