使用 numpy.average 的加权平均值
Weighted average using 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
因为所有错误都具有相同的相对权重。提供 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。
来自 scipy.org 关于 numpy 平均值:"An array of weights associated with the values in a. Each value in a contributes to the average according to its associated weight."
这意味着误差相对于平均值的贡献!因此,将错误与相同的因子相乘不会改变任何东西!例如,尝试将第一个错误乘以 0.5,您将得到不同的结果。
我的回答晚了,但我希望这对以后看到这个post的其他人有用。
关于结果相同的原因,上述答案是正确的。但是,您计算加权平均值的方式存在根本性缺陷。您数据中的不确定性不是 numpy.average 预期的权重。你必须先计算你的体重并将它们提供给numpy.average。可以这样做:
权重=1/(不确定性)^2。
(参见,例如,this description.)
因此,您可以将加权平均值计算为:
wts_2e13 = 1./(np.power(bias_error_2e13, 2.)) # Calculate weights using errors
wts_half = 1./(np.power(error_half, 2.)) # Calculate weights using half errors
test = np.average(bias_2e13, weights = wts_2e13)
test_2 = np.average(bias_2e13, weights = wts_half)
在这两种情况下都给你 2.2201767077906709 的答案,原因在上面的答案中解释得很清楚。
我有一个数组:
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
因为所有错误都具有相同的相对权重。提供 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。
来自 scipy.org 关于 numpy 平均值:"An array of weights associated with the values in a. Each value in a contributes to the average according to its associated weight." 这意味着误差相对于平均值的贡献!因此,将错误与相同的因子相乘不会改变任何东西!例如,尝试将第一个错误乘以 0.5,您将得到不同的结果。
我的回答晚了,但我希望这对以后看到这个post的其他人有用。
关于结果相同的原因,上述答案是正确的。但是,您计算加权平均值的方式存在根本性缺陷。您数据中的不确定性不是 numpy.average 预期的权重。你必须先计算你的体重并将它们提供给numpy.average。可以这样做:
权重=1/(不确定性)^2。
(参见,例如,this description.)
因此,您可以将加权平均值计算为:
wts_2e13 = 1./(np.power(bias_error_2e13, 2.)) # Calculate weights using errors
wts_half = 1./(np.power(error_half, 2.)) # Calculate weights using half errors
test = np.average(bias_2e13, weights = wts_2e13)
test_2 = np.average(bias_2e13, weights = wts_half)
在这两种情况下都给你 2.2201767077906709 的答案,原因在上面的答案中解释得很清楚。