1. 程式人生 > >從一個例項中學習DTW演算法

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

歡迎轉載或分享,但請務必宣告文章出處。 (新浪微博:tornadomeet,歡迎交流!)

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

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

  首先還是介紹下DTW的思想:假設現在有一個標準的參考模板R,是一個M維的向量,即R={R(1),R(2),……,R(m),……,R(M)},每個分量可以是一個數或者是一個更小的向量。現在有一個才測試的模板T,是一個N維向量,即T={T(1),T(2),……,T(n),……,T(N)}同樣每個分量可以是一個數或者是一個更小的向量,注意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. 我們還可以通過回溯找到最短距離的路徑,通過箭頭方向反推回去。如下所示:

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

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

相關推薦

一個例項學習DTW演算法

歡迎轉載或分享,但請務必宣告文章出處。 (新浪微博:tornadomeet,歡迎交流!) DTW為(Dynamic Time Warping,動態時間歸準)的簡稱。應用很廣,主要是在模板匹配中,比如說用在孤立詞語音識別,計算機視覺中的行為識別,資訊檢索等中。可能大家學過這些類似的課程都看到過這個演算法,

Cerber勒索軟體學習murmurhash演算法

? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

實例學習grid布局

{} 簡單 mic 通過 目前 例子 get www. pre 對於Web開發者來說,網頁布局一直是個比較重要的問題。 Web 布局主要經歷了以下四個階段:   1、table表格布局;   2、float浮動及position定位布局;   3、flex彈性盒模型布局,革

Confluence 6 一個備份獲得文件附件

www. dmi 自動 頁面 允許 ini www 自動備份 config 頁面中的文件附件可以從備份中獲得而不需要將備份文件導入到 Confluence 中。這個在用戶刪掉了附件,但是你還是想恢復這個附件的時候就變得非常有用了。自動備份和手動備份都允許你進行這個操作,但是

貝葉斯網(2)Netica:數據學習CPT

指向 搭建 上一個 劃分 認知 圖劃分 4.0 ont 再次 1. 離散節點 在官方Tutorial中是有詳細的案例的,就是B篇3.3節,你可以動手把天氣預報這個實現一下: http://www.norsys.com/tutorials/netica/secB/tut_B3

[遞迴] 排列組合 - 一個字串任意選取N個元素構成的所有排列組合 - C語言

排列組合 【題目】求從字串中"ABCD"中任取3個元素構成的所有排列組合 A

安卓的資料共享——一個APP呼叫另一個APP資料的方法

在Android中如何在一個APP中呼叫另一個APP中的資料呢?大致有以下五種方法可以實現 1、首選項資訊-Shared Preferences 2、檔案 3、SQLite 4、Content Provider 5、廣播 下來對上述的五種方法進行詳細的解析: 1、首先對

Brightline Initiative研究表明,危機模式學習可帶來更強大的戰略執行能力

賓夕法尼亞州紐頓廣場--(美國商業資訊)--Brightline™ Initiative今天與Quartz Insights共同宣佈,釋出題為《從危機模式中學習——危機對更強大戰略執行的意義》(Learning From Crisis Mode – Implications for Better

Confluence 6 一個模板建立一個空間

Confluence 已經儲存了一系列的模板,這些模板被稱為 空間藍圖(space blueprints),這模板具有一些自定義的主頁,邊欄或者可能有藍圖頁面或一些示例內容來幫助你開始使用 Confluence。 這個頁面是有關空間的藍圖的。你可以檢視 Blueprints 

網咖上網學習裝飾者模式

前言 前面在學習mybatis的二級快取中,我們提到CachingExcuter,以及cache介面中用到了裝飾者設計模式,那麼到底什麼是裝飾者設計模式呢?它有什麼優勢呢?下面結合網咖上網的例子來看看裝飾者模式如何將普通玩家裝飾為人民幣玩家。 裝飾者模式介紹 1.裝飾者

【C語言練習題】編寫一個函式,它一個字串提取一個子字串

《C與指標》 習題 4.14   編寫一個函式,它從一個字串中提取一個子字串。函式原型如下: int substr(char dst[], char src[],int start, int l

一個例項詳解敏捷測試的最佳實踐

敏捷軟體開發是目前十分流行,並在業界逐步推廣的軟體開發模式。不同與傳統的軟體開發模式,敏捷開發模式有著自己鮮明的價值和方法。其中,敏捷測試部分也同以往的軟體測試流程有所不同。這對測試人員提出了新的要求,帶來了新的挑戰。本文將結合一個軟體專案例項,基於專案開發的不同階段,詳細

一個例項看java,new一個物件時的初始化順序

例子如下: package com.zhiru; class ADemo { private static int id; static { id = 0; System.out.pri

(一)Spring IoC原始碼-2.bean的載入-03FactoryBean例項獲取目標例項

無論是已經載入到了單例bean還是建立bean後,都需要通過bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);從bean例項中獲取目標物件。 無論是從快取中獲取到

Sql Server儲存過程一個抓取資料填充到另一張表

  set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  <alex,,Name> -- Create

mysql 一個查資料,插入另一個表。。

其實很簡單,只是為了忘記,做個記錄,用的時候方便。 INSERT INTO TPersonnelChange( UserId, DepId, SubDepId, PostionType, AuthorityId, ChangeDateS, InsertDate

ORACLE SQL: 一個查詢資料插入另一個

insert into expertinfo (expertid,expertname,expertcode,sex,enabled) select primarykey as expertid, name as expertname,

機房重構學習資料庫——儲存過程和觸發器

      開門見山,我也是在機房中學習使用儲存過程,看來大家的部落格,慢慢的使用,接觸了一段時間還是有點模糊。簡單總結一下。                                    

微服務設計簡單實踐---一個簡單需求學習微服務思想

從一個案例來看,如何在做架構設計時利用微服務的思想來幫我們解決問題。   背景介紹 公司對產品服務的管理目前還停留在物理機的那種理念,雖然阿里雲、AWS、騰訊雲、OpenStack等雲平臺用的不亦樂乎,但仍然停留在針對hostname和ip的管理上。如果想釋出一個新版本,需要將

Java 8 – 一個 Stream過濾null值

複習一個Stream 包含 null 資料的例子. Java8Examples.java package com.mkyong.java8; import java.util.List; import java.util.stream.Collectors; impo