Voici un exemple qui utilise scipy.optimize pour ajuster des fonctions non linéaires comme une Gaussienne, même lorsque les données sont dans un histogramme qui n'est pas bien étalonné, de sorte qu'une simple estimation de la moyenne échouerait. Une constante de décalage causerait également l'échec de statistiques normales simples (il suffit de supprimer p[3] et c[3] pour des données gaussiennes simples).
from pylab import *
from numpy import loadtxt
from scipy.optimize import leastsq
fitfunc = lambda p, x: p[0]*exp(-0.5*((x-p[1])/p[2])**2)+p[3]
errfunc = lambda p, x, y: (y - fitfunc(p, x))
filename = "gaussdata.csv"
data = loadtxt(filename,skiprows=1,delimiter=',')
xdata = data[:,0]
ydata = data[:,1]
init = [1.0, 0.5, 0.5, 0.5]
out = leastsq( errfunc, init, args=(xdata, ydata))
c = out[0]
print "A exp[-0.5((x-mu)/sigma)^2] + k "
print "Coefficients Parentaux:"
print "1.000, 0.200, 0.300, 0.625"
print "Coefficients Ajustés:"
print c[0],c[1],abs(c[2]),c[3]
plot(xdata, fitfunc(c, xdata))
plot(xdata, ydata)
title(r'$A = %.3f\ \mu = %.3f\ \sigma = %.3f\ k = %.3f $' %(c[0],c[1],abs(c[2]),c[3]));
show()
Résultat:
A exp[-0.5((x-mu)/sigma)^2] + k
Coefficients Parentaux:
1.000, 0.200, 0.300, 0.625
Coefficients Ajustés:
0.961231625289 0.197254597618 0.293989275502 0.65370344131
2 votes
"adapter cet histogramme avec une fonction gaussienne"? Habituellement, nous calculons simplement la moyenne et l'écart type de l'histogramme directement. Que voulez-vous dire par "adapter cet histogramme avec une fonction gaussienne" ?
0 votes
Comment pouvez-vous calculer la moyenne et l'écart type "directement". Et si l'histogramme n'est pas vraiment gaussien et que je veux l'ajuster, disons, avec une distribution log-normale?
2 votes
Il existe des équations pour la moyenne et l'écart type de n'importe quel ensemble de données, quelle que soit leur distribution. Et toute courbe (comme une ligne droite y = mx + b) peut être ajustée à n'importe quel ensemble de données. Vous devrez vous renseigner sur les fonctions statistiques de base (moyenne, médiane, mode, variance, ...) et sur l'approximation des moindres carrés. Comprenez d'abord l'ajustement de courbe pour les fonctions de base (linéaire et quadratique) avant de l'essayer sur des courbes plus complexes.
2 votes
L'ajustement de courbe n'est pas vraiment nécessaire, si vous avez les données. Trouvez simplement la moyenne et l'écart type, et insérez-les dans la formule pour la distribution normale (fr.wikipedia.org/wiki/Distribution_normale).
1 votes
La moyenne d'un histogramme est
sum( value*frequency for value,frequency in h )/sum( frequency for _,frequency in h )
. L'écart type est tout aussi simple - mais un peu long pour un commentaire. Pouvez-vous mettre à jour la question pour expliquer en détail ce que vous essayez de faire?0 votes
@ThomasK: Au fait, trouver la moyenne et l'écart type revient en fait à ajuster une courbe à une distribution gaussienne (et constitue le mécanisme d'ajustement optimal à certains égards).