2016-03-14 26 views
6

私は1つのデータセットをpythonで持っています。私はこれをヒストグラムとしてプロットしていますが、このプロットは二峰性の分布を示しています。したがって、私は二峰性の各ピークに2つのガウス分布をプロットしようとしています。ヒストグラムに2つのガウス分布を1つのデータセットからフィットするように、

私は以下のコードを使用する場合、同じサイズの2つのデータセットが必要です。しかし、私はちょうど1つのデータセットを持っており、これは等しく分割することはできません。どのように私はここではこれら二つのガウス

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

答えて

18

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)  

をデータは、2つの正常サンプル、モデルのガウス曲線の和の重ね合わせです。我々は入手:

gauss with legend

そして、推定パラメータは以下のとおりです。

# 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 
関連する問題