DTW(动态时间规划算法)——matlab代码运行成功

动态时间规整算法

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

在时间序列中,需要比较相似性的两段时间序列的长度可能并不相等,在语音识别领域表现为不同人的语速不同。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把“A”这个音拖得很长,或者把“i”发的很短。另外,不同时间序列可能仅仅存在时间轴上的位移,亦即在还原位移的情况下,两个时间序列是一致的。在这些复杂情况下,使用传统的欧几里得距离无法有效地求的两个时间序列之间的距离(或者相似性)。

DTW通过把时间序列进行延伸和缩短,来计算两个时间序列性之间的相似性:

如上图所示,上下两条实线代表两个时间序列,时间序列之间的虚线代表两个时间序列之间的相似的点。DTW使用所有这些相似点之间的距离的和,称之为归整路径距离(Warp Path Distance)来衡量两个时间序列之间的相似性。

再来看看运动捕捉,比如当前有一个很快的拳击动作,另外有一个未加标签的动作,我想判断它是不是拳击动作,那么就要计算这个未加标签的动作和已知的拳击动作的相似度。但是呢,他们两个的动作长度不一样,比如一个是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)之间选择,并且路径必须是最短的。计算的时候是按照动态规划的思想计算,也就是说在计算到达第(i,j)个节点的最短路径时候,考虑的是左上角也即第(i-1,j)、(i-1,j-1)、(i,j-1)这三个点到(i,j)的最短距离。

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

举个栗子:

已知:两个列向量a=[8 9 1]',b=[ 2 5 4 6]',其中'代表转置,也就是把行向量转换为列向量了

求:两个向量利用动态时间规整以后的最短距离

第一步:计算对应点的欧式距离矩阵d【注意开根号】
   

6342
7453
1435


第二步:计算累加距离D【从6出发到达5的累加距离】

   

691315
13101416
14141318

计算方法如下:
D(1,1)=d(1,1)=6

D(1,2)=D(1,1)+d(1,2)=9

...

D(2,2)=min(D(1,2),D(1,1),D(2,1))+d(2,2)=6+4=10

...

D(m,n)=min(D(m-1,n),D(m-1,n-1),D(m,n-1))+d(m,n)

matlab的代码如下:

dtw.m

function [Dist,D,k,w,rw,tw]=dtw(r,t,pflag)
%
% [Dist,D,k,w,rw,tw]=dtw(r,t,pflag)
%
% Dynamic Time Warping Algorithm
% Dist is unnormalized distance between t and r
% D is the accumulated distance matrix
% k is the normalizing factor
% w is the optimal path
% t is the vector you are testing against
% r is the vector you are testing
% rw is the warped r vector
% tw is the warped t vector
% pflag  plot flag: 1 (yes), 0(no)
%
% Version comments:
% rw, tw and pflag added by Pau Mic
 
[row,M]=size(r); if (row > M) M=row; r=r'; end;
[row,N]=size(t); if (row > N) N=row; t=t'; end;
d=sqrt((repmat(r',1,N)-repmat(t,M,1)).^2); %this makes clear the above instruction Thanks Pau Mic
d
D=zeros(size(d));
D(1,1)=d(1,1);
 
for m=2:M
    D(m,1)=d(m,1)+D(m-1,1);
end
for n=2:N
    D(1,n)=d(1,n)+D(1,n-1);
end
for m=2:M
    for n=2:N
        D(m,n)=d(m,n)+min(D(m-1,n),min(D(m-1,n-1),D(m,n-1))); % this double MIn construction improves in 10-fold the Speed-up. Thanks Sven Mensing
    end
end
 
Dist=D(M,N);
n=N;
m=M;
k=1;
w=[M N];
while ((n+m)~=2)
    if (n-1)==0
        m=m-1;
    elseif (m-1)==0
        n=n-1;
    else 
      [values,number]=min([D(m-1,n),D(m,n-1),D(m-1,n-1)]);
      switch number
      case 1
        m=m-1;
      case 2
        n=n-1;
      case 3
        m=m-1;
        n=n-1;
      end
  end
    k=k+1;
    w=[m n; w]; % this replace the above sentence. Thanks Pau Mic
end
 
% warped waves
rw=r(w(:,1));
tw=t(w(:,2));
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if pflag
    
    % --- Accumulated distance matrix and optimal path
    figure('Name','DTW - Accumulated distance matrix and optimal path', 'NumberTitle','off');
    
    main1=subplot('position',[0.19 0.19 0.67 0.79]);
    image(D);
    cmap = contrast(D);
    colormap(cmap); % 'copper' 'bone', 'gray' imagesc(D);
    hold on;
    x=w(:,1); y=w(:,2);
    ind=find(x==1); x(ind)=1+0.2;
    ind=find(x==M); x(ind)=M-0.2;
    ind=find(y==1); y(ind)=1+0.2;
    ind=find(y==N); y(ind)=N-0.2;
    plot(y,x,'-w', 'LineWidth',1);
    hold off;
    axis([1 N 1 M]);
    set(main1, 'FontSize',7, 'XTickLabel','', 'YTickLabel','');
 
    colorb1=subplot('position',[0.88 0.19 0.05 0.79]);
    nticks=8;
    ticks=floor(1:(size(cmap,1)-1)/(nticks-1):size(cmap,1));
    mx=max(max(D));
    mn=min(min(D));
    ticklabels=floor(mn:(mx-mn)/(nticks-1):mx);
    colorbar(colorb1);
    set(colorb1, 'FontSize',7, 'YTick',ticks, 'YTickLabel',ticklabels);
    set(get(colorb1,'YLabel'), 'String','Distance', 'Rotation',-90, 'FontSize',7, 'VerticalAlignment','bottom');
    
    left1=subplot('position',[0.07 0.19 0.10 0.79]);
    plot(r,M:-1:1,'-b');
    set(left1, 'YTick',mod(M,10):10:M, 'YTickLabel',10*rem(M,10):-10:0)
    axis([min(r) 1.1*max(r) 1 M]);
    set(left1, 'FontSize',7);
    set(get(left1,'YLabel'), 'String','Samples', 'FontSize',7, 'Rotation',-90, 'VerticalAlignment','cap');
    set(get(left1,'XLabel'), 'String','Amp', 'FontSize',6, 'VerticalAlignment','cap');
    
    bottom1=subplot('position',[0.19 0.07 0.67 0.10]);
    plot(t,'-r');
    axis([1 N min(t) 1.1*max(t)]);
    set(bottom1, 'FontSize',7, 'YAxisLocation','right');
    set(get(bottom1,'XLabel'), 'String','Samples', 'FontSize',7, 'VerticalAlignment','middle');
    set(get(bottom1,'YLabel'), 'String','Amp', 'Rotation',-90, 'FontSize',6, 'VerticalAlignment','bottom');
    
    % --- Warped signals
    figure('Name','DTW - warped signals', 'NumberTitle','off');
    
    subplot(1,2,1);
    set(gca, 'FontSize',7);
    hold on;
    plot(r,'-bx');
    plot(t,':r.');
    hold off;
    axis([1 max(M,N) min(min(r),min(t)) 1.1*max(max(r),max(t))]);
    grid;
    legend('signal 1','signal 2');
    title('Original signals');
    xlabel('Samples');
    ylabel('Amplitude');
    
    subplot(1,2,2);
    set(gca, 'FontSize',7);
    hold on;
    plot(rw,'-bx');
    plot(tw,':r.');
    hold off;
    axis([1 k min(min([rw; tw])) 1.1*max(max([rw; tw]))]);
    grid;
    legend('signal 1','signal 2');
    title('Warped signals');
    xlabel('Samples');
    ylabel('Amplitude');
    
end
下面是测试代码

test.m

clear
clc
a=[8 9 1 9 6 1 3 5]';
b=[2 5 4 6 7 8 3 7 7 2]';
[Dist,D,k,w,rw,tw] = DTW(a,b,1);
fprintf('最短距离为%d\n',Dist)
fprintf('最优路径为')
w

测试结果:

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
 
最短距离为27
最优路径为
w =
 
     1     1
     1     2
     1     3
     1     4
     1     5
     1     6
     2     6
     3     7
     4     8
     5     9
     6    10
     7    10
     8    10
规整以后的可视化结果如下:



--------------------- 
作者:风翼冰舟 
来源:CSDN 
原文:https://blog.csdn.net/zb1165048017/article/details/49226315 
版权声明:本文为博主原创文章,转载请附上博文链接!

IT-Sunshine
关注 关注
  • 26
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
DTW动态时间规整matlab代码
12-28
找的其他代码有错误,自己编写了一个。 斜方向的距离用的两倍,使用者可自行设置大小。如有错误请指正!
基于MATLAB实现DTW算法
11-01
基于Matlab软件,实现了语音识别中的DTW算法DTW算法使用了时间伸缩技术,解决了以前语音识别中,训练模板和参考模板帧长不一样的问题
matlabDTW算法MATLAB实现(动态时间规整)
05-08
DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现 DTW算法MATLAB实现
DTW动态时间调整)算法原理
最新发布
weixin_44915288的博客
03-21 880
用于解决同一句话但说话速度不同的识别问题
基于动态时间扭曲和dtw算法时间序列模式匹配matlab仿真
FPGA/MATLAB学习教程/源码/项目合作开发
12-20 302
DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断。④从右上角往左下角回溯,找到累计距离最短的路径,根据路径可以得到各个点之间的对应关系。① 计算两个特征点之间的欧氏距离。构成一个 n*m 矩阵,距离矩阵。③ 当计算完整个DP矩阵 后,右上角的值()即为两个序列的累计距离。②计算累计距离 得到。
HMM学习笔记_1(从一个实例中学习DTW算法)
weixin_34334744的博客
03-23 773
        DTW为(Dynamic Time Warping,动态时间归准)的简称。应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中。可能大家学过这些类似的课程都看到过这个算法,公式也有几个,但是很抽象,当时看懂了但不久就会忘记,因为没有具体的实例来加深印象。       这次主要是用语音识别课程老师上课的一个题目来理解DTW算法。   首先...
语音信号处理之(一)动态时间规整(DTW
热门推荐
zouxy09的专栏
06-20 10万+
语音信号处理之(一)动态时间规整(DTW)zouxy09@qq.comhttp://blog.csdn.net/zouxy09         这学期有《语音信号处理》这门课,快考试了,所以也要了解了解相关的知识点。呵呵,平时没怎么听课,现在只能抱佛脚了。顺便也总结总结,好让自己的知识架构清晰点,也和大家分享下。下面总结的是第一个知识点:DTW。因为花的时间不多,所以可能会有不少说的不妥的地方,还
基于matlabDTW源代码
04-14
语音识别(Speech Recognition)是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术
dtw代码matlab-Basic_DTW_Matlab:Matlab代码:用于DTW计算的基本Matlab函数和可视化结果的函数
06-01
dtw 代码matlab Basic_DTW_Matlab Matlab 代码:用于 DTW 计算的基本 Matlab 函数和可视化结果的函数
DTW.zip_dtw_动态时间规划MATLAB代码_动态规划_响应时间_时间序列
09-20
曲线动态时间规划规划距离计算,应用于单元响应时间序列曲线
dtw算法matlab代码实现,有图
06-13
可运行
matlab实现DTW算法
11-26
matlab实现了DTW算法,已经经过了测试
使用matlab 实现DTW算法
03-16
使用matlab 实现DTW算法,语句比较简单易懂,已经经过测试
dtw代码matlab-Dynamic-Time-warping:用于对齐两个时间序列(理想情况下是3D加速度计值)并计算动态时间扭曲(DTW
06-01
dtw 代码matlab 动态时间扭曲 用于对齐两个时间序列(理想情况下是 3D 加速度计值)并计算动态时间扭曲 (DTW) 距离的 MATLAB 函数。 对齐是为了校正时间序列之间的相位差。 主代码:alignDTW.m 输入:时间序列输出:DTW 距离
使用matlab 实现DTW算法(源代码)
09-10
使用matlab 实现DTW算法(源代码) 使用matlab 实现DTW算法,语句比较简单易懂,已经经过测试
dtwmatlab程序
03-02
比较简单的dtw程序(matlab),适合于初级学习
dtw:动态时间规整算法-matlab开发
05-29
使用动态时间扭曲算法查找两个字符串之间的相似性的函数。
DTW算法
u010194274的博客
08-10 7395
dtw算法主要针对序列匹配提出的,尤其是当序列出现一定的飘移,欧氏距离度量就会失效。dtw常用在语音匹配当中,在图像处理里面也有一定的应用。 现在有两个序列X,Y. X=[2,3,4,7,9,2,1,2,1],Y=[1,1,1,1,2,3,3,4,7,8,9,1,1,1,1] 绘制在坐标轴上如下图 我们可以看到,两个序列的欧氏距离很大,因为两个序列存在横轴上的飘移。dtw算法就是为了解决
机器学习算法(二十三):DTW(Dynamic Time Warping,动态时间调整)
weixin_39910711的博客
08-30 2万+
1DTW动态时间调整) 动态时间调整算法是大多用于检测两条语音的相似程度,由于每次发言,每个字母发音的长短不同,会导致两条语音不会完全的吻合,动态时间调整算法,会对语音进行拉伸或者压缩,使得它们尽可能的对齐。 如上图红圈标注的位置,可以发现下面那条线中有许多的点与之对应,如果换成一个个离散的点表示的话,实际上是对上一条曲线该点进行了拉伸处理,使得它们最大化对齐。 最近在研究时间序列的问题,时间序列类似这个。假如想计算两条天气的时间序列是否相似,由...
matlab dtw函数
07-30
MATLAB中的DTW函数是Dynamic Time Warping(动态时间规整)算法的一种实现。DTW是一种用于比较两个时间序列相似度的方法。该函数的语法如下: [d, D] = dtw(x, y) 其中,x和y分别是要比较的两个时间序列,d是两个序列之间的最小距离,D是一个矩阵,表示两个序列之间的对齐路径。 DTW算法的基本思想是根据两个序列之间的相似性来计算最短路径。它可以处理时间序列长度不同的情况,并且对序列中的局部变化具有鲁棒性。DTW算法的核心是定义一个距离度量,常用的有欧几里得距离、曼哈顿距离等。 DTW函数的结果d表示两个序列之间的最小距离,可以用来判断两个序列的相似度。通过比较d与一个预先设定的阈值,可以确定是否可以认为两个序列相似。 DTW函数的结果D是一个矩阵,表示两个序列之间的对齐路径。通过分析D矩阵,我们可以获得两个序列之间的对齐关系,即哪些数据点匹配上了。 在MATLAB中,可以使用DTW函数来计算两个时间序列之间的相似度,并进行数据对齐。它可以应用于许多领域,如语音识别、手写识别、行为识别等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

最新评论

  • 幂等和防重的区别

    IT-Sunshine: 4.防重表,针对不是所有数据都是防重的业务场景,针对需要防重的业务场景建立防重表 5.redis分布式锁,

  • java实现的坦克大战(整理代码)

    m0_75225853: 为啥我运行这代码啥都不会显示啊

  • DTW(动态时间规划算法)——matlab代码运行成功

    小乐777: 有吗?请问具体怎么用?找了一圈没发现

  • DTW(动态时间规划算法)——matlab代码运行成功

    Maxim-ZJU: 请问事实上DTW的距离越小,时间序列相似度越高,当多个DTW指数同时计算时,如何衡量相似度?换句话说,我现在想用DTW矩阵构建权重网络进行图分割对时间序列进行分类,DTW值该设置为多少的阈值构建网络才是最好的选择?

  • java Web的基本介绍+tomcat+http详解

    CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

最新文章

  • 幂等和防重的区别
  • java Web的基本介绍+tomcat+http详解
  • 反射操作泛型和注解
2023年1篇
2022年43篇
2021年6篇
2020年10篇
2019年77篇
2018年27篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司福永网站搭建推荐拉萨百度标王多少钱平凉网络营销多少钱来宾网站建设公司丹竹头模板制作报价新乡百姓网标王多少钱池州seo排名推荐那曲企业网站设计价格台州SEO按天扣费丹东网络推广咸阳seo报价鹤岗网站改版报价盐田网站搜索优化公司吕梁网络广告推广大庆网站优化按天收费推荐赣州百度网站优化哪家好朔州seo优化多少钱怒江网站优化按天收费哪家好宿州推广网站朝阳网站改版多少钱文山SEO按天扣费推荐盐田网页制作价格黔南网站制作设计价格韶关企业网站改版价格双龙至尊标王推荐海南建设网站报价泰安建站公司济源百度网站优化揭阳seo排名推荐运城网络营销公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化