3

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

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

  • 总点击数(简单)
  • “最近”的平均值(比如一个月左右)
  • “长期”平均值(一年以上)

是否有任何巧妙的算法/数据模型可以保存此类移动平均线,而无需通过汇总大量数据来重新计算它们?

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

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

4

3 回答 3

6

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

可以使用以下公式计算:

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

哪里oldX是你总的旧值(在时间oldT),newX是你的总价值的新值(在时间newT);delta是新事件对总数的贡献(例如今天的点击数);p小于或等于 1 并且是衰减因子。如果我们取p = 1,那么我们就有了点击总数。通过减少p,我们有效地减少了总描述的区间。

于 2011-11-21T12:18:04.140 回答
1

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

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

其中X_old是之前的平滑值,X_new是新的平滑值,x 是当前数据点,k 是决定时间常数的因子(通常是一个小值,< 0.1)。您可能需要根据您的采样率凭经验确定两个 k 值(一个值用于“最近”,一个较小值用于“长期”),理想情况下,采样率应该是相当恒定的,例如每天更新一次。

于 2011-11-21T12:16:37.247 回答
0

它可能是您的解决方案。

您可以将数据聚合到按小时或天分组的中间存储。分组功能的工作速度会非常快,因为您需要对少量记录进行分组,并且插入也会很快。精确决策由您决定。

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

对于上学期数据,您可以使用记录数量有限的上限集合。它们被一些数据库原生支持,例如 MongoDB。

于 2011-11-21T13:05:31.263 回答