小李默默吐槽,被这个高斯拟合分布折磨的吐血,下面是正文
首先是公式
# 自定义函数
def func(x, a, u, sig):
return a*(np.exp(-(x - u) ** 2 / (2 * sig ** 2)))
然后就是横纵坐标,画图
x = np.array(dist)
y = np.array(probability_dist)
popt, pcov = curve_fit(func, x, y, p0=[2, 2, 2], maxfev=500000)
a = popt[0]
u = popt[1]
sig = popt[2]
curvex = np.linspace(np.min(x), np.max(x), 100)
yvals = func(curvex, *popt) # 拟合y值
对,就是这里了,小李刚开始直接照搬照抄,结果发现方差有负数,百度了一下,说是取绝对值也可以用。
接着就发现距离的平均值也有负的!!这个就不科学了。嗯,又查了一下,大佬说加offset
但是我发现加了之后之前不正常的正常了,之前正常的不正常了。so,还是分类处理吧,我就加了if判断
def fun(x, a, u, sig, offset):
return a*(np.exp(-(x - u) ** 2 / (2 * sig ** 2))) + offset
当发现平均值是负数时,我就用这个重新计算。那么多出来的参数写在哪里呢
就是那个P0了,加了offset就要多给它传个参数,至于参数怎么设置,我是自己手动慢慢调的,可能这就是玄学吧。over
plot1 = plt.plot(x, y, 's', label='original values')
plot2 = plt.plot(curvex, yvals, 'r', label='polyfit values')
plt.xlabel('distance')
plt.ylabel('frequency')
plt.legend(loc=1) # 指定legend的位置左上角
plt.title(str(num + 1) + " " + str(line + 1) + 'mean:' + str(format(u, '.5f')) + "var:" + str(format(sig, '.5f')))
plt.show()
最后画图