加权平均值使用numpy.average

时间:2016-07-07 08:50:03

标签: python python-2.7 numpy average weighted-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

3 个答案:

答案 0 :(得分:16)

因为所有错误都具有相同的相对权重。提供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维数组类似容器的平均公式是

enter image description here

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

答案 1 :(得分:2)

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

关于结果为何相同的问题,上面的答案是正确的。但是,如何计算加权平均值存在根本缺陷。数据中的不确定性不是numpy.average期望的权重。您必须先计算权重,然后将其提供给numpy.average。可以这样做:

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

(例如,参见this description.

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

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的答案。

答案 2 :(得分:1)

来自scipy.org关于numpy average:“与a中的值相关联的权重数组.a中的每个值根据其相关权重对平均值做出贡献。” 这意味着错误的贡献相对于平均值!因此,错误与相同因素的乘法不会改变任何东西!尝试仅将第一个错误乘以0.5,您将获得不同的结果。