动态时间规整算法——DTW
???沒有做過機器學習的小伙伴們對這個算法應該不是特別的了解,因為機器學習經常會用到這個算法。再將這個算法之前,我們先看一下初中的知識點。
歐幾里得距離
????在講解動態時間規整算法(Dynamic Time Warping, DTW)之前,我們先來了解一下,在日常生活中,用來計算兩點的距離,我們是怎么進行的?;叵胍幌鲁踔械臄祵W知識點——幾何距離,如下圖所示的二維空間中計算A點到B點的距離。
其中A點和B點的坐標分別為:A(1,2) 和 B(2,1),如果要算A點到B點的距離,那么計算方式為:
????如果是在三維的空間,如下圖所示:
其中A點和B點的坐標分別為:A(0,1,2)?和 B(1,3,1),如果要算A點到B點的距離,那么計算方式為:
? ? 以此類推,對于n維的空間,距離公式應該表達為:
????從初中用到現在,那么你知道這個和計算距離的方法是誰發明的嗎?(應該不是我嘿嘿嘿~~)。發明這個方法的大神就是歐幾里得,計算的距離公式也叫做歐幾里得距離,簡稱歐氏距離。
? ?
????你會好奇,無端端講了歐幾里得距離做什么,我們先不急,繼續往下看。
動態時間規整
? ? 上面我們講到了歐幾里得距離,舉的兩個例子也是針對空間上的位置計算,那么如果現在是兩個時序信號呢,也就是加上了時間維度,這種計算是否還能夠成立,接下來我們來看一下一個小例子,如下圖所示,假設用戶A和用戶B兩個人在讀 “我愛中國”。用戶A說的比較干脆,用戶B說的有點拖音(即用戶A說:“我愛中國”,用戶B說“我~愛中國”,差別就是用戶B在說我的時候拖了一下音)。我們假設用戶A的發音是【1,2,1,3】,用戶B的發音是【1,1,2,1,3】,兩個用戶的發音區別就是用戶B在說第一個字的時候拖了音,如下圖所示:
????因為用戶A和用戶B講的是同一句話,并且意思也是一樣的,那么按照機器學習理論來說,它們的相似性應該很相似,也就是距離很近,OK,那如果我們認為是n維數據,然后使用n維的歐氏距離來計算一下這兩者的距離,表達式為:
????通過上面表達式計算得知,用戶A和用戶B的距離為:
這也太遠了吧。不是說相似嗎。
????細心的你已經發現了一個問題,歐幾里得距離的計算方式是運用在空間上的比較多。對于時間序列,歐幾里得距離計算方法好像顯得不那么友好了。所以為了解決這個問題,日本的一位學者 Itakura 在60年代提出了動態時間規整算法(Dynamic Time Warping,DTW),用于衡量兩個長度不同的時間序列的相似度。把未知量伸長或縮短(壓擴),直到與參考模板的長度一致,在這一過程中,未知序列會產生扭曲或彎折,以便其特征量與標準模式對應。具體做法如下圖所示:
????圖中的紅線就是將用戶B的語音序列和用戶A的語音序列對應起來,實現時間規整的思想,這樣計算的距離才會是最短的。
????那么DTW算法的步驟如下:
計算兩個序列各個點之間的距離矩陣;
尋找一條從矩陣左上角到右下角的路徑,使得路徑上的元素和最小:
我們稱路徑上的元素之和為路徑的長度,那么怎么去尋找長度最小的路徑呢?
矩陣從左上角到右下角的路徑長度有以下性質:
(1)?當前的路徑長度 = 前一步的路徑長度 + 當前元素的大小
(2)?路徑上的某個元素(i,j),它的前一個元素只可能為以下三者之一:
? ? ? a.? 左邊的相鄰元素(i, j-1)
? ? ? b. 上面的相鄰元素(i-1, j)
? ? ? c.? 左上方的相鄰元素(i-1, j-1)
表達式表示為:
????????3. 尋找到最后的右下角就是路徑的最小路徑。
接下來,我們來對用戶A和用戶B進行動態時間規整步驟的解析:
首先,將序列A和序列B的矩陣列舉出來,然后元素兩兩相減:
????通過相減后得到上面的一個矩陣,接下來就定義一個結果矩陣來存放路徑的長度,如下圖所示,初始化結果矩陣,然后計算最上面一行和最左邊一列的路徑和,因為根據上面公式得到,第一行的每一個節點i只能從它的左邊i-1過來,而每一列的每一個節點j只能從它的上一個節點j-1過來。然后再計算其他的路徑,根據公式,在其他的節點中(i,j)的路徑前一個點有三個(i,j-1)、(i-1,j-1)、(i-1,j),分別計算取最小值作為當前的數值。依次計算遍歷。
最后得到的結果矩陣為:
????最右下角的元素數值就是用戶A和用戶B兩個序列的距離,結果為0,說明用戶A和用戶B所說的話是一樣的。
DTW的代碼如下:
#include<iostream> #include<string.h> #include<stdlib.h> using namespace std; #define NUM1 6 //序列中樣本點的個數簡單起見,假設2個序列的樣本點一樣多 #define NUM2 5 #define max 999 #define Min(a,b) (a<b?a:b)int main() {int i,j,k;//int a[NUM1],b[NUM2];int b[4]={1,2,1,3};int a[6]={1,1,2,1,3};int distance[NUM1+1][NUM2+1];int output[NUM1+1][NUM2+1];memset(distance,0,sizeof(distance));memset(output,0,sizeof(output));for(i=0;i<=NUM1;i++){for(j=0;j<=NUM2;j++){distance[i][j]=max;output[i][j]=max;}}distance[0][0]=0;output[0][0]=0;//for(i=0;i<NUM1;i++) cin>>a[i];//for(i=0;i<NUM2;i++) cin>>b[i];for(i=1;i<=NUM1;i++)for(j=1;j<=NUM2;j++)distance[i][j]=abs(b[j-1]-a[i-1]); //計算點與點之間的歐式距離for(i=1;i<NUM1;i++){for(j=1;j<NUM2;j++)cout<<distance[i][j]<<'\t';cout<<endl;} //輸出整個歐式距離的矩陣cout<<endl;for(i=1;i<NUM1;i++)for(j=1;j<NUM2;j++) output[i][j]=Min ( Min(output[i-1][j-1],output[i][j-1]) ,output[i-1][j] )+distance[i][j];//DP過程,計算DTW距離for(i=1;i<NUM1;i++){for(j=1;j<NUM2;j++)cout<<output[i][j]<<'\t';cout<<endl;} //輸出最后的DTW距離矩陣,其中output[NUM][NUM]為最終的DTW距離和system("pause");return 0; }結果輸出為:
總結
以上是生活随笔為你收集整理的动态时间规整算法——DTW的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【黑帽大牛】浅谈SEO快排系统对网站排名
- 下一篇: boll指标(布林带)计算公式