干货 :时间序列异常检测( 二 )


算法流程:
1. 样本从小到大排序
2. 求样本的mean和std.dev
3. 计算min/max与mean的差距 , 更大的那个为可疑值
4. 求可疑值的z-score ( score) , 如果大于临界值 , 那么就是;
5. 临界值可以查表得到 , 它由两个值决定:检出水平α(越严格越小) , 样本数量n , 排除 , 对剩余序列循环做 1-4 步骤 。由于这里需要的是异常判定 , 只需要判断是否即可 。
【干货 :时间序列异常检测】基于预测的异常检测
对于单条时序数据 , 根据其预测出来的时序曲线和真实的数据相比 , 求出每个点的残差 , 并对残差序列建模 , 利用或者分位数等方法便可以进行异常检测 。具体的流程如下:

干货 :时间序列异常检测

文章插图
以网络流量曲线为例 , 该曲线局部都抖动地很厉害 , 若对原始数据建模 , 则会吸收很很大的噪音 , 影响模型的效果 , 可以先用平滑函数对数据进行平滑处理 。下图中 , 蓝色曲线是原始的网络流量数据 , 紫色是经过长度为5的矩形窗口平滑之后的结果 。
干货 :时间序列异常检测

文章插图
为了让大家有对比的看清楚平滑的效果 , 上图中两条曲线是画在不同的Y轴坐标系下的 。先将两条曲线绘制在同一个Y轴下面 , 计算对应的点的残差序列 , 可以较好的找到异常的点 。如下图中的红色圆圈标记出来的结果 。
干货 :时间序列异常检测

文章插图
基于距离的方法/基于邻近度的方法
通常可以在对象之间定义邻近性度量 , 并且许多异常检测方法都基于邻近度 。异常对象是那些远离大部分其他对象的对象 。这一领域的许多方法都基于距离 , 称作基于距离的离群点检测方法 。当数据能够以二维或三维散布图显示时 , 通过寻找与大部分其他点分离的点 , 可以从视觉上检测出基于距离的离群点 。但是该方法计算复杂度过高 , 且分布不均匀的点 , 容易出错 。
有关时间序列距离度量的方法 , 可以参考之前文章:《TS技术课堂 | 时间序列聚类》
方法:
基于密度的方法
对象的密度估计可以相对直接地计算 , 特别是当对象之间存在邻近性度量时 , 低密度区域中的对象相对远离近邻 , 可能被看作异常 。一种更复杂的方法考虑到数据集可能有不同密度区域这一事实 , 仅当一个点的局部密度显著地低于它的大部分近邻时才将其分类为离群点 。
1. 基于密度的异常
异常就是那些在低密度区域的数据对象 , 一个数据对象的异常分就是该对象所在区域的密度的倒数 , 下面是基于密度的异常分的计算公式:
其中
指的是x的k个最近的邻居的集合 , 
表示该集合的大小 , y是x最近的邻居 。
2. 给定半径的邻域内的数据对象数
一个数据对象的密度等于半径为d的邻域内的数据对象数 。
d的选择很重要 , 若d太小 , 则会有很多正常的数据对象被认为是异常点;若d太大 , 则很多异常数据对象会被误判为正常点 。事实上 , 当密度分布不均匀的时候 , 上述方法得到的异常点会不正确 。为了克服密度不均匀的情况 , 我们使用下面的平均相对密度来作为异常分 。