pylab.hist(data, normed=1)的归一化似乎不正确
我正在尝试创建一个直方图,并设置参数 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呢?
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是你的数据