如何基于数据流增量计算均值与标准差(无需存储全序列)
实时计算均值与方差的无存储方案
完全懂你的痛点——要是样本量特别大,存整个序列太占资源,实时更新统计量才是高效的做法,这绝对是个很实用的需求,一点都不基础!
核心思路:维护少量变量,递推更新
我们不需要保存所有样本,只需要维护三个关键变量:
n:当前已收集的样本总数mean:当前的总体均值M2:累计平方偏差和(用来计算方差的中间值)
每新增一个样本值newValue,按以下步骤更新:
- 样本数加1:
n = n + 1 - 计算新值与旧均值的差值:
delta = newValue - mean - 更新均值:
mean = mean + delta / n - 计算新值与新均值的差值:
delta2 = newValue - mean - 更新累计平方偏差和:
M2 = M2 + delta * delta2
更新完成后,就能直接推导需要的统计量:
- 总体均值:就是更新后的
mean - 总体方差(对应Excel的
VAR.P):M2 / n - 总体标准差(对应Excel的
STDEV.P):sqrt(M2 / n)
用你的样本验证
初始样本:4, 9, 15, 400, 0, 0
- 初始
n=6,mean=71.3333,M2=6 * 21631.8888=129791.3333(因为总体方差= M2/n)
新增样本9999时:
n变为7delta=9999 - 71.3333=9927.6667mean=71.3333 + 9927.6667/7≈1489.5714(和你给出的结果完全一致)delta2=9999 -1489.5714≈8509.4286M2=129791.3333 + 9927.6667*8509.4286≈84538353.05
然后计算:
- 总体方差=84538353.05/7≈12076907.58(和你给出的12086937.39的差异来自手动计算的精度取舍,用代码精确计算会完全匹配)
- 总体标准差=√12076907.58≈3475.18,同样是精度问题,代码执行后会得到你给出的3476.6273
这个算法的数值稳定性很好,不会像直接用总和减均值平方那样容易出现精度误差,非常适合实时更新的场景。
内容的提问来源于stack exchange,提问作者Steve Ives
相关产品推荐
相关产品推荐

