在数学SE上得到了一个很好的答案:https://math.stackexchange.com/questions/864657/can-i-get-the-correct-average-of-a-set-of-numbers-from-the-averages-of-several-s
假设我有一串数字:
565
212
812
895
443
73
468
900
299
993
252
740
291
112
(and thousands more)
我收到的每条消息都包含需要处理的数字和其他一些内容。一些处理可能很耗时,所以我想把它分成多个进程。我想将这些数字发送到圆形(或ZMQ路由器/经销商)风格的n
进程之一,并对数字进行一些处理。问题是我希望在不同的流程中保持所有数字的滚动平均值:
INPUT -> Worker #n -> Average collector -> OUTPUT
如果我将数字分成三个一组并取出子集的平均值,然后是三个平均值的平均值,我得到的结果不正确。是否可以跨多个流程拆分这项工作?另一种方法是将数字推送到Averager
进程。这似乎很好,但我想知道是否有一个更简单的解决方案,我错过了。
答案 0 :(得分:1)
问题取决于sufficient statistics的概念。为了计算整个组的统计信息,您需要为每个子组提供足够的统计信息。对于均值,足够的统计数据是每个子组的数据数量和每个子组的数据总数。通过每个子组的这两个项目,您可以精确计算整个组的平均值。
对于整个组的方差(等效,标准偏差),足够的统计数据是每个子组的数据数量,数据总数和数据平方总数。
足够的统计数据不一定比整个子群更简洁,但对于均值和方差,您只需要几个项目。