使用Python计算无法在内存中存放的数据的均值和标准差
我有很多数据存储在磁盘上,都是一些很大的数组。我不能一次性把所有数据都加载到内存里。
那我该怎么计算这些数据的平均值和标准差呢?
2 个回答
6
听起来像是个数学问题。对于平均值,你可以先计算一部分数据的平均值,然后再计算这些平均值的平均。如果这些部分的大小不一样,你就需要用加权平均来处理。
至于标准差,你需要先计算方差。我建议在计算平均值的时候顺便一起算方差。方差的计算公式是:
Var(X) = Avg(X^2) - Avg(X)^2
也就是说,你先计算你的数据的平均值和这些数据平方后的平均值。然后像上面那样把它们结合起来,最后求出它们的差。
然后,标准差就是方差的平方根。
值得注意的是,你可以用迭代器来完成整个过程,这样可能会更高效。
11
有一种简单的在线算法,它可以通过一次查看每个数据点来计算平均值和方差,并且只需要使用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的方法。与其他答案中建议的方法不同,它被证明具有良好的数值特性。
要得到标准差,只需对方差开平方。