DTW的具體實現

DTW在很多領域都有其具體應用,主要用於模板匹配,如孤立詞語音識別,計算機視覺中行爲識別,信息檢索等。最近在做語音這塊的研究,於是深入分析了下DTW的具體實現過程,其實DTW的實現過程就是一個利用動態規劃思想尋找最有路徑。相關理論知識本來打算自己寫一篇,網上查了下不得不佩服大神的傑作,所以這裏自己就不再詳述理論了,因爲大神的佳作還是比較難超越。理論知識可以參考:(1)https://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html,(2)https://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html。本博文主要結合上面兩篇博客結合代碼進一步分析DTW的具體實現。具體代碼如下:

from numpy import array, zeros, argmin, inf, equal, ndim
# from scipy.spatial.distance import cdist
from sklearn.metrics.pairwise import manhattan_distances
#在這裏我用到的是曼哈頓距離(求絕對值距離)
#如果比較的是二維數組,則用歐幾里得距離

s1 = [1, 2, 3, 4, 5, 5, 5, 4]
s2 = [3, 4, 5, 5, 5, 4]

r, c = len(s1), len(s2)
D0 = zeros((r+1,c+1))
D0[0,1:] = inf
D0[1:,0] = inf
D1 = D0[1:,1:]
#淺複製
# print D1

#生成原始距離矩陣
for i in range(r):
    for j in range(c):
        D1[i,j] = manhattan_distances(s1[i],s2[j])

'''
在這裏,D0可以手動計算出來
D0 = [[ 0. inf inf inf inf inf inf]
 [inf  2.  3.  4.  4.  4.  3.]
 [inf  1.  2.  3.  3.  3.  2.]
 [inf  0.  1.  2.  2.  2.  1.]
 [inf  1.  0.  1.  1.  1.  0.]
 [inf  2.  1.  0.  0.  0.  1.]
 [inf  2.  1.  0.  0.  0.  1.]
 [inf  2.  1.  0.  0.  0.  1.]
 [inf  1.  0.  1.  1.  1.  0.]]
'''

M = D1.copy()
#代碼核心,動態計算最短距離
for i in range(r):
    for j in range(c):
        D1[i,j] += min(D0[i,j],D0[i,j+1],D0[i+1,j])


'''
在這裏,D1是可以手動計算出來的
D1 = [[ 2.  5.  9. 13. 17. 20.]
 [ 3.  4.  7. 10. 13. 15.]
 [ 3.  4.  6.  8. 10. 11.]
 [ 4.  3.  4.  5.  6.  6.]
 [ 6.  4.  3.  3.  3.  4.]
 [ 8.  5.  3.  3.  3.  4.]
 [10.  6.  3.  3.  3.  4.]
 [11.  6.  4.  4.  4.  3.]]
'''



i,j = array(D0.shape) - 2

p,q = [i],[j]
#回溯尋找最短路徑
while(i>0 or j>0):
    tb = argmin((D0[i,j],D0[i,j+1],D0[i+1,j])) #最小值的索引

    if tb==0 :
        i-=1
        j-=1
    elif tb==1 :
        i-=1
    else:
        j-=1
    p.insert(0,i)
    q.insert(0,j)

print ('M = ',M)
#原始距離矩陣
print ('pq = ',zip(p,q))
#匹配路徑過程
print ('D1 = ',D1)
#Cost Matrix或者叫累積距離矩陣
print (D1[-1,-1])
#序列距離

看懂了理論,實現過程也比較簡單,實在不懂可以調試下該代碼,希望可以給大家提供幫助,若有不當之處請指教,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章