我想在存储日志记录时总结许多不同类别的移动平均值。想象一下,一项保存 Web 服务器日志的服务一次记录一个条目。让我们进一步想象,我们无权访问记录的记录。所以我们只看到它们一次,但以后就无法访问它们了。
对于不同的页面,我想知道
- 总点击次数(简单)
- “最近”的平均值(比如一个月左右)
- “长期”平均值(一年以上)
是否有任何巧妙的算法/数据模型可以保存此类移动平均线,而无需通过汇总大量数据重新计算它们?
我不需要精确的平均值(正好 30 天左右),只需要趋势指标。所以有些模糊根本不是问题。它应该只是确保较新条目的权重高于较旧条目。
一种解决方案可能是为每个月自动创建统计记录。但是,我什至不需要过去一个月的统计数据,所以这似乎有些矫枉过正。它不会给我一个移动平均线,而是逐月切换到新值。
最佳答案
一个简单的解决方案是保持总数呈指数衰减。
可以使用以下公式计算:
newX = oldX * (p ^ (newT - oldT)) + delta
oldX
是总计的旧值(在 oldT
时),newX
是总计的新值(在时间newT
); delta
是新事件对总数的贡献(例如今天的点击数); p
小于或等于 1,是衰减因子。如果我们采用 p = 1
,那么我们就有了命中总数。通过减少 p
,我们有效地减少了总描述的区间。
关于algorithm - 高效保存加权移动平均的数据结构/算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211558/