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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

初识DTW(动态时间规整)算法及Python实现例

發布時間:2023/12/8 python 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识DTW(动态时间规整)算法及Python实现例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄?

1. 概要

2. 時序列相似度度量

3. DTW基本算法

4. Python實現

5. Next Action


1. 概要

???????DTW( Dynamic Time Warping,動態時間規整)是基于動態規劃(Dynamic Programming)策略對兩個時序列通過非線性地進行時域對準(Timing alignment)調整以便于正確地計算兩者之間相似度(similarity)的一種算法。

????????本文簡單介紹DTW算法所針對的問題背景、DTW基本算法流程,并給出簡單的Python實現例。

????????本文如標題“初識。。?!彼?#xff0c;面向像作者這樣初次接觸DTW的渣渣^-^。不過本文并不準備動態規劃策略進行描述,所以本文要求讀者對動態規劃有基本的了解。

2. 時序列相似度度量

????????考慮如下所示的幾個時序列波形之間的“相似度”的比較。時序列波形之間的相似度的衡量的一種方法就是把時序列波形看作是一個向量,然后計算兩個向量之間的歐幾里得距離。除了歐幾里得距離以外,其它的相似度度量還有比如說余弦相似度(cosine similarity)。

# -*- coding: utf-8 -*- """ Created on Sat Oct 30 10:50:53 2021@author: chenxy """import numpy as np import matplotlib.pyplot as pltdef euclid_dist(t1,t2):return np.sqrt(np.sum((t1-t2)**2))t = np.arange(100) ts1 = 5*np.sin(2*np.pi*t*0.05) # 0.05Hz sin wave, 1Hz sampling rate, amplitude=5 ts2 = 3*np.sin(2*np.pi*t*0.02) # 0.02Hz sin wave, 1Hz sampling rate, amplitude=3 ts3 = 0.08*t-4fig,axs = plt.subplots(figsize=(12,8)) axs.plot(ts1) axs.plot(ts2) axs.plot(ts3) axs.legend(['ts1: sin,0.05Hz, amplitude=5',\'ts2: sin,0.02Hz, amplitude=3',\'ts3: line with slope = 0.08'])euclidean_dist_12 = euclid_dist(ts1,ts2) euclidean_dist_13 = euclid_dist(ts1,ts3) euclidean_dist_23 = euclid_dist(ts2,ts3) print('euclidean_dist_12 = {0:6.2f}'.format(euclidean_dist_12)) print('euclidean_dist_13 = {0:6.2f}'.format(euclidean_dist_13)) print('euclidean_dist_23 = {0:6.2f}'.format(euclidean_dist_23))

運行后得到:

?

?圖1

????????如果直接采用歐幾里得距離作為相似性度量的話,如以上結果可得,ts2和ts3之間的距離最小,或者說相似度最高。但是,從人類的直覺來看的話,由于ts1和ts2都是正弦波,只不過頻率和幅度不同而已,而ts3是一根直線,顯然應該是ts1和ts2更相似才合理。

????????進一步,考慮一個與ts1頻率、幅度都相等,但是相位差180度的正弦波。

ts4 = 5*np.sin(2*np.pi*t*0.05+np.pi) # 0.05Hz sin wave, 1Hz sampling rate, amplitude=5 fig,axs = plt.subplots(figsize=(12,8)) axs.plot(ts1) axs.plot(ts4) axs.plot(ts3) axs.legend(['ts1: sin,0.05Hz, amplitude=5',\'ts4: sin,0.05Hz, amplitude=5, phase offset=pi',\'ts3: line with slope = 0.08'])euclidean_dist_14 = euclid_dist(ts1,ts4) euclidean_dist_34 = euclid_dist(ts3,ts4) print('euclidean_dist_14 = {0:6.2f}'.format(euclidean_dist_14)) print('euclidean_dist_34 = {0:6.2f}'.format(euclidean_dist_34))

????????運行后得到:?

圖2?

????????這一次結果更加明顯地反直覺。Ts1與ts4僅僅只是反相而已,而它們之間的”距離”居然會遠遠大于ts3與ts4之間的距離!?

????????造成以上反直覺的結果的原因在于:Ts1,ts2,ts4之間雖然基本波形其實是相似的,但是在時域存在沒有對準(或者說不同步)的問題。Ts1和ts4之間相位相反也可以看作是時域未對準,因為可以把ts4看作是ts1延遲半個周期的波形。而ts2與ts1之間則不僅僅是相位偏差導致的時域未對準,還有因為他們的周期不同而導致相位的偏差是隨時間變化的。

????????以上的情況還只是最簡單的情況。因為ts1和ts2和ts4同是正弦波,差異在于相位和頻率,但是相位和頻率差異是固定的。因此,通過對其中一個信號進行相位調整的掃描以及對時域波形擴張(對應于改變頻率)的掃描,然后再進行信號處理中的相關運算是可以正確地識別出它們之間的相似度來的。

????????在真實世界中,兩個原本相似度很高的時序列之間可能時域上相對變形(distortion)程度不但是時變的,而且還是非線性變化的。將一段語音變速播放就會產生這種類似的效果。這種情況下要想正確識別出它們之間的相似度,就需要先對兩者之間局部時域波形的相對變形進行糾正以后再計算歐幾里得距離。“對兩者之間局部時域波形的相對變形糾正”稱為Time-Warping(時域規整)處理。經過Time-Warping(時域規整)處理后,兩個序列中樣點間不再保持一一對應關系,而是可能出現一些一對多或者多對一的關系,相當于局部范圍內時域波形出現了相對壓縮或者拉伸后再進行對應,如下圖所示:

圖3?

3. DTW基本算法

????????DTW算法就是基于動態規劃策略對兩個時序列進行動態的時域規整處理后以搜索估計它們之間最小可能的距離(最大可能的相似度)。廣泛地用于時序列分類和聚類等應用中。

????????DTW算法基本工作原理如下所述:

????????考慮兩個時序列和,長度分別為n和m(直接計算兩個序列之間的歐氏距離要求兩者長度相等。但是,基于DTW算法來估計相似度并不要求長度相等)。

????????首先,構建一個n*m的矩陣D,其中D[i,j]表示Qi與Pj之間的歐氏距離(注意,為了描述方便,下標是從1開始計數(記為1-indexed)。但是在python或C代碼實現中則是從0開始計數,稱為0-indexed)。DTW的目標就是要找到一條從[1,1]到[n,m]的路徑使得該條路徑的累積歐氏距離最小。

如前所述,在Time Warping處理中,一個時序列上的一個點可以對應另一個時序列的一個或者多個點。對應地,在以上矩陣D中的路徑(從左上角的[1,1]出發的)構造過程中,可以從一個格點到達其右邊、下邊以及右下的格點。理論上,也可以走向其它5個方向的格點,但是這樣肯定會導致非最小化的距離,因此可以不用考慮。

考慮表示一條從[1,1]到[n,m]的路徑,其中Wk表示路徑經過的某格點所保存的Q和C之間某兩點之間的歐氏距離的平方 (注意,這里用平方而不是絕對值,是因為兩個時序列之間的距離是要先進行平方和運算再開方的)。如下圖所示就是一條可能的路徑。

圖4?

????????這樣,以上最小累計距離搜索的優化問題可以表述為求解

?????????如上圖所示,將從[1,1]到達[i,j]的累計距離記為 。

????????很顯然,經歷最短累計距離到達[i,j]的前一個點必然是[i-1,j-1], [i,j-1], [i-1,j]三者之一。在已經計算出[i-1,j-1], [i,j-1], [i-1,j]各自所對應的最短累計距離的前提下,可以得到關于 的遞推關系式如下:?

?

????????基于這個遞推關系式,可以從[1,1]開始逐行(或逐列也可以)計算并填充關于的表格,填充完整個表格后即可以得到兩個序列之間的最短距離 ,這個距離通常也稱為DTW距離。

?????????

????????進一步,記錄以上關于的創建過程中的路徑選擇歷史的話,可以從[n,m]回溯得到最優路徑所經歷的所有格點。也就可以據此得到如以上圖3那樣的Time Warping映射圖。

4. Python實現

?????????DTW算法實現如以下函數DTWDistance()所示?;谶@一函數我們來重新評估以上4個序列之間的DTW距離。

""" DTWDistance(s1, s2) is copied from: http://alexminnaar.com/2014/04/16/Time-Series-Classification-and-Clustering-with-Python.html """def DTWDistance(s1, s2):DTW={}for i in range(len(s1)):DTW[(i, -1)] = float('inf')for i in range(len(s2)):DTW[(-1, i)] = float('inf')DTW[(-1, -1)] = 0for i in range(len(s1)):for j in range(len(s2)):dist= (s1[i]-s2[j])**2DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])return np.sqrt(DTW[len(s1)-1, len(s2)-1])dtw_dist_12 = DTWDistance(ts1,ts2) dtw_dist_13 = DTWDistance(ts1,ts3) dtw_dist_14 = DTWDistance(ts1,ts4) dtw_dist_23 = DTWDistance(ts2,ts3) dtw_dist_24 = DTWDistance(ts2,ts4) dtw_dist_34 = DTWDistance(ts3,ts4) print('dtw_dist_12 = {0:6.2f}'.format(dtw_dist_12)) print('dtw_dist_14 = {0:6.2f}'.format(dtw_dist_14)) print('dtw_dist_24 = {0:6.2f}'.format(dtw_dist_24)) print('dtw_dist_23 = {0:6.2f}'.format(dtw_dist_23)) print('dtw_dist_13 = {0:6.2f}'.format(dtw_dist_13)) print('dtw_dist_34 = {0:6.2f}'.format(dtw_dist_34))

?運行結果如下:?

由此可以看出ts3(直線)與其它三者之間的DTW距離都比其它三者之間的相互的DTW距離要大,也就是說ts1,2,4相互之間的相似度是要大于ts3與ts1,2,4之間的相似度的。

5. Next Action

  • DTW算法的運算復雜度優化
  • 以上提到過的\gamma表格建立中的路徑選擇歷史的記錄以及最優路徑回復,以及Time Warping可視化
  • 基于DTW與KNN結合的時序列分類(classification)和聚類(clustering)的應用示例
  • Reference:

    [1]http://alexminnaar.com/2014/04/16/Time-Series-Classification-and-Clustering-with-Python.html

    總結

    以上是生活随笔為你收集整理的初识DTW(动态时间规整)算法及Python实现例的全部內容,希望文章能夠幫你解決所遇到的問題。

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