11

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

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

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

double outlier_detection(double* vector, double value);

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

4

2 回答 2

9

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

于 2010-08-02T18:13:45.327 回答
1

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

训练

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

计算“异常值”:

对于您想知道其“异常值”的单个样本:

  • 从训练中检索均值、协方差矩阵和马氏距离s
  • 计算样本的马氏距离“d”
  • 返回“d”下降的百分位数(使用训练的马氏距离)

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


PS。在计算马氏距离时,使用相关矩阵,而不是协方差矩阵。如果样本测量的单位和数量不同,这将更加稳健。

于 2016-11-24T11:09:47.757 回答