2017-06-11 15 views
10

मुझे एक सरणी दी गई है और जब मैं इसे साजिश करता हूं तो मुझे कुछ शोर के साथ गाऊशियन आकार मिलता है। मैं गाऊशियन फिट करना चाहता हूँ। यह मेरे पास पहले से ही है, लेकिन जब मैं इसे साजिश करता हूं तो मुझे फिट गाऊशियन नहीं मिलता है, बल्कि मुझे सीधे सीधी रेखा मिलती है। मैंने इस कई अलग-अलग तरीकों की कोशिश की है और मैं इसे समझ नहीं पा रहा हूं।मैं अजगर में एक गाऊसी वक्र कैसे फिट कर सकता हूं?

random_sample=norm.rvs(h) 

parameters = norm.fit(h) 

fitted_pdf = norm.pdf(f, loc = parameters[0], scale = parameters[1]) 

normal_pdf = norm.pdf(f) 

plt.plot(f,fitted_pdf,"green") 
plt.plot(f, normal_pdf, "red") 
plt.plot(f,h) 
plt.show() 

click for image

उत्तर

6

आप इस प्रकार scipy.stats.norm से fit उपयोग कर सकते हैं:

import numpy as np 
from scipy.stats import norm 
import matplotlib.pyplot as plt 

data = np.random.normal(loc=5.0, scale=2.0, size=1000) 
mean,std=norm.fit(data) 

norm.fit की कोशिश करता एक सामान्य डेटा के आधार पर वितरण के मापदंडों के अनुरूप हों। और वास्तव में mean ऊपर के उदाहरण में लगभग है 2 और std लगभग 5.

है ताकि इसे साजिश के लिए, आप कर सकते हैं:

plt.hist(data, bins=30, normed=True) 
xmin, xmax = plt.xlim() 
x = np.linspace(xmin, xmax, 100) 
y = norm.pdf(x, mean, std) 
plt.plot(x, y) 
plt.show() 

enter image description here

नीले बक्से के हिस्टोग्राम हैं अपने डेटा, और हरी रेखा फिट पैरामीटर के साथ गॉसियन है।

+0

और मैं इस फिट गाऊस को देखने के लिए क्या प्लॉट करूंगा? –

+0

@ पी। कौर मेरा अद्यतन उत्तर –

0

आप scipy.optimize() से curve_fit के साथ एक गॉसियन फ़ंक्शन भी फिट कर सकते हैं जहां आप अपना स्वयं का अनुकूलित फ़ंक्शन परिभाषित कर सकते हैं। यहां, मैं एक गाऊसी वक्र फिटिंग के लिए एक उदाहरण दे रहा हूँ। उदाहरण के लिए, यदि आपके पास दो एरे x और y हैं। समारोह है कि आप फिट करने के लिए (GAUS() इस मामले में) चाहते हैं, स्वतंत्र चर के मान (में हमारे मामले एक्स), और मान:

from scipy.optimize import curve_fit 
from scipy import asarray as ar,exp 

x = ar(range(10)) 
y = ar([0,1,2,3,4,5,4,3,2,1]) 

n = len(x)       #the number of data 
mean = sum(x*y)/n     #note this correction 
sigma = sum(y*(x-mean)**2)/n  #note this correction 

def gaus(x,a,x0,sigma): 
    return a*exp(-(x-x0)**2/(2*sigma**2)) 

popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma]) 

plt.plot(x,y,'b+:',label='data') 
plt.plot(x,gaus(x,*popt),'ro:',label='fit') 
plt.legend() 

curve_fit समारोह तीन तर्कों के साथ कॉल करने की आवश्यकता है depenedent चर के (हमारे मामले में वाई)। इष्टतम पैरामीटर (कम से कम वर्गों में) के साथ एक सरणी लौटने की तुलना में curve_fit funtion और इष्टतम पैरामीटर (बाद में उस पर अधिक) के कॉन्वर्सिस युक्त एक दूसरा सरणी।

फिट का आउटपुट निम्नलिखित है।

enter image description here

+0

देखें यदि मैं इस विधि का उपयोग करता हूं तो मेरा फिट गाऊसी सिर्फ एक सीधी रेखा है। –

+0

क्या आप निश्चित हैं? मैंने आउटपुट प्लॉट को शामिल किया है जो मुझे मिल रहा है। बस उपरोक्त कोड की प्रतिलिपि बनाएँ, आपको फिट के लिए गॉसियन वक्र मिलेगा। – Pankaj

+0

यह विधि दूसरे से बेहतर है क्योंकि आप curve_fit() का उपयोग करके किसी भी मनमानी फ़ंक्शन को फिट कर सकते हैं। – Pankaj

1

आप इस के लिए उपयोगी lmfit मिल सकती है। इसमें गॉसियन फिटिंग के लिए अंतर्निहित विधियां हैं, और वक्र-फिटिंग समस्याओं के लिए कई सुविधाजनक विकल्प हैं। देखें
https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peaked-data-to-gaussian-lorentzian-and-voigt-profiles

+0

यह विधि मुझे सिग्मा और माध्य जैसे विभिन्न मानकों को देने के लिए अच्छी तरह से काम करती है, लेकिन मैं अपने मूल डेटा पर फिट गॉसियन को कैसे प्लॉट कर सकता हूं? –

+0

'out = model.fit (...) 'के साथ, सर्वोत्तम फिट मॉडल की सरणी' out.best_fit' में आयोजित की जाती है - जो डेटा के साथ साजिश के लिए तैयार होनी चाहिए। कामकाजी उदाहरण स्क्रिप्ट्स में बहुत सारे काम हैं जिनमें दस्तावेज़ों और उदाहरण फ़ोल्डर में साजिश शामिल है। –

0

डेटा सेट में गाऊशियन फ़ंक्शन को फिट करने के कई तरीके हैं। डेटा को फ़िट करते समय मैं अक्सर एस्ट्रॉपी का उपयोग करता हूं, इसलिए मैं इसे अतिरिक्त उत्तर के रूप में जोड़ना चाहता था।

import numpy as np 
from astropy import modeling 

m = modeling.models.Gaussian1D(amplitude=10, mean=30, stddev=5) 
x = np.linspace(0, 100, 2000) 
data = m(x) 
data = data + np.sqrt(data) * np.random.random(x.size) - 0.5 
data -= data.min() 
plt.plot(x, data) 

enter image description here

फिर फिटिंग यह वास्तव में काफी आसान है, आप एक मॉडल है कि आप डेटा को फिट करने के लिए चाहते हैं निर्दिष्ट करें:

मैं कुछ डेटा सेट है कि कुछ शोर के साथ एक गाऊसी अनुकरण करना चाहिए का उपयोग और एक फिटर:

fitter = modeling.fitting.LevMarLSQFitter() 
model = modeling.models.Gaussian1D() # depending on the data you need to give some initial values 
fitted_model = fitter(model, x, data) 

और साजिश रची:

plt.plot(x, data) 
plt.plot(x, fitted_model(x)) 

enter image description here


हालांकि आप भी सिर्फ SciPy उपयोग कर सकते हैं, लेकिन आप अपने आप को समारोह को परिभाषित करने के लिए है:

from scipy import optimize 

def gaussian(x, amplitude, mean, stddev): 
    return amplitude * np.exp(-((x - mean)/4/stddev)**2) 

popt, _ = optimize.curve_fit(gaussian, x, data) 

यह फिट करने के लिए इष्टतम तर्क देता है और आप इसे इस तरह से प्लॉट कर सकते हैं :

plt.plot(x, data) 
plt.plot(x, gaussian(x, *popt)) 

enter image description here

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