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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【语音信号处理四】DTW算法

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

【參考資料】
【1】《基于DTW距離的時序相似性方法提取水稻遙感信息》
【2】《動態時間規整—DTW算法》 https://blog.csdn.net/qq_39516859/article/details/81705010
【3】《DTW算法Python實現》 https://www.cnblogs.com/ningjing213/p/10502519.html
【4】《動態規劃講解+例子》https://wenku.baidu.com/view/29ffed3e974bcf84b9d528ea81c758f5f61f2989.html#

1. 算法描述

DTW主要用戶評價不同長度的時序序列相似度。

1.1 假設存在

長度為n的序列 S={s1,s2,…sn}S = \{s_1, s_2, \dots s_n \}S={s1?,s2?,sn?}
長度為m的序列 T={t1,t2,…tm}T = \{t_1, t_2, \dots t_m \}T={t1?,t2?,tm?}
其中 n≠mn \ne mn?=m

1.2 構造距離矩陣

An×mA_{n \times m}An×m?,矩陣A的每個元素aij=d(si,tj)a_{ij} = d(s_i, t_j)aij?=d(si?,tj?)代表兩個序列對應點的距離。這個距離計算的方法通常就是歐式距離。

構造這個矩陣的目的實際上是未來尋求兩個不長度曲線的最佳匹配。如下圖所示:

如果時間長度序列一樣這一次匹配各點歐式距離即可得到相似度。但如果時序長度不同

這需要存在一種匹配關系,比如在上圖的例子中紅色序列的第一個點同時匹配綠色序列的二三兩個點。

備注:這張圖由于繪制的時候由于時間間隔畫比較大所以不那么直觀。

那么這種匹配關系的查找在算法中可以體現為在矩陣A中尋找一條路徑從a11a_11a1?1移動到anma_nman?m,然后根據這個匹配原則計算距離,使得距離和最小【最佳匹配】。

下圖中的紅、黑、藍軌跡實際就代表三種匹配規則。

1.3 算法邏輯

DTW算法的本質是用動態規劃的思路去搜索這個最佳匹配。從這個角度講應該用什么算法是無所謂的,只要能搜索到這個最佳匹配 😃

動態規劃算法備注:

動態規劃是每一輪都基于上一輪的最優解,dijkstra的最短路徑算法應該是最經典的,需要注意的是,如上圖所示。

在計算B輪的時候,并不因為{C1,D1,E}\{C_1,D_1,E\}{C1?,D1?,E}是最有解,就只搜索{B1,C1}\{B_1,C_1\}{B1?,C1?}{B2,C1}\{B_2,C_1\}{B2?,C1?}{B3,C1}\{B_3,C_1\}{B3?,C1?} 而是搜索全部從B到C的9條可選路徑,只是對于上一輪,如果從C1C_1C1?出發這取上一輪C1C_1C1?的最優解,同理C2C_2C2?C3C_3C3?

DTW算法備注:

2. python代碼實現
s = [1,2,3,4,5] t = [1,1,2,3,4,5]#構筑矩陣 # [[0, 1, 4, 9, 16], [0, 1, 4, 9, 16], [1, 0, 1, 4, 9], # [4, 1, 0, 1, 4], [9, 4, 1, 0, 1], [16, 9, 4, 1, 0]]def _get_min_in_three(x,y,z):min = x if x < y else ymin = min if min < z else zreturn mindef _do_dtw(s, t):#1. 構筑距離矩陣AA = [[0 for i in range(len(s))] for j in range(len(t))]for i in range(len(s)):for j in range(len(t)):A[j][i] = abs(s[i] - t[j])#2. 采用動態規劃所搜最短路徑#移動的路徑是從矩陣的左上角移動到右下角D = [[0 for i in range(len(s))] for j in range(len(t))]for i in range(len(s)):for j in range(len(t)):if 0 == i and 0 == j:D[j][i] = 0elif j == 0: # 貼列D[j][i] = A[j][i] + D[j][i - 1]elif i == 0: #貼行D[j][i] = A[j][i] + D[j - 1][i]else:# D[j-1,i-1] D[j-1, i]# D[j,i-1] D[j, i ]# 這里 D[j, i ] 為 D[j-1][i-1] D[j-1[i] D[j[i-1] 中最小值 + A[j][i]D[j][i] = _get_min_in_three(D[j-1][i-1],D[j-1][i],D[j][i-1]) + A[j][i]return A, DA, D = _do_dtw(s, t)

總結

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

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