动态时间规整(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
DTWtest.m
结果:
离散序列的一致性度量方法:动态时间规整(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 >>
相关文章推荐
- 响应式web设计--图片大小自适应的三种方法
- [Stack]Valid Parentheses
- *args和**kwargs
- win7自带画图程序里的橡皮擦的大小怎么改变?
- Ping++支付平台,开发者真正的选择。
- winform快速开发平台 -> 工作流组件(仿GooFlow)
- 你不知道的JavaScript--Item10 闭包(closure)
- 两个线程按特定时间顺序交替执行
- JDBC-Java程序向mysql中插入数据的中文乱码
- 解决此问题:Oracle 删除用户时报 “必须指定 CASCADE 以删除 'SE'”,
- ie678 兼容问题
- 你不知道的JavaScript--Item10 闭包(closure)
- 第三次作业(第二次改进)。
- hdu1251 统计难题 字典树
- 判断一个整数转换成二进制后1的个数
- Winpcap 链接 VS2013 小提示
- Linux vi指令详解
- hdu5504 GT and sequence(BestCoder Round #60 )
- 课后作业
- JS中用execCommand("SaveAs")保存页面兼容性问题解决方案