通用时间序列在线异常值检测的简单算法
Posted
技术标签:
【中文标题】通用时间序列在线异常值检测的简单算法【英文标题】:Simple algorithm for online outlier detection of a generic time series 【发布时间】:2011-03-24 08:35:44 【问题描述】:我正在处理大量时间序列。 这些时间序列基本上是每 10 分钟进行一次的网络测量,其中一些是周期性的(即带宽),而另一些则不是(即路由流量)。
我想要一个简单的算法来进行在线“异常值检测”。基本上,我想将每个时间序列的整个历史数据保存在内存中(或磁盘上),并且我想检测实时场景中的任何异常值(每次捕获新样本时)。 实现这些结果的最佳方法是什么?
我目前正在使用移动平均线来消除一些噪音,但接下来呢?简单的东西,比如标准差,疯狂,......对整个数据集都不能很好地工作(我不能假设时间序列是固定的),我想要更“准确”的东西,理想情况下是一个黑盒子,比如:
double outlier_detection(double* vector, double value);
其中vector是包含历史数据的double数组,返回值是新样本“值”的异常分数。
【问题讨论】:
您可能还想尝试在 stats.stackexchange.com 上提问 - *** 专门用于统计问题。 在stats.stackexchange.com/questions/1142/…stats.stackexchange.com/questions/1142/…上发布了这个问题的几个答案 【参考方案1】:这是一个庞大而复杂的主题,答案将取决于 (a) 您希望为此投入多少精力以及 (b) 您希望异常值检测的效果如何。一种可能的方法是adaptive filtering,它通常用于降噪耳机等应用。您有一个不断适应输入信号的滤波器,有效地将其滤波器系数与信号源的假设短期模型相匹配,从而减少均方误差输出。这会给你一个低电平的输出信号(残差)除了,当你得到一个异常值时,这将导致一个尖峰,这很容易检测到(阈值)。如果您对这种技术很认真,请阅读adaptive filtering、LMS filters 等。
【讨论】:
感谢您的回复。这似乎是一个不错的方法,但如果信号表现出高季节性(即许多网络测量同时具有每日和每周模式的特征,例如夜间与白天或周末与工作日)怎么办?自适应滤波器能否对这方面进行建模?在我的理想世界中,我想检测周日早上发生的交通高峰,而周一可能完全正常。 只要您的滤波器中有足够的项来模拟各种周期性,那么它应该可以正常工作 - 自适应滤波器会去除这些频率,只留下残余噪声。 再次感谢您,我想尝试基于这些东西的算法。您是否知道是否有一些通用库可以在实际实现之前对这种方法进行初步模拟(这可能需要一些时间)? 您可以在 MATLAB(或像 Octave 这样的免费克隆)中快速轻松地制作原型。参见例如mathworks.com/matlabcentral/fileexchange/…【参考方案2】:我建议以下方案,应该可以在一天左右的时间内实施:
培训
尽可能多地收集样本 使用每个属性的标准差去除明显的异常值 计算并存储相关矩阵以及每个属性的平均值 计算并存储所有样本的Mahalanobis distances计算“异常值”:
对于您想知道其“异常值”的单个样本:
从训练中检索均值、协方差矩阵和Mahalanobis distances 为您的样本计算Mahalanobis distance“d” 返回“d”落入的百分位数(使用训练的马氏距离)这将是您的异常值:100% 是一个极端异常值。
PS。在计算Mahalanobis distance 时,使用相关矩阵,而不是协方差矩阵。如果样本测量的单位和数量不同,这将更加稳健。
【讨论】:
以上是关于通用时间序列在线异常值检测的简单算法的主要内容,如果未能解决你的问题,请参考以下文章
andrew ng machine learning week9 异常检测和推荐系统
异常检测:综述(基本都是无监督算法)时间序列算法:AR/MA/ARMA传统机器学习算法:孤独森林One Class SVM深度学习算法:AutoEncoderLSTMDeepLog