【问题标题】:The dimensions in hist for numpy.histogram with density = Truenumpy.histogram 的 hist 维度,密度 = True
【发布时间】:2018-08-29 05:42:34
【问题描述】:

假设我有这个数组 A:

array([ 0.0019879 , -0.00172861, -0.00527226,  0.00639585, -0.00242005,
   -0.00717373,  0.00371651,  0.00164218,  0.00034572, -0.00864304,
   -0.00639585,  0.006828  ,  0.00354365,  0.00043215, -0.00440795,
    0.00544512,  0.00319793,  0.00164218,  0.00025929, -0.00155575,
    0.00129646,  0.00259291, -0.0039758 ,  0.00328436,  0.00207433,
    0.0011236 ,  0.00440795,  0.00164218, -0.00319793,  0.00233362,
    0.00025929,  0.00017286,  0.0008643 ,  0.00363008])

如果我跑:

np.histogram(A, bins=9, density=True)

据我所知:

array([  34.21952021,   34.21952021,   34.21952021,   34.21952021,
     34.21952021,  188.20736116,  102.65856063,   68.43904042,
     51.32928032])

手册说:

"如果为True,则结果为概率密度函数的值 在 bin 处,归一化,使得范围内的积分为 1。 请注意,直方图值的总和不等于 1 除非选择了统一宽度的箱;它不是概率质量 函数。”

我以为我对直方图和密度函数有很好的理解,但我真的不明白这些值代表什么或如何计算它们。

我需要用 R 重现这些值,因为我正在两种语言之间移植一些代码。

【问题讨论】:

  • 开源软件的好处之一是,如果您不知道某些东西是如何计算的,您可以随时have a look yourself
  • 感谢您提供的链接,这很有趣,但我认为现在调查该功能的内部构建方式超出了我的范围。

标签: python r histogram probability-density


【解决方案1】:

在 R 中,您可以使用 hist() 函数绘制直方图。此外,hist 是一个生成列表的S3 函数。

A <- c(0.0019879 , -0.00172861, -0.00527226,  0.00639585, -0.00242005,
        -0.00717373,  0.00371651,  0.00164218,  0.00034572, -0.00864304,
        -0.00639585,  0.006828  ,  0.00354365,  0.00043215, -0.00440795,
        0.00544512,  0.00319793,  0.00164218,  0.00025929, -0.00155575,
        0.00129646,  0.00259291, -0.0039758 ,  0.00328436,  0.00207433,
        0.0011236 ,  0.00440795,  0.00164218, -0.00319793,  0.00233362,
        0.00025929,  0.00017286,  0.0008643 ,  0.00363008)

这是 R 使用您的向量 A 生成的默认直方图。

hist(A)

这是带有密度曲线附加层的直方图。

hist(A, freq = F)
lines(density(A), col = 'red')

让我们将列表hist(A) 存储到p

p <- hist(A)

我们现在可以看到列表p的内容了。

str(p)
# List of 6
#  $ breaks  : num [1:10] -0.01 -0.008 -0.006 -0.004 -0.002 0 0.002 0.004 # 0.006 0.008
#  $ counts  : int [1:9] 1 2 2 3 2 12 8 2 2
#  $ density : num [1:9] 14.7 29.4 29.4 44.1 29.4 ...
#  $ mids    : num [1:9] -0.009 -0.007 -0.005 -0.003 -0.001 0.001 0.003 0.005 0.007
#  $ xname   : chr "A"
#  $ equidist: logi TRUE
#  - attr(*, "class")= chr "histogram"

density 指的是理论密度函数值。这可以超过 1,但密度曲线下的面积应该等于 1。每个条的宽度很容易通过直方图中条的断点 (breaks) 之间的差异确定。因此,如果我们将直方图的每个条形的宽度乘以p$density,然后将结果相加,我们应该得到总和 1。

sum(diff(p$breaks) * p$density)
# [1] 1

【讨论】:

  • 感谢您的帖子,它非常有用并且指向了正确的方向,但是为什么我的 Python 输出与 R 的输出不同?我的最终目标是乘以(来自 Python 和密度 = True) hist * numpy.diff(bin_edges) 但如果我不明白 hist 是如何计算的/代表它的内容是非常困难的。也许我可以在 R 中采用一种解决方法来获得相同的结果。
  • 嗯,这就像在问为什么另一个软件中的输出与python或R的输出不同。它们有不同的实现。
  • @hpesoj626 你能详细说明一下你的意思吗? '密度指的是理论密度函数值'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2017-06-08
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多