從乙個例項中學習DTW演算法

2021-07-13 03:43:22 字數 2942 閱讀 1658



dtw為(dynamic time warping,動態時間歸準)的簡稱。應用很廣,主要是在模板匹配中,比如說用在孤立詞語音識別,計算機視覺中的行為識別,資訊檢索等中。可能大家學過這些類似的課程都看到過這個演算法,公式也有幾個,但是很抽象,當時看懂了但不久就會忘記,因為沒有具體的例項來加深印象。

這次主要是用語音識別課程老師上課的乙個題目來理解dtw演算法。

首先還是介紹下dtw的思想:假設現在有乙個標準的參考模板r,是乙個m維的向量,即r=,每個分量可以是乙個數或者是乙個更小的向量。現在有乙個才測試的模板t,是乙個n維向量,即t=同樣每個分量可以是乙個數或者是乙個更小的向量,注意m不一定等於n,但是每個分量的維數應該相同。

由於m不一定等於n,現在要計算r和t的相似度,就不能用以前的歐式距離等類似的度量方法了。那用什麼方法呢?dtw就是為了解決這個問題而產生的。

首先我們應該知道r中的乙個分量r(m)和t中的乙個分量t(n)的維數是相同的,它們之間可以計算相似度(即距離)。在運用dtw前,我們要首先計算r的每乙個分量和t中的每乙個分量之間的距離,形成乙個m*n的矩陣。(為了方便,行數用將標準模板的維數m,列數為待測模板的維數n)。

然後下面的步驟該怎麼計算呢?用個例子來看看。

這個例子中假設標準模板r為字母abcdef(6個),測試模板t為1234(4個)。r和t中各元素之間的距離已經給出。如下:

既然是模板匹配,所以各分量的先後匹配順序已經確定了,雖然不是一一對應的。現在題目的目的是要計算出測試模板t和標準模板r之間的距離。因為2個模板的長度不同,所以其對應匹配的關係有很多種,我們需要找出其中距離最短的那條匹配路徑。現假設題目滿足如下的約束:當從乙個方格((i-1,j-1)或者(i-1,j)或者(i,j-1))中到下乙個方格(i,j),如果是橫著或者豎著的話其距離為d(i,j),如果是斜著對角線過來的則是2d(i,j).其約束條件如下影象所示:

其中g(i,j)表示2個模板都從起始分量逐次匹配,已經到了m中的i分量和t中的j分量,並且匹配到此步是2個模板之間的距離。並且都是在前一次匹配的結果上加d(i,j)或者2d(i,j),然後取最小值。

所以我們將所有的匹配步驟標註後如下:

怎麼得來的呢?比如說g(1,1)=4, 當然前提都假設是g(0,0)=0,就是說g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

g(2,2)=9是一樣的道理。首先如果從g(1,2)來算的話是g(2,2)=g(1,2)+d(2,2)=5+4=9,因為是豎著上去的。

如果從g(2,1)來算的話是g(2,2)=g(2,1)+d(2,2)=7+4=11,因為是橫著往右走的。

如果從g(1,1)來算的話,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因為是斜著過去的。

綜上所述,取最小值為9. 所有g(2,2)=9.

當然在這之前要計算出g(1,1),g(2,1),g(1,2).因此計算g(i,j)也是有一定順序的。

其基本順序可以體現在如下:

計算了第一排,其中每乙個紅色的箭頭表示最小值**的那個方向。當計算了第二排後的結果如下:

最後都算完了的結果如下:

到此為止,我們已經得到了答案,即2個模板直接的距離為26. 我們還可以通過回溯找到最短距離的路徑,通過箭頭方向反推回去。如下所示:

到這裡,估計大家動手算一下就會明白了。其實很簡單,通過例子的學習後再回去看那些枯燥的理**式就發現很容易了。

在實際應用中,比如說語音識別中的孤立詞識別,我們首先訓練好常見字的讀音,提取特徵後作為乙個模板。當需要識別乙個新來的詞的時候,也同樣提取特徵,然後和訓練資料庫中的每乙個模板進行匹配,計算距離。求出最短距離的那個就是識別出來的字了。

matlab**:

function dist =dtw(t,r)

n = size(t,1

);m = size(r,1

);%幀匹配距離矩陣

d =zeros(n,m);

for i = 1

:n

for j = 1

:m d(i,j) = sum((t(i,:)-r(j,:)).^2

); end

end%累積距離矩陣

d = ones(n,m) *realmax;

d(1,1) = d(1,1

);%動態規劃

for i = 2

:n

for j = 1

:m d1 = d(i-1

,j);

if j>1

d2 = d(i-1,j-1

);

else

d2 =realmax;

endif j>2

d3 = d(i-1,j-2

);

else

d3 =realmax;

endd(i,j) = d(i,j) +min([d1,d2,d3]);

endenddist = d(n,m);

從乙個例項學習 FLASK WTF

本案例通過實現乙個註冊頁面的編寫,來帶你了解flask wtf的運用.主要功能為表單基礎的功能 手機號碼必須為11位數,且通過資料庫查詢不能有已經註冊的了,密碼要求輸入兩遍且必須一樣,且所有內容不能為空的提示等內容.那麼現在就開始把 一.建立表單類.首先運用flask wtf你必須確保你的環境中已經...

從乙個例項,一窺docker程序管理

在docker中,程序管理的基礎是linux核心的pid命名空間技術。在不同的pid命名空間下,可以有相同的pid。linux核心為所有的pid命名空間維護了乙個樹狀的資料結構,最頂層是系統初始化時建立的root namespace 根命名空間 父節點可以看到子節點中的程序,並可以通過訊號等方式對子...

從乙個演算法題學到的

程式設計珠璣 a題 給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中的32位整數。1 在檔案中至少存在這樣乙個數?2 如果有足夠的記憶體,如何處理?3 如果記憶體不足,僅可以用檔案來進行處理,如何處理?答案 1 32位整數,包括 2146473648 2146473647,...