SLS机器学习介绍(02):时序聚类建模

摘要: 在大型互联网企业中,对海量KPI(关键性能指标)进行监控和异常检测是确保服务质量和可靠性的重要手段。基于互联网的服务型企业(如线上购物、社交网络、搜索引擎等)经过监控各类系统及应用的数以万计的KPI(如CPU利用率、每秒请求量等)来确保服务可靠性。php

文章系列连接

前言

第一篇文章SLS机器学习介绍(01):时序统计建模上周更新完,一会儿炸出了不少潜伏的业内高手,忽的发现集团内部各个业务线都针对时序分析存在必定的需求。你们私信问我业务线上的具体方法,在此针对遇到的通用问题予以陈述(权且抛砖引玉,但愿各位大牛提供更好的建议和方法):html

  • 数据的高频抖动如何处理?node

    • 在业务需求能知足的条件下,进可能的对数据作聚合操做,用窗口策略消除抖动
    • 若不能粗粒度的聚合,我通常会选择窗口滤波操做,在针对滤波后的数据进行一次去异常点操做
    • 改变检测策略,将问题变成一个回归问题,引入多维度特征,对目标进行预测
  • 历史训练数据如何选择?算法

    • 针对本身的时序数据,须要先进行简单的摸底操做,选择合适的模型,是否是有明显的周期?是否是有明显的趋势?
  • 这么多方法该如何选择?数据库

    • 针对单指标预测的方法,须要采用多种算法模型进行预测,将获得的结果也要集成起来,下降误报操做
    • 能够针对历史上的全量报警样本,设计一套报警聚合规则,在必定容忍度的条件下获得较好的结果

摘要

在大型互联网企业中,对海量KPI(关键性能指标)进行监控和异常检测是确保服务质量和可靠性的重要手段。基于互联网的服务型企业(如线上购物、社交网络、搜索引擎等)经过监控各类系统及应用的数以万计的KPI(如CPU利用率、每秒请求量等)来确保服务可靠性。KPI上的异常一般反映了其相关应用上可能出现故障,如服务器故障、网络负载太高、外部攻击等。于是,异常检测技术被普遍用于及时检测异常事件以达到快速止损的目的。服务器

问题背景

大多数异常检测算法(如雅虎的EDAGS,Twitter的BreakoutDetection,FaceBook的prophet)都须要为每条KPI单独创建异常检测模型,在面对海量KPI时,会产生极大的模型选择、参数调优、模型训练及异常标注开销。幸运的是,因为许多KPI之间存在隐含的关联性,它们是较为类似的。若是咱们可以找到这些类似的KPI(例如在一个负载均衡的服务器集群中每一个服务器上的每秒请求量KPI是类似的),将它们划分为若干聚类簇,则能够在每一个聚类簇中应用相同的异常检测模型,从而大大下降各项开销。网络

序列聚类建模

时序自动聚类流程.png

问题定义

在同一个业务指标的前提下:数据结构

  1. 查找出当前时序序列中有哪些类似的曲线形态?(单条曲线的多形态分解)
  2. 多条KPI指标曲线有哪些曲线的形态相似?(N条曲线形态聚类)

类似性度量

本文主要从时间对齐的多条时序KPI中进行类似性度量,时间点上的指标的类似性和时序曲线形态的类似性并发

  1. 时间点聚类(时间上的类似性)
    1.1 闵可夫斯基距离:衡量数值点之间距离的一种常见的方法,假设       

       负载均衡

  1. ,则具体的公式以下:

 

                          

 

 

    当 

时,表示曼哈顿距离; 

时,表示欧几里得距离;当p趋近于无穷大时,该距离转换为切比雪夫距离,具体以下式所式:

 

                                             

 

 

    闵可夫斯基距离比较直观,可是它与数据的分布无关,具备必定的局限性,若是x方向的幅值远远大于y方向的幅值,这个距离公式就会过分方法x维度的做用。所以在加算前,须要对数据进行变换(去均值,除以标准差)。这种方法在假设数据各个维度不相关的状况下,利用数据分布的特性计算出不一样的距离。若是数据维度之间数据相关,这时该类距离就不合适了!

    1.2 马氏距离:若不一样维度之间存在相关性和尺度变换等关系,须要使用一种变化规则,将当前空间中的向量变换到另外一个能够简单度量的空间中去测量。假设样本之间的协方差矩阵是 

,利用矩阵分解(LU分解)能够转换为下三角矩阵和上三角矩阵的乘积:   。消除不一样维度之间的相关性和尺度变换,须要对样本x作以下处理:   

,通过处理的向量就能够利用欧式距离进行度量。

 

             

 

 

  1. 形状之间的类似性(空间上的结构类似性)
    2.1 编辑距离

如何去比较两个不一样长度的字符串的类似性?给定两个字符串,由一个转成另外一个所须要的最小编辑操做,其中须要有三个操做,相同位置字符的替换、对字符串中某个位置进行插入与删除。具体的递归表达式以下:

 

                                                                

 

 

    2.2 DTW(Dynamic Time Warpping)距离
    动态时间规整(Dynamic Time Warping;DTW)是一种将时间规整和距离测度相结合的一种非线性规整技术。主要思想是把未知量均匀地伸长或者缩短,直到与参考模式的长度一致,在这一过程当中,未知量的时间轴要不均匀地扭曲或弯折,以使其特征与参考模式特征对正。
    DTW(Dynamic Time Warping)距离的计算过程以下:
    假设,两个时间序列Q和C,Q={   

,   ,…,   },C={   ,   ,…,   }。构造一个(n, m)的矩阵,第(i, j)单元记录两个点     之间的欧氏距离,         。一条弯折的路径W,由若干个彼此相连的矩阵单元构成,这条路径描述了Q和C之间的一种映射。设第k个单元定义为     ,则         

这条弯折的路径知足以下的条件:

1. 边界条件:$w_1=(1,1)$,且$w_k=(n,m)$
2. 连续性:设$w_k=(a, b)$,$w_{k-1}=(a^{'}, b^{'})$,那么$a-a^{'}<= 1$,$b-b^{'}<=1$
3. 单调性:设$w_k=(a,b)$,$w_{k-1}=(a^{'}, b^{'})$,那么$a-a^{'}>=0, b-b^{'} >=0$

在知足上述条件的多条路径中,最短的,花费最少的一条路径是:

 

                

 

 

DTW距离的计算过程是一个DP过程,先用欧式距离初始化矩阵,而后使用以下递推公式进行求解:

 

 

 

 

算法步骤

1. 数据预处理

  • 数据源:集群中全部集群的多指标度量值(秒级数据)

    • SYS:系统运行状况记录(启动时间,负载状况、进程信息等)
    • NET:网络设备状态传输状况(TCP、UDP等上行和下行流量等)
    • MEMORY:内存使用状况(使用率、交换分区使用状况等)
    • CPU/GPU:使用状况
    • DISK:磁盘IO状况
  • 基本的预处理

    • 肯定下单条数据的信息(查看某机器某指标的状况)
    * and metric_name : machine_022_cpu | select stamp, metric_val order by stamp limit 2000

    image.png

    • 若时序数据含有缺失值,须要将将序列进行补点操做(若是序列缺失小于10%,则模型内部会将缺失数据自动按照邻近值补齐)
    • 该数据是按照15秒一个点进行采样的,若是须要进行更粗粒度的操做,须要额外处理

2. 时序数据的降维采样

集群中有相同属性的机器大约为5K台,那么咱们就会有通过处理的5K条NET:Tcp的曲线,如今须要对该集合进行聚类,找到其中类似形态的曲线,并发现形态不一致的曲线形态。

  • 分段线性表示方法
    分段线性表示是一种使用线性模型来对时间序列进行分割的方法,根据不一样的分割方法可使用不一样的分割策略来实现,如滑动窗口、自底向上和自顶向下。利用滑动窗口和自底向上方法的时间复杂度为序列长度的平方阶, 而自顶向下的时间复杂度为线性阶。滑动窗口在一些状况下对时间序列的拟合效果较差,不能很好地反映原时间序列的变化信息。
  • 分段聚合近似(Piecewise Aggregation Approximation,PAA)表示方法
    经过对时间序列进行平均分割并利用分段序列的均值来表示原时间序列的方法。
  • 符号化表示方法
    符号化表示方法是一种将时间序列转换为字符串序列的过程。在时间序列数据挖掘过程当中,传统方法主要依赖于定量数据,远远不能知足数据挖掘领域中分析和解决问题的要求。在数据结构和算法设计中,字符串具备特定的数据存储结构以及较为成熟且高效的操做算法。

![image.png]()


分段聚合近似表示示意图

本实验中将时序序列将高维度数据下降到长度为300的PAA策略。

3. DBSCAN聚类算法

DBSCAN(Density-BasedSpatial Clustering of Applications with Noise),一种基于密度的聚类方法,即找到被低密度区域分离的稠密区域,要求聚类空间中的必定区域内所包含对象(点或其余空间对象)的数目不小于某一给定阈值。

  • 其中几个关键术语:

    • 密度:空间中任意一点的密度是以该点为圆心,以Eps为半径的圆区域内包含的点数目
    • 边界点:空间中某一点的密度,若是小于某一点给定的阈值minPts,则称为边界点
    • 噪声点:不属于核心点,也不属于边界点的点,也就是密度为1的点

image.png

上图是通常DBSCAN的聚类过程,其中有两个地方能够进行较好的优化:

  • 两个参数

    • 最近两个聚类中心的距离参数(Eps)
    • 最小聚类中心的实例的个数(MinPts)
  • 查找一个向量在给定参数状况下的近邻集合

3.1 KD Tree构造

KD(K-Dimensional) Tree,是一种分割K维度数据空间的数据结构。主要应用与多维空间关键数据的搜索(如:范围搜索和近邻搜索)。

function kdtree(list of points pointList, int depth) {
    // select axis based on depth so that axis cycles through all valid values
    var int axis := depth % k;
    
    // sort point list and choose median as pivot element
    select median by axis from pointList;
    
    // create node and construct subtree
    node.location := median;
    node.leftChild := kdtree(points in pointList before median, depth + 1);
    node.rightChild := kdtree(points in pointList before median, depth + 1);

    return node;
}

上述算法模型中,最大的问题在于轴点的选择,选择好轴点以后,就能够递归去建立这颗树了。

  • 建树必须遵循的两个准则:

    • 创建的树应当尽可能平衡,树越平衡表明着分割得越平均,搜索的时间也就是越少;
    • 最大化邻域搜索的剪枝操做;
  • 选择轴点的策略

    • 对于全部描述子数据(特征矢量),统计在每一个维度上的数据方差,挑选出方差中最大值,对应的维度就是分割域的值。数据方差大说明沿着该坐标轴方向上数据点分散的比较开。这个方向上,进行数据分割能够得到最好的平衡。数据点集按照当前选择的维度的值排序,位于正中间的那个数据点,就被选为轴点。
    • 实际中会出现问题:理论上空间均匀分布的点,在一个方向上分割,经过计算方差,下一次分割就不会出如今这个方向上,但实际数据每每会不均匀,这样就会出现不少长条的分割,会致使效率下降。
    • 为了不这种状况,候选维度的选择依据是数据范围最大的那一个维度做为分割维度,以后就选择这个维度的中间节点做为轴点,进行分割,分割出来的结果会稍微好一些。
    • 实际中也能够经过限制树的高度的时候。

image.png

  • 邻近搜索策略

    • 给定一个KD Tree和一个节点,求KD Tree中离这个节点最近的节点,能够选定一个距离度量的方式。
    • 搜索的基本思路:首先经过二叉树搜索(比较待查询节点和分裂节点的分裂维度的值,小于等于就进入左侧分支,大于就进入右侧分支),顺着搜索路径很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子节点;而后在回溯搜索路径,并判断搜素路径上的其它近邻节点是否有可能距离查询点更近的数据点,直到搜索路径上的候选节点为空时中止。

3.2 参数自动化估计

image.png

具体的成分以下图所示:

 

 

 

 

 

 

 

 

 

 

 

 

这里咱们假设 

的坐在成分为 左右,所以咱们假设最小的近邻集合中所含有的样本数量为 

  • 具体的参数估计流程以下:

    • 计算任意两个样本之间的距离
    • 计算每一个样本的k-距离值,选择每一个样本最近邻的k个样本,将该全部样本的k距离集合进行升序排序,同时记录每一个候选距离中对应的点对坐标(去重复以后,用来记录该距离有多少个点)
    • 去查找k距离排序以后的若干波动点(见参考文献)
    • 使用KMeans聚类,对于找到的候选信息 
    • 进行聚类,获得相应的聚类中心
    • 而后将该参数送入到DBSCAN中进行聚类,对获得的聚类中心的信息进行断定,获得较好的聚类结果

3.3 DBSCAN具体流程

直观的理解下本节开头关于聚类指标的说明:

  • core point:聚类中心向量
  • Border Point:某个聚类中心的边界样本点
  • MinPts:最少聚类中心的样本点的数量
  •  
  • :聚类中心内的最远边缘样本到聚类中心的距离
  • Noise Point:噪声样本点

image.png

  • DBSCAN算法描述中经常使用的概念

    • 密度可达:样本点p,关于样本点q对于参数 

密度直达,若它知足  且  

  •  
  • 密度可达:样本点p,关于样本点q对于参数 
  • 密度可达,若存在一系列的样本点     (其中   ,    )使得对于 ,样本点   
  • 密度可达
  • 密度相连:样本点p,关于样本点q对于参数 
    • 密度相连,若存在一个样本点o,使得p和q均由样本点o密度可达。

image.png

  • 具体的算法流程
首先,将数据集D中的全部对象标记为为处理状态
for 样本p in 数据集D do
    if p 属于某个簇 或者 被标记为噪声 then
        continue;
     else
         检查p的Eps邻域 Neighbor(Eps, p)
        if |Neighbor(Eps, p)| < MinPts then
            标记对象p为边界点或噪声点
        else
            标记样本p为核心点,并创建新的簇C,并将p邻域的全部点加入C
            for 样本q in Neighbor(Eps, p)中全部未被处理的对象 do
                按照邻域样本数量进行判断
             end for
         end if
     end if
end for

4. 层次聚类算法

image.png

层次聚类是一种很直观的算法,就是一层一层的对数据进行聚类操做,能够自低向上进行合并聚类、也能够自顶向下进行分裂聚类。

  • 凝聚式:从点做为个体簇开始,每个步合并两个最接近的簇
  • 分裂式:从包含全部个体的簇开始,每一步分裂一个簇,直到仅剩下单点簇为止

4.1 凝聚层次聚类算法步骤

  • 计算邻近度量矩阵
  • repeat

    • 合并最接近的两个簇
    • 更新邻近度矩阵,以反映新簇与原来簇之间的邻近度量值
  • Until 仅剩下一个簇或者达到某个终止条件

平台实验结果

自动参数选择的密度聚类算法

  • 调用命令
* | select ts_dencity_cluster(stamp, metric_val, metric_name)
  • 聚类结果
    image.png

image.png
image.png
image.png
image.png

  • 上述输出结果说明

    • 聚类的中心的数量有算法自动生成
    • 输出的结果按照所含有的实例数量降序排列

层次聚类算法

  • 调用命令
* | select ts_hierarchical_cluster(stamp, metric_val, metric_name, 2)
  • 聚类结果
    image.png
  • 调用命令
* | select ts_hierarchical_cluster(stamp, metric_val, metric_name, 8)
  • 聚类结果
    image.png

image.png

  • 上述输出结果说明

    • 聚类的中心的数量的上限用户可自定义
    • 输出的结果按照所含有的实例数量降序排列

查找类似曲线

  • 调用命令
* | select ts_similar_instance(stamp, metric_val, metric_name, 'machine_008_cpu')
  • 返回结果

    • machine_008_cpu
      image.png
    • machine_021_cpu
      image.png
    • machine_023_cpu
      image.png

硬广时间

日志进阶

阿里云日志服务针对日志提供了完整的解决方案,如下相关功能是日志进阶的必备良药:

  1. 机器学习语法与函数:https://help.aliyun.com/document_detail/93024.html
  2. 日志上下文查询:https://help.aliyun.com/document_detail/48148.html
  3. 快速查询:https://help.aliyun.com/document_detail/88985.html
  4. 实时分析:https://help.aliyun.com/document_detail/53608.html
  5. 快速分析:https://help.aliyun.com/document_detail/66275.html
  6. 基于日志设置告警:https://help.aliyun.com/document_detail/48162.html
  7. 配置大盘:https://help.aliyun.com/document_detail/69313.html

更多日志进阶内容能够参考:日志服务学习路径

联系咱们

纠错或者帮助文档以及最佳实践贡献,请联系:悟冥
问题咨询请加钉钉群:11775223

Reference

  1. 微软亚研院的AIOps底层算法: KPI快速聚类
  2. Yading: Fast Clustering of Large-Scale Time Series Data
  3. 漫谈:机器学习中距离和类似性度量方法
  4. 如何理解K-L散度(相对熵)
  5. 最小编辑距离算法
  6. DTW Algorithm
  7. A Piecewise Aggregate Approximation Lower-Bound Estimate for Posteriorgram-based Dynamic Time Warping
  8. 各种降维方法总结
  9. 68–95–99.7 rule
  10. Comment on "Clustering by fast search and find of density peaks"
  11. Clustering by fast search-and-find of density peaks


双十一广告:阿里云双十一1折拼团活动:已满6人,都是最低折扣了
【满6人】1核2G云服务器99.5元一年298.5元三年 2核4G云服务器545元一年 1227元三年
【满6人】1核1G MySQL数据库 119.5元一年
【满6人】3000条国内短信包 60元每6月
参团地址:http://click.aliyun.com/m/1000020293/

做者: fight_ucas
原文连接 本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索