2013-01-22 13 views
5

मुझे डेटा के लिए गाऊशियन फिट करने में कुछ परेशानी हो रही है। मुझे लगता है कि समस्या यह है कि अधिकांश तत्व शून्य के करीब हैं, और वास्तव में कई बिंदुओं को फिट करने के लिए नहीं हैं। लेकिन किसी भी मामले में, मुझे लगता है कि वे फिट करने के लिए एक अच्छा डेटासेट बनाते हैं, और मुझे पाइथन को भ्रमित करने वाला नहीं मिलता है। यहाँ कार्यक्रम है, मैं भी तो आप देख सकते हैं कि मैं क्याgaussian fcipon में scipy.optimize.curve_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) 
समस्या

फिट करने के लिए कोशिश कर रहा हूँ डेटा प्लॉट करने के लिए एक लाइन जोड़ लिया है कि popt के लिए परिणाम

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

किसी भी संकेत है यह क्यों हो रहा है?

धन्यवाद!

+0

करने के लिए पहली बात यह है कि शून्य और इन सभी '10 ** (70)' -s को दूर करना होगा। यदि आप वास्तव में 'curve_fit' का उपयोग करना चाहते हैं, जो है। अन्यथा, बस अपने डेटासेट के पहले और दूसरे क्षणों की गणना करें --- ये दोनों गॉसियन फ़ंक्शन को पूरी तरह से परिभाषित करते हैं। –

+1

सिवाय इसके कि कार्य को इकाई क्षेत्र के लिए बाध्य नहीं किया गया है (पैरामीटर 'ए' भी लगाया जा रहा है) इसलिए अकेले पहले दो क्षण पर्याप्त नहीं होंगे। – bogatron

उत्तर

13

आपकी समस्या curve_fit के प्रारंभिक मानकों के साथ है। डिफ़ॉल्ट रूप से, यदि कोई अन्य जानकारी नहीं दी जाती है, तो यह 1 की सरणी से शुरू होगी, लेकिन यह स्पष्ट रूप से मूल रूप से गलत परिणाम का कारण बनती है। इसे उचित प्रारंभिक वेक्टर देकर बस ठीक किया जा सकता है। ऐसा करने के लिए, मैं अनुमान मतलब और आपके डेटासेट

#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') 

इस के मानक विचलन से शुरू पूरी तरह से अपने परिणामों को लगभग बराबर होगी। याद रखें कि आम तौर पर वक्र फिटिंग तब तक काम नहीं कर सकती जब तक कि आप एक अच्छे बिंदु (अभिसरण बेसिन के अंदर, स्पष्ट होने के लिए) शुरू नहीं करते हैं, और यह कार्यान्वयन पर निर्भर नहीं है। जब आप अपने ज्ञान का उपयोग कर सकते हैं तो कभी भी अंधा फिट न करें!

+0

बहुत बहुत धन्यवाद, यह काम किया! –

+0

यह काम करता है, लेकिन क्यों? आप 'mean = sum (x * y)' से क्यों शुरू करते हैं? –

संबंधित मुद्दे