2016-04-19 6 views
1

私が構築したモデルは、3つの正規分布の形をとる出力を生成します。は、1つのデータセット内の別々の正規分布を認識します

import numpy as np 
d1 = [np.random.normal(2,.1) for _ in range(100)] 
d2 = [np.random.normal(2.5,.1) for _ in range(100)] 
d3 = [np.random.normal(3,.1) for _ in range(100)] 
sudo_model_output = d1 + d2 + d3 
np.random.shuffle(sudo_model_output) 

enter image description here

各正規分布に関連した正規分布平均値と標準偏差を見つけるためのニシキヘビの方法は何ですか?シミュレーションの繰り返しごとに値が変わるので、分布の開始と終了の推定値(ここでは〜2.25と2.75)をハードコードすることはできません。

+1

3つの正規分布の和を、それぞれの中心と幅で合わせることで、6つの変数を適合させることができます。幅が似ていると予想される場合は、4つの変数(center1、ctr2、ctr3、width)で逃げることができます。 – roadrunner66

+0

これを行うにはどういうわけかデータを分離する必要がありますか? – kilojoules

+0

いいえ、指定された値が非常に近くにある場合、指定された値が所与の分布に属するかどうかを知ることはできません。あなたはちょうど合計に合っています、下記の試みられた答えを見てください。 – roadrunner66

答えて

1

私はよりフィット適応:Fitting a histogram with python

from scipy.optimize import leastsq 
import numpy as np 
import matplotlib.pyplot as p 
%matplotlib inline 

d1 = [np.random.normal(2,.1) for _ in range(1000)] 
d2 = [np.random.normal(2.5,.1) for _ in range(1000)] 
d3 = [np.random.normal(3,.1) for _ in range(1000)] 
sum1 = d1 + d2 + d3 
bins=np.arange(0,4,0.01) 
a=np.histogram(sum1,bins=bins) 

fitfunc = lambda p, x: p[0]*exp(-0.5*((x-p[1])/p[2])**2) +\ 
     p[3]*exp(-0.5*((x-p[4])/p[5])**2) +\ 
     p[6]*exp(-0.5*((x-p[7])/p[8])**2) 

errfunc = lambda p, x, y: (y - fitfunc(p, x)) 

xdata,ydata=bins[:-1],a[0] 
p.plot(xdata,ydata) 

init = [40, 2.1, 0.1,40, 2.4, 0.1,40, 3.1, 0.1 ] 

out = leastsq(errfunc, init, args=(xdata, ydata)) 
c = out[0] 
print c 

enter image description here

は今そのフィット感はかなり良いように見えますが、私は振幅、中心部と幅のために(INITを参照)inital推測と非常に近くに来ましたこれらの9つの変数のうちの1つ。それらがすべて同じ高さまたは幅であることを知っていて、したがって変数の数を減らすことができれば、フィットに役立ちます。

関連する問題