numpy.histogram的normal=True选项是如何工作的?
我有一个关于numpy.histogram中normed选项的问题,这个函数是:
numpy.histogram(a, bins=10, range=None, normed=False, weights=None, density=None)
根据定义:numpy.histogram
normed : 布尔值,可选
这个选项在Numpy 1.6中已经不推荐使用,因为它的行为让人困惑且有bug。它将在Numpy 2.0中被移除。建议使用density选项。如果设置为False,结果会显示每个区间中的样本数量。如果设置为True,结果会是每个区间的概率密度函数的值,并且经过归一化处理,使得整个范围的积分为1。需要注意的是,当区间宽度不相等时,这种行为已知存在bug;因此建议使用density选项。
weights : 类似数组,可选
我用这段代码试了一下:
imhist, bins = histogram([0,1,2,3], bins=4, normed=True)
print "normed=True:", imhist
print "bins:", bins
Output:
normal=True: [ 0.33333333 0.33333333 0.33333333 0.33333333]
bins: [ 0. 0.75 1.5 2.25 3. ]
imhist, bins = histogram([0,1,2,3], bins=4)
print "normed=None:", imhist
print "bins:", bins
Output:
normal=None: [1 1 1 1]
bins: [ 0. 0.75 1.5 2.25 3. ]
我感到困惑的是,当normed=True时,“结果是每个区间的概率密度函数的值,并且经过归一化处理,使得整个范围的积分为1。”因为我认为imhist应该是这样的:
normal=True: [0.25 0.25 0.25 0.25]
这4个值均匀地分布在4个区间中,这就是为什么“normal=None: [1 1 1 1]”
Value:[ 0 1 2 3 ]
bins: [ 0. 0.75 1.5 2.25 3. ]
我参考了这个numpy.histogram()是如何工作的?的帖子,但它确实使用了normed=True选项。
2 个回答
numpy.histogram(input, bins=10, density=True)
使用 density = True 会在后台做以下几件事。
1. 首先,根据数据的宽度以及最小值和最大值,它会计算出一个合适的区间宽度,然后创建一个直方图,X 轴表示数据,Y 轴表示输入的数量。
2. 接下来,它会计算每个数据点的相对频率,也就是把每个数据点的数量除以所有数据点的总数。这些相对频率也可以看作是概率值。这种解释是基于大数法则的概念。
3. 在任何概率密度函数(PDF)中,Y 值并不是实际的概率,而是概率密度。所以如果把相对频率除以区间宽度,我们就能得到和使用 density = True 参数时相同的结果。
文档没有说明它会返回加起来等于1的值,他们说的是:
如果为真,结果就是在这个区间的概率密度函数的值,经过标准化处理,使得整个范围的积分等于1。
所以在你的例子中,并不是说 imhist
应该是 [0.25]*4
,而是:
>>> imhist
array([ 0.33333333, 0.33333333, 0.33333333, 0.33333333])
>>> imhist * np.diff(bins)
array([ 0.25, 0.25, 0.25, 0.25])
>>> (imhist * np.diff(bins)).sum()
1.0
这就是你得到的不变值。每当你改变区间时,这些值也会随之改变。