algorithm - 高效保存加权移动平均的数据结构/算法

标签 algorithm data-structures moving-average weighted-average

我想在存储日志记录时总结许多不同类别的移动平均值。想象一下,一项保存 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/

相关文章:

algorithm - 星历表的计算公式

algorithm - 分而治之 - 比较

data-structures - 我可以使用什么数据结构来查找给定人名的人的电话号码?

R - 按时间间隔不一致的组滚动 12 个月中位数

r - R中范围数据的移动平均值

sql - 可重复随机抽样SQL

java - 限制子集总和到指定范围内

javascript - 循环队列在 Javascript 中的实现

performance - mongodb - 推荐用于大量数据点的树结构

highcharts - Highstock - SMA(简单移动平均线)数据分组不起作用