我想计算一系列数字的标准误差。假设数字是 x[i],其中 i = 1 ... N。为此
我设置
averageX = 0.0
averageXSquared = 0.0
然后我遍历所有 i=1,...N 并为每个我计算
averageX += x[i]
averageXSquared += x[i]**2
然后我除以N
averageX = averageXC / N
averageXSquared = averageXSquared/N
然后我对差值求平方根
stdX = math.sqrt(averageXSquared - averageX * averageX)
这里的参数肯定总是>=0。
但是,如果我设置所有 x[i] = 0.07(例如),那么我会得到一个数学域错误,因为根函数的参数是负数。似乎有一些精度损失。
参数的数量级为 10e-15。
这看起来并不令人鼓舞。我现在必须先检查自己,看看结果是否定的,然后才能生根。
还是我做错了什么
请您参考如下方法:
这不是python问题,而是一般精度有限的问题。如果将所有数字设置为相同的值,则标准误差在数学上为 0,但对于计算机而言并非如此。处理此问题的正确方法是将非常小的值设置为 <0 到 0。
x = [0.7, 0.7, 0.7]
average = sum(x) / len(x)
sqav = sum(y**2 for y in x) / len(x)
stderr = math.sqrt(max(sqav - average**2, 0))
