web-dev-qa-db-fra.com

Comment puis-je ajuster une courbe gaussienne en python?

On me donne un tableau et lorsque je le trace, je reçois une forme gaussienne avec du bruit. Je veux correspondre au gaussien. C’est ce que j’ai déjà fait, mais quand j’ai tracé cette intrigue, je n’ai pas de gaussien équipé, mais une ligne droite. J'ai essayé autant de façons différentes et je n'arrive pas à comprendre.

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

11
P. Kaur

Vous pouvez utiliser fit à partir de scipy.stats.norm comme suit:

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 tente d'adapter les paramètres d'une distribution normale en fonction des données. En effet, dans l'exemple ci-dessus, mean vaut environ 2 et std environ 5.

Pour le tracer, vous pouvez faire:

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

Les boîtes bleues représentent l'histogramme de vos données et la ligne verte représente la gaussienne avec les paramètres ajustés.

9
Miriam Farber

Il existe de nombreuses façons d’adapter une fonction gaussienne à un ensemble de données. J'utilise souvent astropy lors de l'ajustement des données, c'est pourquoi je voulais ajouter ceci comme réponse supplémentaire.

J'utilise des données qui devraient simuler un gaussien avec du bruit:

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

Ensuite, l’ajustement est en fait assez simple, vous spécifiez un modèle que vous souhaitez adapter aux données et un ajusteur:

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)

Et tracé:

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

 enter image description here


Cependant, vous pouvez également utiliser uniquement Scipy, mais vous devez définir vous-même la fonction:

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)

Ceci retourne les arguments optimaux pour l'ajustement et vous pouvez le représenter comme ceci:

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

 enter image description here

3
MSeifert

Vous pouvez également adapter une fonction gaussienne avec curve_fit de scipy.optimize () où vous pouvez définir votre propre fonction personnalisée. Ici, je donne un exemple pour un ajustement de courbe gaussienne. Par exemple, si vous avez deux tableaux x et y

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

La fonction curve_fit doit être appelée avec trois arguments: la fonction que vous souhaitez ajuster (gaus () dans ce cas), les valeurs de la variable indépendante (dans notre cas x) et les valeurs de la variable dépendante (dans notre exemple). cas y). La fonction curve_fit retourne ensuite un tableau avec les paramètres optimaux (au sens des moindres carrés) et un second tableau contenant la covariance des paramètres optimaux (nous en parlerons plus tard). 

Voici le résultat de l'ajustement.

 enter image description here

2
Pankaj

Vous pourriez trouver utile lmfit pour cela. Il possède des méthodes intégrées pour l'ajustement gaussien et de nombreuses options pratiques pour résoudre les problèmes d'ajustement des courbes. Voir
https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peaked-data-tata-to-gaussian-lorentzian-and-voigt-profiles

0
M Newville