matlab如何看算法时间,【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序...
【Matlab實現】動態時間規劃調整算法(DTW算法)——計算兩個序
【Matlab實現】動態時間規劃調整算法(DTW算法)——計算兩個序列之間的相似度
【Matlab實現】動態時間規劃調整算法(DTW算法)——計算兩個序列之間的相似度
概述
算法原理與步驟
算法的實現
概述
DTW (Dynamic time warping)算法是可以度量兩個獨立時間序列的相似度的一種方法。曾被廣泛應用在單詞音頻的匹配上。該方法主要用來解決在兩段序列的時長不同的情況下,進行相似度的判斷。
上圖中,左側時長相等,可以逐一進行歐式距離的計算,右側則是時長不等,經過DTW之后得到的結果,可以看出來兩個序列并不是一一對應的。
再比如上面左圖,要得到藍色序列與紅色序列的相似度,因為可以看出來兩個序列有經過平移的跡象,直接用一一匹配的方法顯然是不合理的。要得到左圖的對應效果,就需要用DTW方法。
算法原理與步驟
① 計算兩個特征點之間的歐氏距離。構成一個 n*m 矩陣,距離矩陣。
②計算累計距離 得到DP矩陣。
計算后的的值,放到DP矩陣中,為了更加直觀的理解,把這兩個序列繪圖如下:
其實在計算過程中,計算的順序其實是有方向的。網上有很多的博客說的也非常清楚,博主在這里不再贅述。為了更好的理解計算過程,列舉一個非常非常非常非常簡單的例子來幫助理解,如下圖: A B為帶有兩個特征值的序列,右邊是其對應的DP矩陣的求解步驟。
③ 當計算完整個DP矩陣 后,右上角的值(不一定是右上角,就是最終的得到的那個矩陣角上的值)即為兩個序列的累計距離。
④從右上角往左下角回溯,找到累計距離最短的路徑,根據路徑可以得到各個點之間的對應關系。
算法的實現
博主是利用matlab實現的這個算法,只是因為利用matlab可以很方便的查看矩陣和畫圖,檢查算法的正確性,但是沒有調用matlab中成形的函數,所以利用這個思路,用C/C++也是可以實現的,便于移植。
首先要寫好兩個函數。
一個是Get Min();用來得到三個值中的最小值,在計算 DP矩陣 時用得到。
function min = GetMin(a,b,c)
if(a <= b && a <= c)
min = a;
elseif(b <= a && b <= c)
min = b;
elseif(c <= b && c <= a)
min = c;
end
end
另一個是GetMinIndex();這是用來在得到 DTW 結果之后,方便顯示特征點匹配的結果,返回兩個序列對應特征點的索引。
function [index_i,index_j] = GetMinIndex(a,b,c,i,j)
%a 是相鄰左上角,b 是相鄰正上方,c說相鄰正左方
%i 是當前的x坐標 j 是當前 y坐標
if(a <= b && a <= c)
index_i = i-1;
index_j = j-1;
elseif(b <= a && b <= c)
index_i = i-1;
index_j = j;
elseif(c <= b && c <= a)
index_i = i;
index_j = j-1;
end
end
接下來就是主函數了
%生成兩個有明顯平移性質的時間序列
x = zeros(1,50);
for i = 1:50
x(i) = sin(i*2*pi/50)+2;
end
y = zeros(1,50);
for i = 1:50
y(i) = sin(i*2*pi/50 + pi/6)+2;
end
x_len = length(x);
y_len = length(y);
plot(1:x_len,x);hold on
plot(1:y_len,y);hold on
%計算兩序列每個特征點的距離矩陣
distance = zeros(x_len,y_len);
for i = 1:x_len
for j=1:y_len
distance(i,j) = (x(i)-y(j)).^2;
end
end
%計算兩個序列
DP = zeros(x_len,y_len);
DP(1,1) = distance(1,1);
for i=2:x_len
DP(i,1) = distance(i,1)+DP(i-1,1);
end
for j=2:y_len
DP(1,j) = distance(1,j)+DP(1,j-1);
end
for i=2:x_len
for j=2:y_len
DP(i,j) = distance(i,j) + GetMin(DP(i-1,j),DP(i,j-1),DP(i-1,j-1));
end
end
%回溯,找到各個特征點之間的匹配關系
i = x_len;
j = y_len;
while(~((i == 1)&&(j==1)))
plot([i,j],[x(i),y(j)],'b');hold on %畫出匹配之后的特征點之間的匹配關系
if(i==1)
index_i = 1
index_j = j-1
elseif(j==1)
index_i = i-1
index_j = 1
else
[index_i,index_j] = GetMinIndex(DP(i-1,j-1),DP(i-1,j),DP(i,j-1),i,j)
end
i = index_i;
j = index_j;
end
最終效果如下圖,可以看出來是考慮了平移之后的匹配。
【Matlab實現】動態時間規劃調整算法(DTW算法)——計算兩個序相關教程
數據庫實現-索引文件(Index File)BPTree 版本
數據庫實現-索引文件(Index File)BPTree 版本 Project 1 - Index file 這個項目呢,是嘗試復刻一下數據庫中的索引系統,只實現了內存版本的BPTree,索引文件并未建立成功(本博客持續更新ing) 文章目錄 Project 1 - Index file 1.Abstract 2.Tasks Require
Cube實現天空盒子,看了你自己也能做
Cube實現天空盒子,看了你自己也能做 大家可能都了解了引擎自帶的天空盒子,菜鳥也用過,感覺很棒。但是菜鳥在使用的過程中感覺天空盒子太大了,而場景比較小,所以想縮放一下天空盒子,奈何沒找見,所以私下自己使用Cube實現了一下,分享給大家 1.坐標空間
02-鏈表
02-鏈表 鏈表 1.定義 鏈表是一種線性的動態數據結構,與動態數組,棧,隊列的“動態”不同(這三種數據結構的底層都是靜態數組,依托resize解決容量問題),鏈表是真正意義上的動態數據結構 鏈表與數組相比,失去了隨機訪問的能力,但卻擁有動態的優點(不需
涉及簡歷
涉及簡歷 反射 反射概念:反射就是動態調用一個類/一個對象的成員變量/屬性、方法、構造器的功能 定義測試的User:看到原類的構造器、成員屬性、方法,想著怎么使用反射生成 package reflect;public class User { private int id=1; private String name=張三
ATM機項目實現:實現登錄,注冊操作(登錄后可以存款,取款,查
ATM機項目實現:實現登錄,注冊操作(登錄后可以存款,取款,查詢余額,轉賬) 提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、分析需求 二、建立TestDemo.java 三、建立ATM.java 四、建立Bank.java 五、建立BankCard.
GPU中實現反距離加權插值(IDW)
GPU中實現反距離加權插值(IDW) 利用GPU實現IDW(反距離加權插值) IDW的實現比較簡單,已知插值點位比較少的情況下,可以直接遍歷所有插值點,來獲取臨近的幾個點,進行插值運算。插值點較多時,需要可以使用 kd-tree 來加速臨近點的查找。本次僅對 小數據量 情
前端實現一個小說分頁的功能
前端實現一個小說分頁的功能 來源 | https://juejin.im/post/6886418644381728776 先讓我找找我的思路在哪里? 在小說讀書APP中,都會有分頁的功能,那么前端如何實現這個功能呢? 因為沒有什么思路,那就只能在前輩的項目中尋找思路了。 這不,直接打開起點
centos7 docker容器內實現動態maven打包
centos7 docker容器內實現動態maven打包 背景:業務需要動態更新maven依賴,目前想到的辦法是動態打包執行jar實現。已有centos7鏡像且已安裝java sdk。 linux下安裝maven環境 官網下載安裝包:http://maven.apache.org/download.cgi cd /mkdir optcd opt# 下
總結
以上是生活随笔為你收集整理的matlab如何看算法时间,【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 概念验证_设置成功的UX概念验证
- 下一篇: matlab人脸追踪,求大神帮助我这个菜