我有很多数据以大型阵列的形式存储在磁盘上。我无法将所有内容完全加载到内存中。
如何计算平均值和标准差?
有一个简单的在线算法,通过查看每个数据点一次并使用O(1)
内存来计算均值和方差。
维基百科提供以下代码:
def online_variance(data):
n = 0
mean = 0
M2 = 0
for x in data:
n = n + 1
delta = x - mean
mean = mean + delta/n
M2 = M2 + delta*(x - mean)
variance = M2/(n - 1)
return variance
该算法也称为Welford 方法。与其他答案中建议的方法不同,可以证明它具有很好的数值属性。
取方差的平方根得到标准差。
听起来像一道数学题。对于均值,您知道可以取一大块数据的均值,然后取均值的均值。如果块的大小不同,则必须取加权平均值。
对于标准偏差,您必须先计算方差。我建议在计算平均值的同时这样做。对于方差,你有
Var(X) = Avg(X^2) - Avg(X)^2
因此,计算您的数据的平均值,以及您的 (data^2) 的平均值。如上所述聚合它们,然后取差。
那么标准差就是方差的平方根。
请注意,您可以使用迭代器完成所有操作,这可能是最有效的。