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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

动态时间规整算法——DTW

發布時間:2023/12/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态时间规整算法——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的全部內容,希望文章能夠幫你解決所遇到的問題。

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