Math 通用时间序列在线离群点检测的简单算法

Math 通用时间序列在线离群点检测的简单算法,math,statistics,real-time,time-series,Math,Statistics,Real Time,Time Series,我正在处理大量的时间序列。 这些时间序列基本上是每10分钟进行一次的网络测量,其中一些是周期性的(即带宽),而另一些不是周期性的(即路由流量) 我想要一个简单的算法做一个在线“离群点检测”。基本上,我希望将每个时间序列的全部历史数据保存在内存(或磁盘)中,并希望检测实时场景中的任何异常值(每次捕获新样本时)。 实现这些结果的最佳方式是什么 我目前正在使用移动平均线来消除一些噪音,但接下来呢?简单的事情,比如标准差,mad。。。针对整个数据集的情况,数据集无法正常工作(我不能假设时间序列是平稳的)

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

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

我目前正在使用移动平均线来消除一些噪音,但接下来呢?简单的事情,比如标准差,mad。。。针对整个数据集的情况,数据集无法正常工作(我不能假设时间序列是平稳的),我希望得到更“精确”的数据,理想情况下是一个黑匣子,如:

double outlier_detection(double* vector, double value);

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

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

我建议采用以下方案,大约一天内即可实施:

训练
  • 收集尽可能多的样本,以保存在内存中
  • 使用每个属性的标准偏差删除明显的异常值
  • 计算并存储相关矩阵以及每个属性的平均值
  • 计算并存储所有样本的数据
计算“异常值”: 对于您想知道其“异常值”的单个样本:

  • 从训练中检索均值、协方差矩阵和s
  • 计算样本的“d”
  • 返回“d”下降的百分位数(使用训练的马氏距离)
这就是你的异常值分数:100%是一个极端异常值



PS.在计算时,使用相关矩阵,而不是协方差矩阵。如果样本测量值在单位和数量上有所不同,这将更加可靠。

感谢您的回复。这似乎是一个很好的方法,但如果信号表现出很高的季节性(即,许多网络测量的特点是每天和每周同时进行,例如夜间与白天或周末与工作日)?自适应滤波器是否能够对这方面进行建模?在我的理想世界中,我想在周日早上发现交通高峰,而同样的值在周一可能是完全正常的。只要你的滤波器中有足够的项来模拟不同的周期,那么它应该就可以工作了——自适应滤波器将去除这些频率,只留下残余的噪声。再次感谢你,我想尝试一种基于这些内容的算法。在进行实际实现之前(这可能需要一些时间),您是否知道是否有一些通用库可以对该方法进行初步模拟?您可能可以在MATLAB(或像Octave这样的免费克隆)中快速轻松地对其进行原型化。请参阅,例如,您可能还想尝试在stats.stackexchange.com上提问-这是统计问题的StackOverflow。现在,在