使用 numpy.average 进行加权平均

16

我有一个数组:

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个回答

40
因为所有的误差具有相同的相对权重。提供一个"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。


4

我的回答晚了,但我希望这对未来查看此帖子的其他人有所帮助。

上面的回答非常准确地解释了为什么结果是相同的。但是,在计算加权平均值时,您的方法存在一个根本性缺陷。您的数据不确定性并不是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的答案。


1
从scipy.org关于numpy平均值的说明可以看出:"与a中的值相关联的权重数组。a中的每个值都根据其关联的权重对平均值作出贡献。"这意味着误差相对于平均值有所贡献!因此,将误差乘以相同的因子并不会改变任何东西! 试着仅将第一个误差乘以0.5,你会得到不同的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接