用于在线异常检测的通用时间序列的简单算法

时间:2010-08-02 18:03:07

标签: math statistics real-time time-series

我正在处理大量的时间序列。 这些时间序列基本上是每10分钟一次的网络测量,其中一些是周期性的(即带宽),而另一些则不是(即路由流量)。

我想要一个简单的算法来进行在线“异常值检测”。基本上,我想在内存(或在磁盘上)保存每个时间序列的整个历史数据,并且我想要检测实时场景中的任何异常值(每次捕获新样本时)。 实现这些结果的最佳方法是什么?

我目前正在使用移动平均线来消除一些噪音,但接下来是什么?简单的事情,如标准偏差,疯狂,...对整个数据集不能很好地工作(我不能假设时间序列是静止的),我想要一些更“准确”的东西,理想情况下是一个黑盒子,如:

double outlier_detection(double* vector, double value);

其中vector是包含历史数据的double数组,返回值是新样本“value”的异常分数。

2 个答案:

答案 0 :(得分:9)

这是一个庞大而复杂的主题,答案取决于(a)您希望投入多少精力以及(b)您希望异常检测的效果如何。一种可能的方法是adaptive filtering,它通常用于降噪耳机等应用。你有一个滤波器,它不断适应输入信号,有效地将其滤波器系数与信号源的假设短期模型相匹配。从而减少均方误差输出。然后,这将为您提供低电平输出信号(剩余误差),除了,当您得到一个异常值时,这将导致尖峰,这将很容易检测(阈值)。如果您认真对待这种技术,请阅读adaptive filteringLMS filters等。

答案 1 :(得分:1)

我建议下面的方案,应该在一天左右的时间内实施:

培训

  • 收集尽可能多的内存样本
  • 使用每个属性的标准差
  • 删除明显的异常值
  • 计算并存储相关矩阵以及每个属性的平均值
  • 计算并存储所有样本的Mahalanobis distances

计算"离群值":

对于您想知道其单一样本"异常值":

  • 从训练中检索平均值,协方差矩阵和Mahalanobis distance
  • 计算Mahalanobis distance" d"为您的样品
  • 返回" d"的百分位数。跌倒(使用马哈拉诺比斯距离训练的距离)

这将是你的异常值:100%是一个极端异常值。

<小时/> PS。在计算Mahalanobis distance时,使用相关矩阵,而不是协方差矩阵。如果样品测量值的单位和数量不同,则更加稳健。