【问题标题】:Error on weighted histogram in pythonpython中加权直方图的错误
【发布时间】:2018-01-12 13:13:34
【问题描述】:

我想通过取该 bin 中权重平方和 (sumw2) 的平方根来计算 bin 高度的误差(泊松误差)。当使用 matplotlib 或 numpy(或任何其他库)对数据进行直方图处理时,有什么方法可以获得权重总和(sumw)和/或 sumw2?

假设我在一个 numpy 数组 x 中有一些数据,在另一个 numpy 数组中有一些权重 w,要获得直方图,我会这样做

n, bins, patches = pyplot.hist(x,weights=w)

n, bins = numpy.histogram(x,weights=w)

在这两种情况下,我都不知道w 的哪些条目属于哪个bin,对吗?

编辑:目前我正在使用YODA 来执行此操作。在我看来,缺点是 YODA 直方图一次只能填充一个数据点。

【问题讨论】:

    标签: python numpy matplotlib histogram weighted


    【解决方案1】:

    考虑一个数组x,权重为w。由wbins 加权的x 中数据的直方图由下式给出:

    n, bins = np.histogram(x, bins=bins, weights=w)
    

    与 n 相关的误差可以计算为:

    n_err = np.sqrt(np.histogram(x, bins=bins, weights=w**2)[0])
    

    请注意,如果数据未加权(即(w == 1).all()),则错误会减少到“标准”np.sqrt(n)

    【讨论】:

      【解决方案2】:

      根据numpydocumentation,权重

      权重数组,形状与 a 相同。仅在一个 将其相关权重贡献给 bin 计数(而不是 1)。如果密度为真,则权重被归一化,因此 范围内的密度积分保持为 1。

      这意味着w 中的每个值都应该与x 中的一个值相关联。如果您想对 bin 进行加权并绘制它们,您可以首先找到 bin 的值,将它们乘以权重,最后使用 bar 绘制它们。

      val, pos = np.histogram(np.arange(1000))
      w_val = val * w
      plt.bar(pos[1:], w_val)
      


      从评论更新:

      啊,对不起,我似乎没有理解最初的问题。实际上,您可以使用pos 查找与每个 bin 相关的单元格,并使用这些信息计算您的权重函数。

      for left, right in zip(pos, pos[1:): 
          ix = np.where((x >= left) & (x <= right))[0] 
          sumw2 = np.sum(w[ix] ** 2) 
      

      【讨论】:

      • 如果 bin 的数量不是 a 中的条目数,这不起作用,因为 len(val)==nbinslen(w)==len(a) 或者我错过了什么?
      • @Lxndr 你能解释一下a是什么吗?
      • 哦,抱歉 a(来自文档)如果我正确理解文档,则来自上面的示例中的 x
      • 好的,如果len(x) == len(w) 那么在numpy.histogram(x,weights=w) x[i]w[i] 相关联
      • 但是仍然没有办法为每个 bin 获取 sumw2。通过将权重交给numpy.histogram(),只会改变箱子的高度,即val数组。垃圾箱的错误仍然无法访问..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多