【问题标题】:How does numpy.histogram works with the normal=True optionnumpy.histogram 如何与 normal=True 选项一起使用
【发布时间】:2014-11-01 16:02:01
【问题描述】:

我有一个关于numpy.histogram选项normed的问题,函数是:

numpy.histogram(a, bins=10, range=None, normed=False, weights=None, density=None)

根据定义:numpy.histogram

规范:布尔型,可选

由于令人困惑/错误的行为,该关键字在 Numpy 1.6 中已弃用。它将在 Numpy 2.0 中删除。请改用密度关键字。如果为 False,则结果将包含每个 bin 中的样本数。如果为 True,则结果是 bin 处的概率密度函数的值,归一化以使范围内的积分为 1。改用密度。 权重:array_like,可选

我用这个代码试试:

   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 时,“结果是 bin 处的概率密度函数的值,归一化使得范围内的积分为 1。”因为我认为imhist应该是这样的:

   normal=True: [0.25  0.25  0.25  0.25]

这 4 个值在 4 个 bin 中均等下降,这就是为什么“normal=None: [1 1 1 1]”

   Value:[ 0         1      2      3   ]
   bins: [ 0.    0.75  1.5   2.25  3.  ]

我参考了这篇 How does numpy.histogram() work? 帖子,但它确实使用了 normed=True 选项。

【问题讨论】:

  • 您是否将“范围内的积分”与“总和”混淆了?
  • @DSM 我对它返回的 imhist 感到困惑,它应该是 [0.25 0.25 0.25 0.25] 而不是 [ 0.33333333 0.33333333 0.33333333 0.33333333],它怎么会返回这个? 0.33333333 = 1/3,这看起来像是 3 个值中的一个值的概率。

标签: python numpy


【解决方案1】:

他们说,文档没有说它会返回总和为 1 的值

如果为True,则结果为概率密度函数的值 在 bin 处,归一化,使得范围内的积分为 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

这就是你得到的不变量。每当您更改垃圾箱时,您都会更改这些值。

【讨论】:

    【解决方案2】:
    numpy.histogram(input, bins=10, density=True)
    

    使用 density = True 将在后端执行以下操作。

    1.首先,根据bin宽度和a中的最小值和最大值,它会首先计算出一定的bin宽度,然后创建一个直方图,其中X轴是a,Y轴是输入的数量。

    2.接下来它将计算每个数据点的相对频率,即它将每个数据点的数量除以数据点的总数。这些是相对频率,也可以解释为概率值。这种解释是基于大数定律的概念

    3.任何 PDF 中的 Y 值都不是实际概率,而是概率密度。因此,如果您将相对频率除以 bin 宽度,我们将得到与仅使用密度 =True 参数得到的结果相同的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 2018-08-29
      • 2023-03-09
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多