数据结构/算法有效保存加权移动平均值

时间:2011-11-21 12:09:06

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

我想在存储日志记录时总结一些不同类别的移动平均值。想象一下,一次保存一个条目的Web服务器日志的服务。让我们进一步想象一下,我们无法访问记录的记录。所以我们一次看到它们,但以后无法访问它们。

对于不同的页面,我想知道

  • 总点击次数(简易)
  • “最近”的平均值(比如一个月左右)
  • “长期”平均值(超过一年)

是否有任何聪明的算法/数据模型可以保存这些移动平均线而无需通过总结大量数据来重新计算它们?

我不需要精确的平均值(恰好30天左右),只需要趋势指标。所以一些模糊不是一个问题。它应该确保新条目的权重高于旧条目。

一种解决方案可能是自动创建每个月的统计记录。但是,我甚至不需要过去一个月的统计数据,所以这看起来有点矫枉过正。并且它不会给我一个移动平均线,而是每个月交换新值。

3 个答案:

答案 0 :(得分:7)

一个简单的解决方案是保持指数衰减的总数。

可以使用以下公式计算:

newX = oldX * (p ^ (newT - oldT)) + delta

其中oldX是总数的旧值(时间为oldT),newX是总数的新值(时间newT); delta是新事件对总数的贡献(例如今天的点击次数); p小于或等于1并且是衰减因子。如果我们选择p = 1,那么我们就会有总点击次数。通过减少p,我们有效地减少了我们总描述的间隔。

答案 1 :(得分:1)

如果您真正想要的是具有给定时间常数的平滑值,那么最简单的方法是使用单极递归IIR滤波器(又名 AR 时间序列分析中的自动回归过滤器)。采用以下形式:

Xnew = k * X_old + (1 - k) * x

其中X_old是先前的平滑值,X_new是新的平滑值,x是当前数据点,k是确定时间常数的因子(通常是一个小值,< 0.1)。根据您的采样率,您可能需要根据您的采样率确定两个k值("一个"一个值为#34;一个较小值"长期"),理想情况下应合理地保持恒定,例如每天更新一次。

答案 2 :(得分:0)

这可能是你的解决方案。

您可以按小时或天分组数据到中间存储。比分组功能工作得非常快,因为你需要分组少量的记录和插入也会很快。精确决定由你决定。

它可能比自动相关指数算法更好,因为你可以更容易地理解你计算的内容,并且每步都不需要数学。

对于上一学期数据,您可以使用带有有限数量记录的上限集合。他们本地支持一些数据库,例如MongoDB。