如何逐步计算均值和方差?

数据挖掘 聚合 方差
2022-02-22 08:45:31

假设我有一组值 S,并且想在数据库中存储一些关于该集合的摘要信息,以便稍后当我获得一个新值 v 时,我可以合理估计关于集合 S 的摘要信息是什么∪ {v} --- 尽管现在我无法访问 S 的原始成员。我希望摘要信息包括这些集合的均值和方差,以及所需的最少附加信息。附加信息的一个自然想法是 S 的基数。但如果需要,我愿意保存有关 S 的更复杂的信息。我的主要限制是最小化保留信息的大小。

如果我只关心集合的平均值,那么存储 S 的平均值加基数显然就足够了。我可以通过对旧平均值(乘以旧基数)和新值进行加权平均来更新新值。但我也希望能够跟踪集合的变化。一个好的估计就足够了;我不需要能够重建 S ∪ {v} 的确切均值和方差。

我希望即使问这个问题也会显示我对统计数据的幼稚,但我会很感激任何帮助。我不知道在哪里寻找答案。

2个回答

讨论了这个问题,并在math.stackexchange上提供了证明和一些替代方法。

在我的评论中关于移动方差的链接之后,我发现了这个:Welford's online algorithm for calculate variance,这似乎提供了我正在寻找的东西。

这是算法:

new_count = old_count + 1
d1 = new_value - old_mean
new_mean = old_mean + d1/new_count
d2 = new_value - new_mean
new_sum_squares = old_sum_squares + d1*d2

从一个保存(count, mean, sum_squares),总体方差可以计算为sum_squares/count

给定一个初始值v,可以从以下开始:

count = 1
mean = v
sum_squares = 0

如果你想要一个加权均值和方差,你可以像这样修改算法:

new_count = old_count + new_weight
d1 = (new_value - old_mean)*new_weight

其他行保持不变。a,b(这里的权重值的平均值x,y分别是(ax+by)/(x+y); 加权 sum_squares 是x(a-mean)^2 + y(b-mean)^2。)