您的位置:首页 > 其它

动态时间规整(Dynamic Time Warping)

2015-10-18 11:05 225 查看
本文知识简单的介绍DTW算法的目的和实现。具体的DTW可以参考一下文献:

离散序列的一致性度量方法:动态时间规整(DTW) http://blog.csdn.net/liyuefeilong/article/details/45748399
动态时间归整/规整/弯曲(Dynamic time warping,DTW) http://www.cnblogs.com/flypiggy/p/3603192.html
DTW是干什么的?

动态时间规整算法,故名思议,就是把两个代表同一个类型的事物的不同长度序列进行时间上的“对齐”。比如DTW最常用的地方,语音识别中,同一个字母,由不同人发音,长短肯定不一样,把声音记录下来以后,它的信号肯定是很相似的,只是在时间上不太对整齐而已。所以我们需要用一个函数拉长或者缩短其中一个信号,使得它们之间的误差达到最小。

再来看看运动捕捉,比如当前有一个很快的拳击动作,另外有一个未加标签的动作,我想判断它是不是拳击动作,那么就要计算这个未加标签的动作和已知的拳击动作的相似度。但是呢,他们两个的动作长度不一样,比如一个是100帧,一个是200帧,那么这样直接对每一帧进行对比,计算到后面,误差肯定很大,那么我们把已知拳击动作的每一帧找到无标签的动作的对应帧中,使得它们的距离最短。这样便可以计算出两个运动的相似度,然后设定一个阈值,满足阈值范围就把未知动作加上“拳击”标签。

DTW怎么计算?

下面我们来总结一下DTW动态时间规整算法的简单的步骤:

1. 首先肯定是已知两个或者多个序列,但是都是两个两个的比较,所以我们假设有两个序列A={a1,a2,a3,...,am} B={b1,b2,b3,....,bn},维度m>n

2. 然后用欧式距离计算出每序列的每两点之间的距离,D(ai,bj) 其中1≤i≤m,1≤j≤n

画出下表:



3. 接下来就是根据上图将最短路径找出来。从D(a1,a2)沿着某条路径到达D(am,bn)。找路径满足:假如当前节点是D(ai,bj),那么下一个节点必须是在D(i+1,j),D(i,j+1), D(i+1,j+1)之间选择。并且路径必须是最短的。

4. 接下来输出路径,从D(a1,b1)到D(am,bn)。他们的总和就是就是所需要的DTW距离

好吧,表示自己写的代码很差劲,但是别人的不好意思拿来贴~~参考就可以了,不对之处谢谢大家指正:

matlab代码:

DTW.m

function [route,distant]=DTW(a,b)
%动态时间规整
m=size(a,1);
n=size(b,1);

for i=1:m
for j=1:n
D(i,j)=sqrt((a(i,:)-b(j,:))^2);
end
end
D
%求附近范围的最大值
x=1;
y=1;
r=2;
route(1,1)=1;
route(1,2)=1;
route(1,3)=D(1,1);
distant=D(1,1);
for i=1:m-1
for j=1:n-1
if x<m && y<n
value(1)=D(x+1,y);
value(2)=D(x+1,y+1);
value(3)=D(x,y+1);
[maxvalue,index]=min(value);
distant=distant+maxvalue;
if index==1
x=x+1;y=y;
route(r,1)=x;
route(r,2)=y;
route(r,3)=D(x,y);
r=r+1;
end
if index==2
x=x+1;y=y+1;
route(r,1)=x;
route(r,2)=y;
route(r,3)=D(x,y);
r=r+1;
end
if index==3
x=x;y=y+1;
route(r,1)=x;
route(r,2)=y;
route(r,3)=D(x,y);
r=r+1;
end
end
end
end
%到达边缘的两种情况
if x==m
for i=y+1:n
route(r,1)=m;  route(r,2)=i;route(r,3)=D(x,i);r=r+1;
distant=distant+D(x,i);
end
end
if y==n
for i=x+1:m
route(r,1)=i;  route(r,2)=n;route(r,3)=D(i,y);r=r+1;
distant=distant+D(i,y);
end
end
end


DTWtest.m

clear
clc
a=[8 9 1 9 6 1 3 5]';
b=[2 5 4 6 7 8 3 7 7 2]';
[route,distant]=DTW(a,b)


结果:

D =

6     3     4     2     1     0     5     1     1     6
7     4     5     3     2     1     6     2     2     7
1     4     3     5     6     7     2     6     6     1
7     4     5     3     2     1     6     2     2     7
4     1     2     0     1     2     3     1     1     4
1     4     3     5     6     7     2     6     6     1
1     2     1     3     4     5     0     4     4     1
3     0     1     1     2     3     2     2     2     3

route =

1     1     6
1     2     3
2     2     4
3     3     3
4     4     3
5     4     0
5     5     1
5     6     2
6     7     2
7     7     0
8     7     2
8     8     2
8     9     2
8    10     3

distant =

33

>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: