首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并多个平均值而不计算合计

合并多个平均值而不计算合计
EN

Stack Overflow用户
提问于 2018-09-08 04:28:44
回答 2查看 280关注 0票数 3

我目前有多个来自序列化数据的[Average, Count]对。用户希望能够将一些值集合并(分组)在一起,并获得聚合结果。

我喜欢它很简单,我将只做Sum(Average * Count) / Sum(Count)

但问题是,其中一些值非常大,如果我将所有值相加,会导致算术溢出。

有没有一种方法可以合并平均部分而不计算总数?Count part是非常明显的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-08 04:48:27

假设CountAverage是索引值,您可以这样计算聚合平均值:

代码语言:javascript
运行
复制
TotalCount = Sum(Count)
TotalAverage = Sum(Average * (Count/TotalCount))

如果您希望在序列化数据上计算单次迭代中的值,则可以以类似于指数平均值的方式对连续的加权平均值求和。

代码语言:javascript
运行
复制
TotalCount = 0
TotalAverage = 0
for each index in data-set of [Average, Count]
    TotalCount = TotalCount + Count[index]
    Weight = Count[index]/TotalCount
    TotalAverage =   TotalAverage * (1 - Weight)
                   + Average[index] * Weight

您可以通过考虑前两个对来推导正确的方法。

如果只有第一对:

代码语言:javascript
运行
复制
TotalCount = Count[1]
TotalAverage = Average[1]

但是,如果有两个对:

代码语言:javascript
运行
复制
TotalCount = Count[1] + Count[2]
TotalAverage =   Average[1] * (Count[1]/TotalCount) 
               + Average[2] * (Count[2]/TotalCount)

如果我们从第一对迭代到第二对,那么两对计算可能如下所示:

代码语言:javascript
运行
复制
TotalCount = TotalCount + Count[2]
TotalAverage =   TotalAverage * (TotalCount - Count[2])/TotalCount
               + Average[2]   * (Count[2]/TotalCount)

如果我们让Weight表示Count[2]/TotalCount,上面的代码就简化为:

代码语言:javascript
运行
复制
TotalCount = TotalCount + Count[2]
Weight = Count[2]/TotalCount
TotalAverage =   TotalAverage * (1 - Weight)
               + Average[2] * Weight

由于TotalCountTotalAverage在采用一对新的序列化数据的每个步骤中都是正确的,因此可以用迭代索引替换[2]

票数 1
EN

Stack Overflow用户

发布于 2018-09-08 08:57:06

虽然@jxh的回答很好,并解决了您的问题,但他和您的原始方法对配对数据进行了两次传递(首先是总计数,然后是平均值),这可能会损害性能。你可以一次完成,做滚动平均。即使是来自流的对,也可以使用它,而您不知道这里有多少对

一些Python代码:

代码语言:javascript
运行
复制
data = [(3.1, 12), (5.2, 17), (9.7, 11)]

total_count = 0
total_avg   = 0.0
for avg, count in data:
    n0 = total_count
    total_count += count

    p = float(n0) / float(total_count)
    total_avg = p*total_avg + (1.0 - p)*avg

print(total_count)
print(total_avg)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52229261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档