微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当密度为真时,numpy 的直方图函数的输出是什么意思?

如何解决当密度为真时,numpy 的直方图函数的输出是什么意思?

我不明白当密度为 True 时 numpy 的直方图函数输出。当我这样做时:

hist = np.histogram(np.array([1,1,2,3,4]),4,density = False)
print("histogram: ",hist)

输出为:

histogram:  (array([2,1]),array([1.,1.75,2.5,3.25,4.  ]))


我很清楚。我创建了 4 个区间 array([1.,4. ]) 和 array([2,1] 是每个区间中的元素数。但是当我使用密度 = True 时:

hist = np.histogram(np.array([1,density = True)
print("histogram: ",hist)

结果是:

histogram:  (array([0.53333333,0.26666667,0.26666667]),4.  ]))

我不明白那些数字数组是什么([0.53333333,0.26666667])。文档说它是概率密度函数,但是 PDF 使用的总和是 1,所以它不是每个元素类型的百分比。我的问题是,这些数字是如何计算的?你能解释一下我给出的例子吗?

解决方法

您阅读的文档段落的后半部分给出了一个线索:

密度:bool,可选

如果为False,结果将包含 每个 bin 中的样本。如果为 True,则结果为 bin 的概率密度函数,归一化使得 范围内的积分为 1。注意直方图的总和 除非选择了统一宽度的 bin,否则值将不等于 1; 它不是概率质量函数。

您看到的值是每个 bin 处 PDF 的密度值。那些没有求和为 1 的要求,因为它们不是质量(如文档中所述),而是 PDF 下的区域等于 1。

在你的例子中,你可以看到 PDF 下的面积是 bin 高度(密度)和 bin 宽度的函数,通过对每个 bin 的高度和宽度的乘积求和等于 1:

(0.53*0.75) + (0.27*0.75) + (0.27*0.75) + (0.27*0.75) = 1 (with some rounding error)

编辑:

关于如何计算这些密度值,您可以在 numpy source 中看到:

if density:
    db = np.array(np.diff(bin_edges),float)
    return n/db/n.sum(),bin_edges

其中 n 是直方图值数组,db 包含 bin 宽度

因此,在您的具体示例中,您的第一个直方图值为 2,它通过以下方式转换为 0.53 的密度值:

2 / 0.75 / (2 + 1 + 1 + 1) = 0.53

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。