SLS機器學習介紹(02):時序聚類建模

摘要: 在大型互聯網企業中,對海量KPI(關鍵性能指標)進行監控和異常檢測是確保服務質量和可靠性的重要手段。基於互聯網的服務型企業(如線上購物、社交網絡、搜索引擎等)經過監控各類系統及應用的數以萬計的KPI(如CPU利用率、每秒請求量等)來確保服務可靠性。html

文章系列連接

前言

第一篇文章SLS機器學習介紹(01):時序統計建模上週更新完,一會兒炸出了不少潛伏的業內高手,忽的發現集團內部各個業務線都針對時序分析存在必定的需求。你們私信問我業務線上的具體方法,在此針對遇到的通用問題予以陳述(權且拋磚引玉,但願各位大牛提供更好的建議和方法):node

  • 數據的高頻抖動如何處理?算法

    • 在業務需求能知足的條件下,進可能的對數據作聚合操做,用窗口策略消除抖動
    • 若不能粗粒度的聚合,我通常會選擇窗口濾波操做,在針對濾波後的數據進行一次去異常點操做
    • 改變檢測策略,將問題變成一個迴歸問題,引入多維度特徵,對目標進行預測
  • 歷史訓練數據如何選擇?服務器

    • 針對本身的時序數據,須要先進行簡單的摸底操做,選擇合適的模型,是否是有明顯的週期?是否是有明顯的趨勢?
  • 這麼多方法該如何選擇?網絡

    • 針對單指標預測的方法,須要採用多種算法模型進行預測,將獲得的結果也要集成起來,下降誤報操做
    • 能夠針對歷史上的全量報警樣本,設計一套報警聚合規則,在必定容忍度的條件下獲得較好的結果

摘要

在大型互聯網企業中,對海量KPI(關鍵性能指標)進行監控和異常檢測是確保服務質量和可靠性的重要手段。基於互聯網的服務型企業(如線上購物、社交網絡、搜索引擎等)經過監控各類系統及應用的數以萬計的KPI(如CPU利用率、每秒請求量等)來確保服務可靠性。KPI上的異常一般反映了其相關應用上可能出現故障,如服務器故障、網絡負載太高、外部攻擊等。於是,異常檢測技術被普遍用於及時檢測異常事件以達到快速止損的目的。數據結構

問題背景

大多數異常檢測算法(如雅虎的EDAGS,Twitter的BreakoutDetection,FaceBook的prophet)都須要爲每條KPI單獨創建異常檢測模型,在面對海量KPI時,會產生極大的模型選擇、參數調優、模型訓練及異常標註開銷。幸運的是,因爲許多KPI之間存在隱含的關聯性,它們是較爲類似的。若是咱們可以找到這些類似的KPI(例如在一個負載均衡的服務器集羣中每一個服務器上的每秒請求量KPI是類似的),將它們劃分爲若干聚類簇,則能夠在每一個聚類簇中應用相同的異常檢測模型,從而大大下降各項開銷。併發

序列聚類建模

問題定義

在同一個業務指標的前提下:負載均衡

  1. 查找出當前時序序列中有哪些類似的曲線形態?(單條曲線的多形態分解)
  2. 多條KPI指標曲線有哪些曲線的形態相似?(N條曲線形態聚類)

類似性度量

本文主要從時間對齊的多條時序KPI中進行類似性度量,時間點上的指標的類似性和時序曲線形態的類似性機器學習

  1. 時間點聚類(時間上的類似性)
    1.1 閔可夫斯基距離:衡量數值點之間距離的一種常見的方法,假設P=(x1,x2,...,xn)和Q=(y1,y2,...,yn),則具體的公式以下:

當p=1時,表示曼哈頓距離;p=2時,表示歐幾里得距離;當p趨近於無窮大時,該距離轉換爲切比雪夫距離,具體以下式所式:數據結構和算法

閔可夫斯基距離比較直觀,可是它與數據的分佈無關,具備必定的侷限性,若是x方向的幅值遠遠大於y方向的幅值,這個距離公式就會過分方法x維度的做用。所以在加算前,須要對數據進行變換(去均值,除以標準差)。這種方法在假設數據各個維度不相關的狀況下,利用數據分佈的特性計算出不一樣的距離。若是數據維度之間數據相關,這時該類距離就不合適了!

    1.2 馬氏距離:若不一樣維度之間存在相關性和尺度變換等關係,須要使用一種變化規則,將當前空間中的向量變換到另外一個能夠簡單度量的空間中去測量。假設樣本之間的協方差矩陣是Σ,利用矩陣分解(LU分解)能夠轉換爲下三角矩陣和上三角矩陣的乘積:Σ=LLT。消除不一樣維度之間的相關性和尺度變換,須要對樣本x作以下處理:z=L−1(x−μ),通過處理的向量就能夠利用歐式距離進行度量。

    2.形狀之間的類似性(空間上的結構類似性)

      2.1 編輯距離

如何去比較兩個不一樣長度的字符串的類似性?給定兩個字符串,由一個轉成另外一個所須要的最小編輯操做,其中須要有三個操做,相同位置字符的替換、對字符串中某個位置進行插入與刪除。具體的遞歸表達式以下:

    2.2 DTW(Dynamic Time Warpping)距離
    動態時間規整(Dynamic Time Warping;DTW)是一種將時間規整和距離測度相結合的一種非線性規整技術。主要思想是把未知量均勻地伸長或者縮短,直到與參考模式的長度一致,在這一過程當中,未知量的時間軸要不均勻地扭曲或彎折,以使其特徵與參考模式特徵對正。
    DTW(Dynamic Time Warping)距離的計算過程以下:
    假設,兩個時間序列Q和C,Q={q1,q2,…,qn},C={c1,c2,…,cm}。構造一個(n, m)的矩陣,第(i, j)單元記錄兩個點(qi,cj)之間的歐氏距離,d(qi,cj)=|qi−cj|。一條彎折的路徑W,由若干個彼此相連的矩陣單元構成,這條路徑描述了Q和C之間的一種映射。設第k個單元定義爲wk=(i,j)k,則w={w1,w2,w3,...,wK},max(n,m)<=K<=n+m−1。

這條彎折的路徑知足以下的條件:

在知足上述條件的多條路徑中,最短的,花費最少的一條路徑是:

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

    • 若時序數據含有缺失值,須要將將序列進行補點操做(若是序列缺失小於10%,則模型內部會將缺失數據自動按照鄰近值補齊)
    • 該數據是按照15秒一個點進行採樣的,若是須要進行更粗粒度的操做,須要額外處理

2. 時序數據的降維採樣

集羣中有相同屬性的機器大約爲5K臺,那麼咱們就會有通過處理的5K條NET:Tcp的曲線,如今須要對該集合進行聚類,找到其中類似形態的曲線,並發現形態不一致的曲線形態。

  • 分段線性表示方法
    分段線性表示是一種使用線性模型來對時間序列進行分割的方法,根據不一樣的分割方法可使用不一樣的分割策略來實現,如滑動窗口、自底向上和自頂向下。利用滑動窗口和自底向上方法的時間複雜度爲序列長度的平方階, 而自頂向下的時間複雜度爲線性階。滑動窗口在一些狀況下對時間序列的擬合效果較差,不能很好地反映原時間序列的變化信息。
  • 分段聚合近似(Piecewise Aggregation Approximation,PAA)表示方法
    經過對時間序列進行平均分割並利用分段序列的均值來表示原時間序列的方法。
  • 符號化表示方法
    符號化表示方法是一種將時間序列轉換爲字符串序列的過程。在時間序列數據挖掘過程當中,傳統方法主要依賴於定量數據,遠遠不能知足數據挖掘領域中分析和解決問題的要求。在數據結構和算法設計中,字符串具備特定的數據存儲結構以及較爲成熟且高效的操做算法。

本實驗中將時序序列將高維度數據下降到長度爲300的PAA策略。

3. DBSCAN聚類算法

DBSCAN(Density-BasedSpatial Clustering of Applications with Noise),一種基於密度的聚類方法,即找到被低密度區域分離的稠密區域,要求聚類空間中的必定區域內所包含對象(點或其餘空間對象)的數目不小於某一給定閾值。

  • 其中幾個關鍵術語:

    • 密度:空間中任意一點的密度是以該點爲圓心,以Eps爲半徑的圓區域內包含的點數目
    • 邊界點:空間中某一點的密度,若是小於某一點給定的閾值minPts,則稱爲邊界點
    • 噪聲點:不屬於核心點,也不屬於邊界點的點,也就是密度爲1的點

上圖是通常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;
}

上述算法模型中,最大的問題在於軸點的選擇,選擇好軸點以後,就能夠遞歸去建立這顆樹了。

  • 建樹必須遵循的兩個準則:

    • 創建的樹應當儘可能平衡,樹越平衡表明着分割得越平均,搜索的時間也就是越少;
    • 最大化鄰域搜索的剪枝操做;
  • 選擇軸點的策略

    • 對於全部描述子數據(特徵矢量),統計在每一個維度上的數據方差,挑選出方差中最大值,對應的維度就是分割域的值。數據方差大說明沿着該座標軸方向上數據點分散的比較開。這個方向上,進行數據分割能夠得到最好的平衡。數據點集按照當前選擇的維度的值排序,位於正中間的那個數據點,就被選爲軸點。
    • 實際中會出現問題:理論上空間均勻分佈的點,在一個方向上分割,經過計算方差,下一次分割就不會出如今這個方向上,但實際數據每每會不均勻,這樣就會出現不少長條的分割,會致使效率下降。
    • 爲了不這種狀況,候選維度的選擇依據是數據範圍最大的那一個維度做爲分割維度,以後就選擇這個維度的中間節點做爲軸點,進行分割,分割出來的結果會稍微好一些。
    • 實際中也能夠經過限制樹的高度的時候。

  • 鄰近搜索策略

    • 給定一個KD Tree和一個節點,求KD Tree中離這個節點最近的節點,能夠選定一個距離度量的方式。
    • 搜索的基本思路:首先經過二叉樹搜索(比較待查詢節點和分裂節點的分裂維度的值,小於等於就進入左側分支,大於就進入右側分支),順着搜索路徑很快能找到最近鄰的近似點,也就是與待查詢點處於同一個子空間的葉子節點;而後在回溯搜索路徑,並判斷搜素路徑上的其它近鄰節點是否有可能距離查詢點更近的數據點,直到搜索路徑上的候選節點爲空時中止。

3.2 參數自動化估計

具體的成分以下圖所示:

具體的參數估計流程以下:

計算任意兩個樣本之間的距離
計算每一個樣本的k-距離值,選擇每一個樣本最近鄰的k個樣本,將該全部樣本的k距離集合進行升序排序,同時記錄每一個候選距離中對應的點對座標(去重複以後,用來記錄該距離有多少個點)
去查找k距離排序以後的若干波動點(見參考文獻)
使用KMeans聚類,對於找到的候選信息(eps,minPts)進行聚類,獲得相應的聚類中心
而後將該參數送入到DBSCAN中進行聚類,對獲得的聚類中心的信息進行斷定,獲得較好的聚類結果
3.3 DBSCAN具體流程

直觀的理解下本節開頭關於聚類指標的說明:

core point:聚類中心向量
Border Point:某個聚類中心的邊界樣本點
MinPts:最少聚類中心的樣本點的數量
ϵ:聚類中心內的最遠邊緣樣本到聚類中心的距離
Noise Point:噪聲樣本點

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

密度可達:樣本點p,關於樣本點q對於參數Eps,MinPts密度直達,若它知足p∈Neighbor(q,Eps) 且 |Neighbor(q,Eps)|>=MinPts
密度可達:樣本點p,關於樣本點q對於參數Eps,MinPts密度可達,若存在一系列的樣本點p1,...,pn(其中p1=q, pn=p)使得對於i=1,2...,n−1,樣本點pi密度可達
密度相連:樣本點p,關於樣本點q對於參數Eps,MinPts密度相連,若存在一個樣本點o,使得p和q均由樣本點o密度可達。

具體的算法流程

4. 層次聚類算法

image.png

層次聚類是一種很直觀的算法,就是一層一層的對數據進行聚類操做,能夠自低向上進行合併聚類、也能夠自頂向下進行分裂聚類。

  • 凝聚式:從點做爲個體簇開始,每個步合併兩個最接近的簇
  • 分裂式:從包含全部個體的簇開始,每一步分裂一個簇,直到僅剩下單點簇爲止

4.1 凝聚層次聚類算法步驟

  • 計算鄰近度量矩陣
  • repeat

    • 合併最接近的兩個簇
    • 更新鄰近度矩陣,以反映新簇與原來簇之間的鄰近度量值
  • Until 僅剩下一個簇或者達到某個終止條件

平臺實驗結果

自動參數選擇的密度聚類算法

  • 調用命令
* | select ts_dencity_cluster(stamp, metric_val, metric_name)
  • 聚類結果


  • 上述輸出結果說明

    • 聚類的中心的數量有算法自動生成
    • 輸出的結果按照所含有的實例數量降序排列

層次聚類算法

  • 調用命令
* | select ts_hierarchical_cluster(stamp, metric_val, metric_name, 2)
  • 聚類結果

  • 調用命令
* | select ts_hierarchical_cluster(stamp, metric_val, metric_name, 8)
  • 聚類結果

  • 上述輸出結果說明

    • 聚類的中心的數量的上限用戶可自定義
    • 輸出的結果按照所含有的實例數量降序排列

查找類似曲線

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

    • machine_008_cpu
    • machine_021_cpu
    • machine_023_cpu

硬廣時間

日誌進階

阿里雲日誌服務針對日誌提供了完整的解決方案,如下相關功能是日誌進階的必備良藥:

  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

原文連接

相關文章
相關標籤/搜索