我正在尝试使用参数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?
答案 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区间内的样本数:
归一化后:y轴单位是bin值的频率,作为所有样本的百分比
答案 5 :(得分:3)
还有一个类似的numpy - numpy.historgram
:http://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,不是吗?