我希望计算一系列数字的标准误差。假设数字是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。
这看起来并不令人鼓舞。我现在必须检查自己,看看在取根之前结果是否为负。
或者我做错了什么。
答案 0 :(得分:4)
这不是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))
答案 1 :(得分:2)
正确的方法当然永远不会减去大数字。有另一个传递,它保证非负性(你需要做一些代数才能意识到结果 在数学上是相同的):
y = [ v - average for v in x ]
dev = sum(v*v for v in y) / len(x)
stderr = math.sqrt(dev)