pylab.hist(data, normed=1)的归一化似乎不正确

47 投票
7 回答
107214 浏览
提问于 2025-04-16 14:48

我正在尝试创建一个直方图,并设置参数 normed=1。

比如说:

import pylab

data = ([1,1,2,3,3,3,3,3,4,5.1])    
pylab.hist(data, normed=1)
pylab.show()

我原本以为所有的柱子加起来会等于1。但实际上,有一个柱子的高度超过了1。这种归一化到底是做了什么呢?我该如何创建一个直方图,使得这个直方图的总和等于1呢?

enter image description here

7 个回答

9

我觉得你把箱子的高度和箱子的内容搞混了。你需要把每个箱子的内容加起来,也就是把每个箱子的高度乘以宽度,然后把所有箱子的结果加在一起。这样加起来的总和应该等于1。

24

根据文档normed: 如果设置为True,结果就是在每个区间(bin)上的概率密度函数的值,并且经过归一化处理,使得整个范围的积分结果为1。需要注意的是,直方图的值之和不会等于1,除非选择的区间宽度为1;这并不是一个概率质量函数。 这段话来自numpy的文档,但在pylab中也是一样的。

In []: data= array([1,1,2,3,3,3,3,3,4,5.1])
In []: counts, bins= histogram(data, normed= True)
In []: counts
Out[]: array([ 0.488,  0.,  0.244,  0.,  1.22,  0.,  0.,  0.244,  0.,  0.244])
In []: sum(counts* diff(bins))
Out[]: 0.99999999999999989

所以简单的归一化可以按照文档中的方法进行:

In []: counts, bins= histogram(data, normed= False)
In []: counts
Out[]: array([2, 0, 1, 0, 5, 0, 0, 1, 0, 1])
In []: counts_n= counts/ sum(counts* diff(bins))
In []: counts_n
Out[]: array([ 0.488,  0.,  0.244,  0.,  1.22 ,  0.,  0.,  0.244,  0.,  0.244])
66

请查看我之前的帖子,了解如何让直方图中所有箱子的总和等于1:https://stackoverflow.com/a/16399202/1542814

复制和粘贴:

weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)

这里的myarray是你的数据

撰写回答