Python不确定性中uarray的平均值

4

我的问题:

我有一个包含ufloats(例如unarray)的数组,使用Python uncertainties包。 数组中的所有值都有自己的误差,我需要一个函数,可以根据平均值的标称值误差和值误差的影响来计算数组的平均值。

我有一个uarray:

2 +/- 1 3 +/- 2 4 +/- 3

我需要一个函数,可以给我这个数组的平均值。

谢谢


3
你能给出一个你期望从那个数据集中得到的结果的例子吗? - njzk2
4个回答

3
假设服从高斯统计,不确定性来自于高斯父分布。在这种情况下,按照逆方差加权测量值(标称值)是标准的方法。应用于一般带权平均值时,得到以下公式: $$ \frac{\sum_i w_i x_i}{\sum_i w_i} = \frac{\sum_i x_i/\sigma_i^2}{\sum_i 1/\sigma_i^2} $$ 只需要对其进行良好的误差传递,得到带权平均值的不确定度为: $$ \sqrt{\sum_i \frac{1}{1/\sum_i \sigma_i^2}} $$ 在一个简单的情况下,可以通过以下方式获取加权平均值及其不确定度,但没有n长度的公式来进行语法上的处理:
    a = un.ufloat(5, 2)
    b = un.ufloat(8, 4)
    wavg = un.ufloat((a.n/a.s**2 + b.n/b.s**2)/(1/a.s**2 + 1/b.s**2), 
                     np.sqrt(2/(1/a.s**2 + 1/b.s**2)))
    print(wavg)
    >>> 5.6+/-2.5298221281347035

正如人们所预期的那样,结果更偏向于具有更小不确定度的值。这是好的,因为测量中较小的不确定度意味着其相关名义值比具有较大不确定度的值更接近父分布中的真实值。

请注意,上述公式依赖于所有项的存在真实的不确定性值。如果某个测量的不确定性为零(不可能!),结果将未定义(因为除以零)。此外,我对"加权平均值的不确定性"的解释非常不确定。在我阅读的许多参考文献中,平均值的不确定性通常与涉及平均值中存在的值范围的计算有关(在这种情况下,(8-5)/2 = 1.5)。如果我们缩小a和b的不确定性,总体平均值的不确定性不应低于1.5。 - undefined
@MichaelTiemann 我不相信不确定性作为数值范围是一个标准,更不用说是一个合适的用法了。它可能在不同领域有所不同。加权平均值只是考虑到测量精度的平均值。如果你引用的是9+-1和6+-4,我会相信你所测量的真实值更接近于9。加权平均值反映了这一点。就像测量结果一样,这个平均值也应该有一个误差范围。误差传播是基于微积分中的偏差概念构建的。我认为这比使用范围更好地表达了这个概念。 - undefined
谢谢您的评论,但它并没有解答根本问题,即当两个测量结果实际上不一致时会发生什么。如果两者都声称相对无误差,并且它们的差异大于其误差范围,应该怎么处理呢? - undefined

1

除非我漏掉了什么,你可以计算sum除以数组的长度:

from uncertainties import unumpy, ufloat
import numpy as np
arr = np.array([ufloat(2, 1), ufloat(3, 2), ufloat(4,3)])
print(sum(arr)/len(arr))
# 3.0+/-1.2

你也可以这样定义:

arr1 = unumpy.uarray([2, 3, 4], [1, 2, 3])
print(sum(arr1)/len(arr1))
# 3.0+/-1.2
uncertainties会处理其余部分。

我怀疑这不是原因,如果我在真实数据上使用它,我会得到一个误差值为+/- 0.4,而名义值平均标准误差约为8。 - DomR
你可能有不同的错误分布。这个文章可能会引起你的兴趣。 - Eric Duminil
这个问题在于,您得到了简单总和的名义值和不确定度,再除以条目的长度。请参见我的答案(即将推出)。 - Captain Morgan

0

我使用了Captain Morgan的答案来为一个项目提供一些甜美的Python代码,发现它需要一点额外的成分:

    import uncertainties as un
    from un.unumpy import unp
    epsilon = unp.nominal_values(values).mean()/(1e12)
    wavg = ufloat(sum([v.n/(v.s**2+epsilon) for v in values])/sum([1/(v.s**2+epsilon) for v in values]), 
                  np.sqrt(len(values)/sum([1/(v.s**2+epsilon) for v in values])))
    if wavg.s <= np.sqrt(epsilon):
        wavg = ufloat(wavg.n, 0.0)

如果没有那个微小的东西(epsilon),我们在记录了零不确定性的观测中会出现除以零的错误。


0
如果您已经有一个以“mean+/-sted”格式存储变量的.csv文件,您可以尝试下面的代码;它对我有效。
from uncertainties import ufloat_fromstr
df=pd.read_csv('Z:\compare\SL2P_PAR.csv')
for i in range(len(df.uncertainty)):
df['mean'] = ufloat_fromstr(df['uncertainty'][I]).n
df['sted'] = ufloat_fromstr(df['uncertainty'][I]).s

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