numpy.histogram的hist维度,密度= True

时间:2018-03-20 12:03:03

标签: python r histogram probability-density

假设我有这个数组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重现这些值,因为我在两种语言之间移植了一些代码。

1 个答案:

答案 0 :(得分: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')

enter image description here

让我们将列表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