本文爲原創,轉載請註明出處,謝謝!算法
當涉及到延時狀況,如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
第一次寫原創,請多指教。若是有不明白的地方,歡迎有興趣的朋友留言交流!