加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用MatPlotLib和Numpy将高斯拟合到直方图 – 错误的Y缩放?

发布时间:2020-12-20 12:24:31 所属栏目:Python 来源:网络整理
导读:我编写了下面的代码,以使高斯曲线适合直方图.它似乎有效,虽然Y缩放是不同的.我究竟做错了什么? import matplotlib.pyplot as pltimport numpy as npimport matplotlib.mlab as mlablist = [0,1,2,3,4]plt.figure(1)plt.hist(list)plt.xlim((min(list),max(l
我编写了下面的代码,以使高斯曲线适合直方图.它似乎有效,虽然Y缩放是不同的.我究竟做错了什么?

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

list = [0,1,2,3,4]

plt.figure(1)
plt.hist(list)
plt.xlim((min(list),max(list)))

mean = np.mean(list)
variance = np.var(list)
sigma = np.sqrt(variance)
x = np.linspace(min(list),max(list),100)
plt.plot(x,mlab.normpdf(x,mean,sigma))

plt.show()

谢谢!

解决方法

您需要对直方图进行标准化,因为您绘制的分布也是标准化的:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

arr = np.random.randn(100)

plt.figure(1)
plt.hist(arr,normed=True)
plt.xlim((min(arr),max(arr)))

mean = np.mean(arr)
variance = np.var(arr)
sigma = np.sqrt(variance)
x = np.linspace(min(arr),max(arr),sigma))

plt.show()

注意对plt.hist的调用中的normed = True.另请注意,我更改了您的示例数据,因为直方图看起来很奇怪,数据点太少.

如果您想要保留原始直方图而不是调整分布,则必须缩放分布,使得分布上的积分等于直方图的积分,即列表中的项目数乘以条的宽度.这可以实现

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

arr = np.random.randn(1000)

plt.figure(1)
result = plt.hist(arr)
plt.xlim((min(arr),100)
dx = result[1][1] - result[1][0]
scale = len(arr)*dx
plt.plot(x,sigma)*scale)

plt.show()

请注意根据项目数乘以单个条形宽度计算的比例因子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读