实时检测事件频率的峰值

5
在一个Web应用程序中,每次事件发生时我都会收到一个触发器。我想检测“暴力”频率峰值,这可能意味着异常行为。
我可以想到两种天真的方法来实现这一点:
- 固定阈值 - “如果在一分钟内发生超过500个事件,则可能出现问题”。除非应用程序可以定期调整阈值,否则此方法无法处理平滑阈值违规或逐渐增加的流量。 - 与窗口相关的启发式 - 将窗口分成N个相等的间隔。当N> 0时,在[now-(N * interval_length),now]中计算发生的事件频率。将其保存在列表中。将N减少1。重复。检测列表异常值。如果有一个大于[now-window_length,now]的平均频率的异常值,则可能出现问题。
我想知道是否有解决此问题的常见/标准解决方案,或者您是否能够想到任何更有效或更优雅的解决方案。
提前感谢您。
编辑 - 另一个建议
我的一位朋友建议使用Holt-Winters预测检测异常行为。您可以在以下链接中找到有关此方法的更多信息:

http://www.hpl.hp.com/news/events/csc/2005/jake_slides.pdf

http://www.usenix.org/events/lisa00/full_papers/brutlag/brutlag_html/

3个回答

1

我不是专家。我的做法是:

假设你只保留最后n个结果,而x_n是最后一个样本(与上一个事件的时间差)。

α_n x_n + α_{n-1}/2 x_{n-1} + ... + α_{1} 2^{-n} x_1 = T

如果差值T-T_{previous},其中T_{previous}T的上一个值,超过了一个限制,那么就做点什么。

如果您的x_i值是二进制的,那么您可以通过shiftor操作使用巧妙的技巧,如果速度是关键。


谢谢回答 =) 这里有一些问题.. a) 事件越近,它的权重就越大,对吗? b) 'a'代表什么?我不能只调整T以避免'n'次乘法吗? - sawidis
好的观察。我忘记了 α_i 上的索引。 如果您想要特殊权重,可以将它设为每个 ia_i = 1。如果您的意思是将 T 向右移动并添加 x_n 的新值,则是正确的。 - Dimitris Leventeas
1
是的,更近期的意义更重要。 - Dimitris Leventeas

0

只需对过去X分钟的值进行简单平均(保留这些值)

将每个新进入的值与平均值进行比较:

  • 如果差异超过Y%,则为异常值,请发出警报。
  • 如果差异小于Y%,则将其添加到平均值中并删除第一个值,以FIFO方式进行。

如果您认为它可能被“稳步增加的流量”欺骗,请使X足够大。


1
我认为我们更关心现在频率更高的信号,而不是之前发生的信号,时间间隔可以称为“一段时间”。其中,“一段时间”指的是窗口的长度。 - Dimitris Leventeas

0
你可以计算指数加权浮动均值估计,并将其与先前的值进行比较。突然的增加可能是你想要检测到的,但结合一定的最小阈值(例如0到1不重要)。
但是,如果当前的浮动平均值从100跳到200,那可能就是你想要检测到的事件类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接