使用 numpy.average 的加权平均值

新手上路,请多包涵

我有一个数组:

 In [37]: bias_2e13 # our array
Out[37]:
[1.7277990734072355,
 1.9718263893212737,
 2.469657573252167,
 2.869022991373125,
 3.314720313010104,
 4.232269039271717]

数组中每个值的错误是:

 In [38]: bias_error_2e13 # the error on each value
Out[38]:
array([ 0.13271387,  0.06842465,  0.06937965,  0.23886647,  0.30458249,
        0.57906816])

现在我将每个值的误差除以 2:

 In [39]: error_half # error divided by 2
Out[39]:
array([ 0.06635694,  0.03421232,  0.03468982,  0.11943323,  0.15229124,
        0.28953408])

现在我使用 numpy.average 计算数组的平均值,但使用 errors 作为 weights

首先,我对值使用了完整的误差,然后我使用了一半的误差,即误差除以 2。

 In [40]: test = np.average(bias_2e13,weights=bias_error_2e13)

In [41]: test_2 = np.average(bias_2e13,weights=error_half)

当一个数组的误差是另一个数组的一半时, 两个平均值如何给出相同的结果

 In [42]: test
Out[42]: 3.3604746813456936

In [43]: test_2
Out[43]: 3.3604746813456936

原文由 Srivatsan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 833
2 个回答

因为所有的错误都具有相同的 _相对权重_。提供 weight 参数 不会 改变您平均的实际值,它只是表示每个值对平均值的贡献。换句话说,将传递的每个值乘以其对应的权重后, np.average 除以提供的权重之和。

 >>> import numpy as np
>>> np.average([1, 2, 3], weights=[0.2, 0.2, 0.2])
2.0
>>> np.average([1, 2, 3])
2.0

实际上,一个 n 类数组容器的平均公式是

在此处输入图像描述

其中,当未提供给 numpy.average 时,假定每个权重等于 1。

原文由 miradulo 发布,翻译遵循 CC BY-SA 3.0 许可协议

我的回答晚了,但我希望这对以后看这篇文章的其他人有用。

关于为什么结果相同,上述答案是正确的。但是,您计算加权平均值的方式存在根本性缺陷。您数据中的不确定性不是 numpy.average 期望的权重。你必须先计算你的权重并将它们提供给 numpy.average。这可以这样做:

权重 = 1/(不确定性)^2。

(例如,参见 此说明。

因此,您可以将加权平均值计算为:

wts_2e13 = 1./(np.power(bias_error_2e13, 2.)) # 使用误差计算权重

wts_half = 1./(np.power(error_half, 2.)) # 使用半误差计算权重

test = np.average(bias_2e13, weights = wts_2e13)

test_2 = np.average(bias_2e13, weights = wts_half)

出于上述答案中很好解释的原因,在这两种情况下都会为您提供 2.2201767077906709 的答案。

原文由 anon 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题