摘要:RRCF是亚马逊提出的一个流式异常检测算法,是对孤立森林的改进,可对时序或非时序数据进行异常检测。本文是我从事AIOps研发工作时所做的基于RRCF的时序异常检测方案。

1.      数据格式

将时间序列以滑动窗口的形式转换为d维空间点。例如对于时间序列[1,2,3,4,5,6,7,8],d=5,那么可以将该时间序列转换为4个空间点[(1,2,3,4,5),(2,3,4,5,6),(3,4,5,6,7),(4,5,6,7,8)]。RCF以这样的高维空间点进行建模和检测。

2.      参数

点的维度d;

森林里树的数量tree_num;

单棵树的大小tree_size,即一棵树中包含多少点;

异常阈值thresh,即根据RCF异常得分判定是否异常的阈值。

3.      RCF原理

3.1树的构建

输入:数据集S,数据的维度d。

输出:一个包含branch和leaf的树。

  1. 计算每个维度上的跨度:
  2. 维度选择:按照的概率随机选择一个维度q.
  3. 切分点选择:对维度q,按照均匀概率分布,随机选择该维度的一个切分点.
  4. 维度q和对应切分点p构成一个branch.该branch将数据集S切分为两个子节点:
  5. 若或者集合中只有一个点,则将该子节点标记为这棵树的叶子节点(leaf)。
  6. 若或者集合中的点的数量大于1,则重复迭代1~5步骤。直到所有的点都变为叶子节点(leaf)。

3.2点的删除和插入

可以证明(论文引理4、6):

1、点的删除:将点p从由S构成的树T中删除,得到的树T’和直接从点集S-{p}构建的树T’’的概率分布是一致的。

2、点的插入:将点p插入到由S构成的树T中,得到的树T’和直接从点集S∪{p}构建的树T’’的概率分布是一致的。

这两个引理意味着,要计算点的加入和删除带来的树的复杂度的变化,只需要将点插入到原有的树中,或从原有的树中删除,而不需要使用新的点集重新构建树。这是RCF算法可用于流式检测的理论依据。

3.3异常得分codisp的计算

树的表示:树的每一个叶子节点都可以使用一个bit向量进行表示,如(0,0,1,0),0代表是父节点的左孩子,1代表是父节点的右孩子,同时向量的长度(即比特数)也就是该叶子节点在树中的深度。因此,一棵树可由所有叶子节点的bit向量来刻画。

树的复杂度:将树T的复杂度|M(T)|定义为,描述一棵树所需要的bit数。因此树的复杂度也等于所有叶子节点在树中的深度的和。

点的displacement:将一个叶子节点从树中删除,将导致树的结构发生改变,也会导致树的复杂度发生改变。将一个点删除后,树的复杂度的变化量(减少量)定义为该点的displacement。点的displacement表征了一个点的异常程度,displacement越大,该点越可能是异常。

点的co-displacement:displacement是计算删除一个点后树的复杂度的变化量,假如被删除的点是异常点,但如果树中还存和被删除点十分靠近的点,那么删除这个异常点将不会导致树的结构发生大的变化,因此其displacement就不会很大,因此很可能会把这个点误判为非异常点。这种现象在异常检测领域被称为masking。为解决masking问题,使用co-displacement作为点的异常评分。

在计算co-disp时,除了删除待检测目标点,还要考虑删除与目标点比较接近的点集,然后计算树的复杂度的变化量。

具体做法为(证明见引理2):

从待检测的叶子节点出发,沿着叶子节点到根节点的路径,分别尝试删除该叶子节点、该叶节点的父、祖父、曾祖父……节点,每删除一个节点(也就是一个点集),计算模型复杂度的变化量。该叶子节点的co-disp定义为所有变化量的最大值。

异常检测:检测时,将待检测点插入到森林中的每一棵树中,计算所有树对该点的异常评分co-disp,取其平均值作为该点的异常得分。

4.      异常检测过程

4.1热启动

4.1.1模型训练
  1. 将时间序列转化为空间点集S,且应保证|S|>=tree_num*tree_size;
  2. 如果|S|>tree_num*tree_size,对S进行下采样至 |S|=tree_num*tree_size;
  3. 对S进行分区,将其分为tree_num份,每份包含tree_size个点;
  4. 使用S的每一个分区构建一棵树,所有的树构成一个森林。
  5. 接收一个新点;
  6. 对该点是否异常进行判定:
4.1.2异常检测过程

i.            将新点插入到每一棵树中,并计算每一棵树对该点的异常评分co-disp;

ii.            计算所有树的异常评分的均值作为该点的异常得分;

iii.            异常得分与异常阈值比较,进行异常判定;

iv.            将新点从每棵树中删除;

  1. 将新点更新到模型中:

i.            随机选择一棵树;

ii.            将该树中最旧的点删除;

iii.            将新点插入该树;

4.2冷启动

也可以冷启动的方式运行,不事先训练模型,直接启动检测,为每个序列初始化一个模型(由若干空树构成的森林),随着数据的流入,树不断增长,直到达到设定的tree_size后,模型的大小不再改变,但仍然持续更新。这种工作方式可由引理6作支撑。过程类似:

a)       首先初始化tree_num棵空树;

b)      接收一个新点;

c)       对该点是否异常进行判定:

i.            将新点插入到每一棵树中,并计算每一棵树对该点的异常评分co-disp;

ii.            计算所有树的异常评分的均值作为该点的异常得分;

iii.            异常得分与异常阈值比较,进行异常判定;

iv.            将新点从每棵树中删除;

d)      将新点更新到模型中:

i.            随机选择一棵树;

ii.            如果树的大小已达到tree_size,则将该树中最旧的点删除,否则跳过;

iii.            将新点插入该树;

基于RRCF(robust random cut forest)的时间序列异常检测流程的更多相关文章

  1. 异常检测算法Robust Random Cut Forest(RRCF)关键定理引理证明

    摘要:RRCF是亚马逊发表的一篇异常检测算法,是对周志华孤立森林的改进.但是相比孤立森林,具有更为扎实的理论基础.文章的理论论证相对较为晦涩,且没给出详细的证明过程.本文不对该算法进行详尽的描述,仅对 ...

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

    1. 基于统计的异常检测 Grubbs' Test Grubbs' Test为一种假设检验的方法,常被用来检验服从正太分布的单变量数据集(univariate data set)\(Y\) 中的单个异 ...

  3. 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自:Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability,如侵立 ...

  4. AIOps探索:基于VAE模型的周期性KPI异常检测方法——VAE异常检测

    AIOps探索:基于VAE模型的周期性KPI异常检测方法 from:jinjinlin.com   作者:林锦进 前言 在智能运维领域中,由于缺少异常样本,有监督方法的使用场景受限.因此,如何利用无监 ...

  5. 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习

    论文http://202.119.32.195/cache/10/03/cs.nju.edu.cn/da2d9bef3c4fd7d2d8c33947231d9708/tkdd11.pdf 1. INT ...

  6. 异常检测算法--Isolation Forest

    南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...

  7. 异常检测算法:Isolation Forest

    iForest (Isolation Forest)是由Liu et al. [1] 提出来的基于二叉树的ensemble异常检测算法,具有效果好.训练快(线性复杂度)等特点. 1. 前言 iFore ...

  8. 基于PySpark的网络服务异常检测系统 (四) Mysql与SparkSQL对接同步数据 kmeans算法计算预测异常

    基于Django Restframework和Spark的异常检测系统,数据库为MySQL.Redis, 消息队列为Celery,分析服务为Spark SQL和Spark Mllib,使用kmeans ...

  9. 基于PySpark的网络服务异常检测系统 阶段总结(二)

    在上篇博文中介绍了网络服务异常检测的大概,本篇将详细介绍SVDD和Isolation Forest这两种算法 1. SVDD算法 SVDD的英文全称是Support Vector Data Descr ...

随机推荐

  1. 解析分布式应用框架Ray架构源码

    摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...

  2. 实验: survivor放不下的对象进入老年代

    实验一: 存活对象包含 小于survivor大小的对象 + 大于survivor的对象 private static final Integer _1MB = 1024 * 1024; /** * - ...

  3. python-3-3 字典

    一 元组(tuple) 1.元组也是一个list,他和list的区别是 元组里面的数据无法修改 元祖用()小括号表示,如果元祖里面只有一个元素的话,必须在这个元素的后面添加一个逗号,不然就不是元祖了 ...

  4. .Net5下WebRequest、WebClient、HttpClient是否还存在使用争议?

    WebRequest.WebClient.HttpClient 是C#中常用的三个Http请求的类,时不时也会有人发表对这三个类使用场景的总结,本人是HttpClient 一把梭,也没太关注它们的内部 ...

  5. 【python小示例】简易彩票中奖模拟

    咱自己写个彩票程序,成功亏掉3个亿 今天突发奇想,自己设计一个小程序,模拟彩票中奖,看看如果自己有个彩票公司,能挣钱吗?代码如下: # -*- utf-8 -*- """ ...

  6. java例题_06 最大公约数&最小公倍数

    1 /*6 [程序 6 求最大公约数及最小公倍数] 2 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 3 程序分析:利用辗除法. 4 */ 5 6 /*分析 7 * ======== ...

  7. Java学习之随机数的用法

    •前言 随机数的产生在一些代码中很常用,也是我们必须要掌握的. 而 Java 中产生随机数的方法主要有三种: new Random() Math.random() currentTimeMillis( ...

  8. kubernetes删除pod一直处于terminating状态的解决方法

    kubernetes删除pod一直处理 Terminating状态 # kubectl get po -n mon NAME READY STATUS RESTARTS AGE alertmanage ...

  9. 【洛谷】P1294 高手去散步

    题目背景 高手最近谈恋爱了.不过是单相思."即使是单相思,也是完整的爱情",高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开始之前 ...

  10. OO_Unit4_Summary暨课程总结

    初始oo,有被往届传言给吓到:oo进行中,也的确有时会被作业困扰(debug到差点放弃):而oo即将结束的此刻,却又格外感慨这段oo历程. 一.单元架构设计 本单元任务是设计一个UML解析器,能够支持 ...