pylab.hist(data,normed = 1)。规范化似乎不正确

时间:2011-03-31 09:51:06

标签: python graph numpy matplotlib

我正在尝试使用参数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 个答案:

答案 0 :(得分:44)

请参阅我的另一篇文章,了解如何使直方图中所有二进制数的总和等于一: https://stackoverflow.com/a/16399202/1542814

复制&粘贴:

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

myarray包含您的数据

答案 1 :(得分:24)

根据documentation normed:如果为True,则结果为bin处的概率密度函数的值,进行归一化,使得范围内的积分为1.请注意直方图的总和除非选择单位宽度的区间,否则值不等于1;它不是概率质量函数。这是来自numpy doc,但对于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])

答案 2 :(得分:7)

我认为你将bin高度与bin内容混淆。您需要添加每个bin的内容,即所有bin的height * width。应该= 1。

答案 3 :(得分:6)

  

这种规范化做了什么?

为了标准化序列,您必须考虑bin大小。 根据{{​​3}},bin的默认数量为10.因此,bin大小为(data.max() - data.min() )/10,即0.41。 如果normed=1,则条形的高度使得总和乘以0.41得到1.这就是整合时会发生的情况。

  

如何创建一个直方图,直方图的积分等于1?

我认为你想要直方图的总和,而不是它的积分,等于1.在这种情况下,最快的方式似乎是:

h = plt.hist(data)
norm = sum(data)
h2 = [i/norm for i in h[0]]
plt.bar(h[1],h2)

答案 4 :(得分:5)

我遇到了同样的问题,在解决问题时出现了另一个问题:如何将标准化的bin频率绘制为舍入值上的刻度百分比。我在这里发布它,以防它对任何人都有用。在我的例子中,我选择10%(0.1)作为y轴的最大值,10步(一个从0%到1%,一个从1%到2%,依此类推)。诀窍是在数据计数(这是n的输出列表plt.hist)处设置滴答,然后使用{{1}将其转换为百分比}类。这是我做的:

FuncFormatter

图解

归一化之前:y轴单位是x轴中bin区间内的样本数: Before normalisation: the y axis unit is number of samples within the bin intervals in the x axis

归一化后:y轴单位是bin值的频率,作为所有样本的百分比 After normalisation: the y axis unit is frequency of the bin values as a percentage over all the samples

答案 5 :(得分:3)

还有一个类似的numpy - numpy.historgramhttp://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html 其中一个参数是“密度”,如果设置density=True,输出将被标准化。

  

normed:bool,可选   由于混乱/错误行为,Numpy 1.6中不推荐使用此关键字。它将在Numpy 2.0中删除。请改用density关键字。如果为False,则结果将包含每个bin中的样本数。如果为True,则结果是bin处的概率密度函数的值,进行归一化,使得该范围内的积分为1.请注意,后一种行为已知具有不等的bin宽度的错误;而是使用密度。

     

密度:bool,可选   如果为False,则结果将包含每个bin中的样本数。如果为True,则结果为bin处的概率密度函数的值,进行归一化,使得该范围内的积分为1.注意,除非选择单位宽度的区间,否则直方图值的总和将不等于1;它不是概率质量函数。如果给定,则覆盖normed关键字。

答案 6 :(得分:0)

您的期望错误

箱子高度乘以其宽度的总和等于1。或者,正如您所说的那样,积分必须是一个,不是您正在整合的功能

就像这样:概率(如“这个人在20到40岁之间的概率是......%”)是不可或缺的(“从20到40岁” )超过概率密度。箱柜高度显示概率密度,而宽度乘以高度显示概率(您将常量假设函数,箱柜高度,从箱子的开头到箱子的末端)整合到该箱子中的某个点。高度本身就是密度而不是概率。它是每宽度的概率,当然可以高于其中一个。

简单示例:设想从0到1的概率密度函数,其值0从0到0.9。这个功能可能介于0.9和1之间?如果你整合它,试试吧。它将高于1。

顺便说一下:粗略猜测,你的组合的高度乘以宽度的总和似乎大约为1,不是吗?