首页天道酬勤数据周期性分析matlab,matlab实现离散时间系统

数据周期性分析matlab,matlab实现离散时间系统

张世龙 08-06 19:02 109次浏览

本文知识简单的介绍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

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

>>

精读Semantic Video CNNs through Representation Warping