SBD算法詳解與相關python代碼

本文爲原創,轉載請註明出處,謝謝!算法

 

當涉及到延時狀況,如kpi數據,在判斷兩兩特徵相關性的時候就不得不考慮SBD算法了。app

經過SBD算法,咱們能夠在不清楚延遲的狀況下找到兩組數據的相關性,如下來進行詳細講解。函數

 

SBD算法

       對於時間序列X(x1,x2,x3,…,xn)及時間序列Y(y1,y2,y3,…,yn),兩序列間的存在時延爲s的關係,計算兩條曲線類似度的SBD距離算法以下:spa

                  

                  NCC(X,Y)=code

                  SBD(X,Y)=1-NCC(X,Y)blog

 

      其中,NCC爲序列X,Y的標準化互相關係數,NCC的取值範圍在-1到1之間,與皮爾森相關係數相似。 因此最終計算的SBD算法結果在0到2之間,越靠近0時,兩組數據相關性越強。當SBD爲0時,說明序列X,Y波動曲線一致,爲同一序列。class

 

      因爲SBD算法計算的是距離,所以在計算距離前咱們須要進行Z-score歸一化處理。im

      細心的朋友能夠發現,當延遲爲0時,歸一化後該算法中的ncc值至關於在計算皮爾森相關係數。數據

      SBD算法的缺點就是計算量大,在相似KPI場景數據量龐大的時候,SBD算法可能沒法獲得支撐。margin

      因此,我認爲條件容許的狀況下,咱們能夠儘量地肯定好延遲s的數值而後再進行帶入計算。

     

 

   好了,廢話很少說,這裏爲你們分享下我寫的算法函數:

#SBD距離算法
def calcSBDncc(x,y,s):
    assert len(x)==len(y)
    assert isinstance(s,int)
    length_ = len(x)
    pow_x = 0
    pow_y = 0
    for i in range(length_):
        pow_x += math.pow(x[i],2)
        pow_y += math.pow(y[i],2)
    dist_x =math.pow(pow_x,0.5)
    dist_y =math.pow(pow_y,0.5)
    dist_xy = dist_x*dist_y
    ccs = 0
    for j in range(length_-s):
         ccs +=  x[j+s]*y[j]
    ncc = ccs/dist_xy
    return ncc
def calcSBD(x,y,s=None):
    assert len(x)==len(y)
    if  s==None:
        length_ = len(x)
        ncc_list = []
        for s in range(length_-1):
            ncc_list.append(calcSBDncc(x,y,s))
        ncc = max(ncc_list)
        sbd = 1 - ncc
    else:
        ncc = calcSBDncc(x,y,s)
        sbd = 1 - ncc
    return sbd

 

 

第一次寫原創,請多指教。若是有不明白的地方,歡迎有興趣的朋友留言交流!

相關文章
相關標籤/搜索