日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DTW算法详解

發布時間:2023/12/9 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DTW算法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DTW算法詳解

1.DTW

1.1 時序相似度

在時間序列數據中,一個常見的任務是比較兩個序列的相似度,作為分類或聚類任務的基礎。那么,時間序列的相似度應該如何計算呢?

“ 經典的時間序列相似性度量方法總體被分為兩 類: 鎖步度量(lock-step measures) 和彈性度量(elastic measures) . 鎖步度量是時間序列進行 “一對一”的比 較; 彈性度量允許時間序列進行 “一對多”的比較.
——《時間序列數據挖掘的相似性度量綜述》

最簡單的相似度計算方法可能是計算兩個時間序列的歐氏距離。歐氏距離屬于鎖步度量

假設有兩個時間序列,Q和C,如果直接用歐氏距離計算相似度的話,如果存在時間步不對齊,序列長短不一等問題…

如上圖1所示,如果序列長短不一,或時間步不對齊的時候,歐氏距離是無法有效計算兩個時間序列的距離,特別是在峰值的時候。

圖2則是DTW算法,首先將其中一個序列進行線性放縮進行某種“扭曲”操作,以達到更好的對齊效果,可以存在一對多mapping的情況,適用于復雜時間序列,屬于彈性度量

1.2 DTW算法

動態時間規整在60年代由日本學者Itakura提出,用于衡量兩個長度不同的時間序列的相似度。把未知量伸長或縮短(壓擴),直到與參考模板的長度一致,在這一過程中,未知序列會產生扭曲或彎折,以便其特征量與標準模式對應

首先假設有兩條序列 QQQCCC,他們的長度分別是 nnnmmm
Q=q1,q2,...,qnQ=q_1,q_2,...,q_nQ=q1?,q2?,...,qn?
C=q1,q2,...,qnC=q_1,q_2,...,q_nC=q1?,q2?,...,qn?

用一個 m×nm\times nm×n 矩陣來對比兩個序列,warping路徑會穿越這個矩陣,warping路徑的第 kkk 個元素表示為wk=(i,j)kw_k=(i,j)_kwk?=(i,j)k? ,橫縱代表的是兩個序列對齊的點

約束條件

1)邊界條件:w1=(1,1)w_1=(1,1)w1?=(1,1)wk=(m,n)w_k=(m,n)wk?=(m,n),表示兩條序列首尾必須匹配,各部分的先后次序匹配。

2)連續性: 如果wk=(a,b)w_k=(a,b)wk?=(a,b)wk?1=(a′,b′)w_k-1=(a',b')wk??1=(a,b),則必須滿足 a?a′≤1a-a' \leq 1a?a1
b?b′≤1b-b' \leq 1b?b1這條約束表示在匹配過程中多對一和一對多的情況只能匹配周圍一個時間步的的情況,也就是不可能跨過某個點去匹配,只能和自己相鄰的點對齊。這樣可以保證QQQCCC中的每個坐標都在wraping路徑中出現。

3)單調性: 如果 wk?1=(a′,b′)w_k-1=(a',b')wk??1=(a,b),且wk=(a,b)w_k=(a,b)wk?=(a,b),則必須滿足a?a′≥0a-a' \geq 0a?a0
b?b′≥0b-b' \geq 0b?b0,表示warping路徑一定是隨時間單調遞增的。

滿足以上約束條件的warping路徑有很多,所以問題的本質是最優化問題——找出最優warping路徑。

解法思路是通過動態規劃算法,數學語言描述為:

【舉例】
DTW最初用于識別語音的相似性。我們用數字表示音調高低,例如某個單詞發音的音調為1-3-2-4。現在有兩個人說這個單詞,一個人在前半部分拖長,其發音為1-1-3-3-2-4;另一個人在后半部分拖長,其發音為1-3-2-2-4-4。

現在要計算1-1-3-3-2-4和1-3-2-2-4-4兩個序列的距離(距離越小,相似度越高)。因為兩個序列代表同一個單詞,我們希望算出的距離越小越好,這樣把兩個序列識別為同一單詞的概率就越大。

先用傳統方法計算兩個序列的歐幾里得距離,即計算兩個序列各個對應的點之間的距離之和。

距離之和
= |A(1)-B(1)| + |A(2)-B(2)| + |A(3)-B(3)| + |A(4)-B(4)| + |A(5)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-3| + |3-2| + |3-2| + |2-4| + |4-4|
= 6


如果我們允許序列的點與另一序列的多個連續的點相對應(相當于把這個點所代表的音調的發音時間延長),然后再計算對應點之間的距離之和。如下圖:B(1)與A(1)、A(2)相對應,B(2)與A(3)、A(4)相對應,A(5)與B(3)、B(4)相對應,A(6)與B(5)、B(6)相對應。


這樣的話,

距離之和
= |A(1)-B(1)| + |A(2)-B(1)| + |A(3)-B(2)| + |A(4)-B(2)| + |A(5)-B(3)| + |A(5)-B(4)| + |A(6)-B(5)| + |A(6)-B(6)|
= |1-1| + |1-1| + |3-3| + |3-3| + |2-2| + |2-2| + |4-4| + |4-4|
= 0

我們把這種“可以把序列某個時刻的點跟另一時刻多個連續時刻的點相對應”的做法稱為時間規整(Time Warping)。

現在我們用一個6*6矩陣M表示序列A(1-1-3-3-2-4)和序列B(1-3-2-2-4-4)各個點之間的距離,M(i,j)M(i, j)M(i,j) 等于A的第i個點和B的第j個點之間的距離,即


我們看到傳統歐幾里得距離里對應的點:

  • A(1)-B(1)
  • A(2)-B(2)
  • A(3)-B(3)
  • A(4)-B(4)
  • A(5)-B(5)
  • A(6)-B(6)

它們正好構成了對角線,對角線上元素和為6。

時間規整的方法里,對應的點為:

  • A(1)A(2)-B(1)
  • A(3)A(4)-B(2)
  • A(5)-B(3)B(4)
  • A(6)-B(5)B(6)

這些點構成了從左上角到右下角的另一條路徑,路徑上的元素和為0。

因此,DTW算法的步驟為:

  • 計算兩個序列各個點之間的距離矩陣。
  • 尋找一條從矩陣左上角到右下角的路徑,使得路徑上的元素和最小。
  • 我們稱路徑上的元素和為路徑長度。那么如何尋找長度最小的路徑呢?

    矩陣從左上角到右下角的路徑長度有以下性質:

  • 當前路徑長度 = 前一步的路徑長度 + 當前元素的大小
  • 路徑上的某個元素(i, j),它的前一個元素只可能為以下三者之一:
  • a) 左邊的相鄰元素 (i, j-1)
    b) 上面的相鄰元素 (i-1, j)
    c) 左上方的相鄰元素 (i-1, j-1)

    假設矩陣為M,從矩陣左上角(1,1)到任一點(i, j)的最短路徑長度為Lmin(i, j)。那么可以用遞歸算法求最短路徑長度:

    起始條件:

    遞推規則:

    遞推規則這樣寫的原因是因為當前元素的最短路徑必然是從前一個元素的最短路徑的長度加上當前元素的值。前一個元素有三個可能,我們取三個可能之中路徑最短的那個即可。

    參考文獻
    https://www.bilibili.com/video/BV12r4y1A7mT?share_source=copy_web
    https://zhuanlan.zhihu.com/p/43247215
    https://it.wikipedia.org/wiki/Dynamic_time_warping



    fastdtw 包計算

    https://pypi.org/project/fastdtw/

    from fastdtw import fastdtw from scipy.spatial.distance import euclideanx = np.array([1, 2, 3, 3, 7]) y = np.array([1, 2, 2, 2, 2, 2, 2, 4])distance, path = fastdtw(x, y, dist=euclidean)print(distance) print(path)# 5.0 # [(0, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

    總結

    以上是生活随笔為你收集整理的DTW算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。