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