用python对数据进行高斯拟合分布

小李默默吐槽,被这个高斯拟合分布折磨的吐血,下面是正文

首先是公式

# 自定义函数 
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()

最后画图

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值