J'ai un ensemble de données en python. Je trace cela comme un histogramme, ce tracé montre une distribution bimodale, donc j'essaie de tracer deux profils gaussiens sur chaque pic de la bimodalité.
Si j'utilise le code ci-dessous, il me faut avoir deux jeux de données de même taille. cependant, je n'ai qu'un seul ensemble de données, et cela ne peut pas être divisé également. Comment puis-je adapter ces deux gaussiens
from sklearn import mixture
import matplotlib.pyplot
import matplotlib.mlab
import numpy as np
clf = mixture.GMM(n_components=2, covariance_type='full')
clf.fit(yourdata)
m1, m2 = clf.means_
w1, w2 = clf.weights_
c1, c2 = clf.covars_
histdist = matplotlib.pyplot.hist(yourdata, 100, normed=True)
plotgauss1 = lambda x: plot(x,w1*matplotlib.mlab.normpdf(x,m1,np.sqrt(c1))[0], linewidth=3)
plotgauss2 = lambda x: plot(x,w2*matplotlib.mlab.normpdf(x,m2,np.sqrt(c2))[0], linewidth=3)
plotgauss1(histdist[1])
plotgauss2(histdist[1])
Voici une simulation avec des outils scipy:
from pylab import *
from scipy.optimize import curve_fit
data=concatenate((normal(1,.2,5000),normal(2,.2,2500)))
y,x,_=hist(data,100,alpha=.3,label='data')
x=(x[1:]+x[:-1])/2 # for len(x)==len(y)
def gauss(x,mu,sigma,A):
return A*exp(-(x-mu)**2/2/sigma**2)
def bimodal(x,mu1,sigma1,A1,mu2,sigma2,A2):
return gauss(x,mu1,sigma1,A1)+gauss(x,mu2,sigma2,A2)
expected=(1,.2,250,2,.2,125)
params,cov=curve_fit(bimodal,x,y,expected)
sigma=sqrt(diag(cov))
plot(x,bimodal(x,*params),color='red',lw=3,label='model')
legend()
print(params,'\n',sigma)
Les données sont la superposition de deux échantillons normaux, le modèle une somme de courbes gaussiennes. on obtient :
Et les paramètres d'estimation sont:
# via pandas :
# pd.DataFrame(data={'params':params,'sigma':sigma},index=bimodal.__code__.co_varnames[1:])
params sigma
mu1 0.999447 0.002683
sigma1 0.202465 0.002696
A1 226.296279 2.597628
mu2 2.003028 0.005036
sigma2 0.193235 0.005058
A2 117.823706 2.658789