当前位置: 首页 > news >正文

时间序列异常检测算法S-H-ESD

1. 基于统计的异常检测

Grubbs' Test

Grubbs' Test为一种假设检验的方法,常被用来检验服从正太分布的单变量数据集(univariate data set)\(Y\) 中的单个异常值。若有异常值,则其必为数据集中的最大值或最小值。原假设与备择假设如下:

\(H_0\): 数据集中没有异常值
\(H_1\): 数据集中有一个异常值

Grubbs' Test检验假设的所用到的检验统计量(test statistic)为

\[ G = \frac{\max |Y_i - \overline{Y}|}{s} \]

其中,\(\overline{Y}\)为均值,\(s\)为标准差。原假设\(H_0\)被拒绝,当检验统计量满足以下条件

\[ G > \frac{(N-1)}{\sqrt{N}}\sqrt{\frac{ (t_{\alpha/(2N), N-2})^2}{N-2 + (t_{\alpha/(2N), N-2})^2}} \]

其中,\(N\)为数据集的样本数,\(t_{\alpha/(2N), N-2}\)为显著度(significance level)等于\(\alpha/(2N)\)、自由度(degrees of freedom)等于\(N-2\)的t分布临界值。实际上,Grubbs' Test可理解为检验最大值、最小值偏离均值的程度是否为异常。

ESD

在现实数据集中,异常值往往是多个而非单个。为了将Grubbs' Test扩展到\(k\)个异常值检测,则需要在数据集中逐步删除与均值偏离最大的值(为最大值或最小值),同步更新对应的t分布临界值,检验原假设是否成立。基于此,Rosner提出了Grubbs' Test的泛化版ESD(Extreme Studentized Deviate test)。算法流程如下:

  • 计算与均值偏离最远的残差,注意计算均值时的数据序列应是删除上一轮最大残差样本数据后;

\begin{equation}
R_j = \frac{\max_i |Y_i - \overline{Y'}|}{s}, \quad 1 \leq j \leq k
\label{eq:esd_test}
\end{equation}

  • 计算临界值(critical value);

\[ \lambda_j = \frac{(n-j) * t_{p,n-j-1}}{\sqrt{(n-j-1+t_{p,n-j-1}^2)(n-j+1)}}, \quad 1 \leq j \leq k \]

  • 检验原假设,比较检验统计量与临界值;若\(R_i > \lambda_j\),则原假设\(H_0\)不成立,该样本点为异常点;

  • 重复以上步骤\(k\)次至算法结束。

2. 时间序列的异常检测

鉴于时间序列数据具有周期性(seasonal)、趋势性(trend),异常检测时不能作为孤立的样本点处理;故而Twitter的工程师提出了S- ESD (Seasonal ESD)与S-H-ESD (Seasonal Hybrid ESD)算法,将ESD扩展到时间序列数据。

S-ESD

STL将时间序列数据分解为趋势分量、周期分量和余项分量。想当然的解法——将ESD运用于STL分解后的余项分量中,即可得到时间序列上的异常点。但是,我们会发现在余项分量中存在着部分假异常点(spurious anomalies)。如下图所示:

399159-20180620104722640-1761537210.png

在红色矩形方框中,向下突起点被误报为异常点。为了解决这种假阳性降低准确率的问题,S-ESD算法用中位数(median)替换掉趋势分量;余项计算公式如下:

\[ R_X = X - S_X- \tilde{X} \]

其中,\(X\)为原时间序列数据,\(S_X\)为STL分解后的周期分量,\(\tilde{X}\)\(X\)的中位数。

S-H-ESD

由于个别异常值会极大地拉伸均值和方差,从而导致S-ESD未能很好地捕获到部分异常点,召回率偏低。为了解决这个问题,S-H-ESD采用了更具鲁棒性的中位数与绝对中位差(Median Absolute Deviation, MAD)替换公式\eqref{eq:esd_test}中的均值与标准差。MAD的计算公式如下:

\[ MAD = median(|X_i - median(X)|) \]

S-H-ESD的Python实现有pyculiarity,时间序列异常检测数据集有Yahoo公开的A Labeled Anomaly Detection Dataset。

3. 参考资料

[1] Hochenbaum, Jordan, Owen S. Vallis, and Arun Kejariwal. "Automatic Anomaly Detection in the Cloud Via Statistical Learning." arXiv preprint arXiv:1704.07706 (2017).

相关文章:

  • docker实战
  • Hive 部署
  • Openstack 之 Prometheus 监控
  • python3 异步模块asyncio
  • 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
  • 大数据经典学习路线(及供参考)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MySQL数据库运维之数据恢复
  • 函数防抖和函数节流
  • 持续开放,腾讯TARS、TSeer助力Linux建设开源社区
  • 探索 JS 中的模块化
  • 跟我一起学docker(四)--容器的基本操作
  • Ubuntu安装jdk
  • python全栈开发 * 19 面向对象 知识点汇总 * 180701
  • replace 使用正则
  • .pyc 想到的一些问题
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • egg(89)--egg之redis的发布和订阅
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Just for fun——迅速写完快速排序
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • oldjun 检测网站的经验
  • Python_网络编程
  • react 代码优化(一) ——事件处理
  • Ruby 2.x 源代码分析:扩展 概述
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 大型网站性能监测、分析与优化常见问题QA
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 项目实战-Api的解决方案
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​插件化DPI在商用WIFI中的价值
  • #NOIP 2014# day.1 T2 联合权值
  • #NOIP 2014#Day.2 T3 解方程
  • #Ubuntu(修改root信息)
  • #vue3 实现前端下载excel文件模板功能
  • (2020)Java后端开发----(面试题和笔试题)
  • (js)循环条件满足时终止循环
  • (第二周)效能测试
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)甲方乙方——赵民谈找工作
  • .NET Core 中插件式开发实现
  • .NET Core中的去虚
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net分布式压力测试工具(Beetle.DT)
  • .NET上SQLite的连接
  • ;号自动换行
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...