一种空间复杂度较低的求均值算法

最近需要对很大的 LMDB 文件中的数据整体进行 Normalization,传统的求均值算法在求和时有溢出的风险,于是查找到了一个空间复杂度较低的求均值算法,记录如下。

不间断读取数据并计数。设某时刻均值已计算为 x¯ x ¯ ,计数为 n n ,需要读取的下一个数据为 x0 x 0 ,则更新后的均值为:

x¯n+x0n+1=x¯(n+1)x¯+x0n+1=x¯+x0x¯n+1 x ¯ ⋅ n + x 0 n + 1 = x ¯ ⋅ ( n + 1 ) − x ¯ + x 0 n + 1 = x ¯ + x 0 − x ¯ n + 1

示例代码

import numpy as np
X = np.random.rand(100000)
mean = 0
count = 0
for x in X:
    mean = mean + (x - mean) / (count + 1)
    count = count + 1
print(mean)

输出为 0.500913670645 0.500913670645

你可能感兴趣的:(一种空间复杂度较低的求均值算法)