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


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

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

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

double outlier_detection(double* vector, double value);

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


3804
2017-08-02 18:03


起源

您可能还想尝试在stats.stackexchange.com上询问 - 严格来说,它是StackOverflow用于统计问题。 - Matt Parker
现在已经有几个答案发布在这个问题上 stats.stackexchange.com/questions/1142/... - Rob Hyndman


答案:


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


9
2017-08-02 18:13



感谢您的答复。这似乎是一个很好的方法,但如果信号表现出很高的季节性(即许多网络测量的特点是同时每天和每周的模式,例如夜晚与白天或周末对工作日),该怎么办?自适应滤波器能够对这方面进行建模吗?在我理想的世界里,我想发现星期天早上发生的交通高峰期,而周一同样的值可能完全正常。 - Gianluca
只要您的滤波器中有足够的项来模拟各种周期性,那么它就应该工作 - 自适应滤波器将消除这些频率,只留下残余噪声。 - Paul R
再次感谢您,我想尝试一种基于这些东西的算法。在进行实际实现(可能需要一些时间)之前,您是否知道是否有一些通用库可以对此方法进行初步模拟? - Gianluca
您可以在MATLAB(或像Octave这样的免费克隆)中快速轻松地对此进行原型设计。参见例如 mathworks.com/matlabcentral/fileexchange/... - Paul R


我建议下面的方案,应该在一天左右实现:

训练

  • 尽可能多地收集内存中的样本
  • 使用每个属性的标准偏差删除明显的异常值
  • 计算并存储相关矩阵以及每个属性的均值
  • 计算并存储 马哈拉诺比斯距离 你所有的样品

计算“离群值”:

对于您想要了解其“异常值”的单个样本:

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


PS。在计算中 马哈拉诺比斯距离,使用相关矩阵,而不是协方差矩阵。如果样品测量单位和数量不同,则更加稳健。


1
2017-11-24 11:09