我构建的模型产生的输出采用三种正态分布的形状。
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)
找到与每个正态分布相关的正态分布均值和标准差的pythonic方法是什么?我无法硬编码分布开始和结束位置的估计值(此处为~2.25和2.75),因为值会随着模拟的每次迭代而改变。
答案 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
现在看起来非常合适,但是我对这9个变量的幅度,中心和宽度的初步猜测非常接近(参见init)。如果你知道它们的高度或宽度都相同,因此可以减少变量的数量,这将有助于拟合。