2013-01-22 24 views
5

Verilere bir gauss takmak için biraz sıkıntı yaşıyorum. Problemin, elemanların çoğunun sıfıra yakın olduğu ve aslında takılması gereken pek çok nokta olmaması. Ama her halükarda, uygun bir veri seti hazırladıklarını düşünüyorum ve python'a bir şeyler söyleyemiyorum. İşte programdır benYanlışlıkla python'da scipy.optimize.curve_fit ile gaussian fit

#Gaussian function 
def gauss_function(x, a, x0, sigma): 
    return a*np.exp(-(x-x0)**2/(2*sigma**2)) 

# program 
from scipy.optimize import curve_fit 
x = np.arange(0,21.,0.2) 
# sorry about these data! 
y = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.2888599818864958e-275, 1.0099964933708256e-225, 4.9869496866403137e-184, 4.4182929795060327e-149, 7.2953754336628778e-120, 1.6214815763354974e-95, 2.5845990267696154e-75, 1.2195550372375896e-58, 5.6756631456872126e-45, 7.2520963306599953e-34, 6.0926453402093181e-25, 7.1075523112494745e-18, 2.1895584709541657e-12, 3.1040093615952226e-08, 3.2818874974043519e-05, 0.0039462011337049593, 0.077653596114448178, 0.33645159419151383, 0.40139213808285212, 0.15616093582013874, 0.0228751827752081, 0.0014423440677009125, 4.4400754532288282e-05, 7.4939123408714068e-07, 7.698340466102054e-09, 5.2805658851032628e-11, 2.6233358880470556e-13, 1.0131613609937094e-15, 3.234727006243684e-18, 9.0031014316344088e-21, 2.2867065482392331e-23, 5.5126221075296919e-26, 1.3045106781768978e-28, 3.1185031969890313e-31, 7.7170036365830092e-34, 2.0179753504732056e-36, 5.6739187799428708e-39, 1.7403776988666581e-41, 5.8939645426573027e-44, 2.2255784749636281e-46, 9.4448944519959299e-49, 4.5331936383388069e-51, 2.4727435506007072e-53, 1.5385048936078214e-55, 1.094651071873419e-57, 8.9211199390945735e-60, 8.3347561634783632e-62, 8.928140776588251e-64, 1.0960564546383266e-65, 1.5406342485015278e-67, 2.4760905399114866e-69, 4.5423744881977258e-71, 9.4921949220625905e-73, 2.2543765002199549e-74, 6.0698995872666723e-76, 1.8478996852922248e-77, 6.3431644488676084e-79, 0.0, 0.0, 0.0, 0.0] 

plot(x,y) #Plot the curve, the gaussian is quite clear 
plot(x,y,'ok') #Overplot the dots 

# Try to fit the result 
popt, pcov = curve_fit(gauss_function, x, y) 

sorun sığdırıyorum görebilecek, ben de verileri çizmek için bir çizgi eklemiş popt için sonuçlar

print popt 
array([ 7.39717176e-10, 1.00000000e+00, 1.00000000e+00]) 

Herhangi bir ipucu olmasıdır bunun neden olabileceği üzerine?

Teşekkürler!

+0

Yapılması gereken ilk şey, sıfırları atmak ve bunlardan kurtulmak olacaktır '10 ** (70) '-s. Eğer gerçekten 'curve_fit' kullanmak istiyorsanız, yani. Aksi takdirde, sadece veri kümenizin ilk ve ikinci anlarını hesaplayın --- bu ikisi gauss işlevini tamamen tanımlar. –

+1

Takılı olan fonksiyonun, ünite alanına sahip olması (“a” parametresi de aynı şekilde) olması dışında, tek başına ilk iki anın yeterli olmayacağı. – bogatron

cevap

13

Sorununuz, curve_fit öğesinin başlangıç ​​parametreleriyle ilgilidir. Varsayılan olarak, başka bir bilgi verilmezse, bir dizi ile başlayacaktır, ancak bu açıkça radikal bir şekilde yanlış sonuca yol açacaktır. Bu makul bir başlangıç ​​vektörü verilerek düzeltilebilir. Bunu yapmak için, ben mükemmel sonuçlar yaklaşacaktır sizin veri kümesi

#estimate mean and standard deviation 
meam = sum(x * y) 
sigma = sum(y * (x - m)**2) 
#do the fit! 
popt, pcov = curve_fit(gauss_function, x, y, p0 = [1, mean, sigma]) 
#plot the fit results 
plot(x,gauss_function(x, *popt)) 
#confront with the given data 
plot(x,y,'ok') 

Bu tahmini ortalama ve standart sapma başlar. İyi bir noktadan (yakınsama havzasında, açık olarak) başlamadığınız sürece, genel olarak eğri uydurma işleminin işe yaramayacağını unutmayın ve bu, uygulamaya bağlı değildir. Bilginizi kullanabildiğiniz zaman asla körlük yapmayın!

+0

Çok teşekkürler, işe yaradı! –

+0

Çalışıyor, ama neden? Neden 'mean = sum (x * y)' ile başlıyorsunuz? –