识别一个数据集中的单独正态分布

时间:2016-04-19 21:11:00

标签: python scipy statistics probability

我构建的模型产生的输出采用三种正态分布的形状。

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

找到与每个正态分布相关的正态分布均值和标准差的pythonic方法是什么?我无法硬编码分布开始和结束位置的估计值(此处为~2.25和2.75),因为值会随着模拟的每次迭代而改变。

1 个答案:

答案 0 :(得分: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

现在看起来非常合适,但是我对这9个变量的幅度,中心和宽度的初步猜测非常接近(参见init)。如果你知道它们的高度或宽度都相同,因此可以减少变量的数量,这将有助于拟合。