我正在处理大量的时间序列。 这些时间序列基本上是每10分钟一次的网络测量,其中一些是周期性的(即带宽),而另一些则不是(即路由流量)。
我想要一个简单的算法来进行在线“异常值检测”。基本上,我想在内存(或在磁盘上)保存每个时间序列的整个历史数据,并且我想要检测实时场景中的任何异常值(每次捕获新样本时)。 实现这些结果的最佳方法是什么?
我目前正在使用移动平均线来消除一些噪音,但接下来是什么?简单的事情,如标准偏差,疯狂,...对整个数据集不能很好地工作(我不能假设时间序列是静止的),我想要一些更“准确”的东西,理想情况下是一个黑盒子,如:
double outlier_detection(double* vector, double value);
其中vector是包含历史数据的double数组,返回值是新样本“value”的异常分数。
答案 0 :(得分:9)
这是一个庞大而复杂的主题,答案取决于(a)您希望投入多少精力以及(b)您希望异常检测的效果如何。一种可能的方法是adaptive filtering,它通常用于降噪耳机等应用。你有一个滤波器,它不断适应输入信号,有效地将其滤波器系数与信号源的假设短期模型相匹配。从而减少均方误差输出。然后,这将为您提供低电平输出信号(剩余误差),除了,当您得到一个异常值时,这将导致尖峰,这将很容易检测(阈值)。如果您认真对待这种技术,请阅读adaptive filtering,LMS filters等。
答案 1 :(得分:1)
我建议下面的方案,应该在一天左右的时间内实施:
对于您想知道其单一样本"异常值":
这将是你的异常值:100%是一个极端异常值。
<小时/> PS。在计算Mahalanobis distance时,使用相关矩阵,而不是协方差矩阵。如果样品测量值的单位和数量不同,则更加稳健。