• DTW 算法(转)


    DTW为(Dynamic Time Warping,动态时间归准)的简称。应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中。可能大家学过这些类似的课程都看到过这个算法,公式也有几个,但是很抽象,当时看懂了但不久就会忘记,因为没有具体的实例来加深印象。

          这次主要是用语音识别课程老师上课的一个题目来理解DTW算法。

      首先还是介绍下DTW的思想:假设现在有一个标准的参考模板R,是一个M维的向量,即R={R(1),R(2),……,R(m),……,R(M)},每个分量可以是一个数或者是一个更小的向量。现在有一个才测试的模板T,是一个N维向量,即T={T(1),T(2),……,T(n),……,T(N)}同样每个分量可以是一个数或者是一个更小的向量,注意M不一定等于N,但是每个分量的维数应该相同。

         由于M不一定等于N,现在要计算R和T的相似度,就不能用以前的欧式距离等类似的度量方法了。那用什么方法呢?DTW就是为了解决这个问题而产生的。

    首先我们应该知道R中的一个分量R(m)和T中的一个分量T(n)的维数是相同的,它们之间可以计算相似度(即距离)。在运用DTW前,我们要首先计算R的每一个分量和T中的每一个分量之间的距离,形成一个M*N的矩阵。(为了方便,行数用将标准模板的维数M,列数为待测模板的维数N)。

    然后下面的步骤该怎么计算呢?用个例子来看看。

    这个例子中假设标准模板R为字母ABCDEF(6个),测试模板T为1234(4个)。R和T中各元素之间的距离已经给出。如下:

     

         既然是模板匹配,所以各分量的先后匹配顺序已经确定了,虽然不是一一对应的。现在题目的目的是要计算出测试模板T和标准模板R之间的距离。因为2个模板的长度不同,所以其对应匹配的关系有很多种,我们需要找出其中距离最短的那条匹配路径。现假设题目满足如下的约束:当从一个方格((i-1,j-1)或者(i-1,j)或者(i,j-1))中到下一个方格(i,j),如果是横着或者竖着的话其距离为d(i,j),如果是斜着对角线过来的则是2d(i,j).其约束条件如下图像所示:

     

         其中g(i,j)表示2个模板都从起始分量逐次匹配,已经到了M中的i分量和T中的j分量,并且匹配到此步是2个模板之间的距离。并且都是在前一次匹配的结果上加d(i,j)或者2d(i,j),然后取最小值。

         所以我们将所有的匹配步骤标注后如下:

         怎么得来的呢?比如说g(1,1)=4, 当然前提都假设是g(0,0)=0,就是说g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

         g(2,2)=9是一样的道理。首先如果从g(1,2)来算的话是g(2,2)=g(1,2)+d(2,2)=5+4=9,因为是竖着上去的。

         如果从g(2,1)来算的话是g(2,2)=g(2,1)+d(2,2)=7+4=11,因为是横着往右走的。

         如果从g(1,1)来算的话,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因为是斜着过去的。

         综上所述,取最小值为9. 所有g(2,2)=9.

         当然在这之前要计算出g(1,1),g(2,1),g(1,2).因此计算g(I,j)也是有一定顺序的。

    其基本顺序可以体现在如下:

     

         计算了第一排,其中每一个红色的箭头表示最小值来源的那个方向。当计算了第二排后的结果如下:

     

         最后都算完了的结果如下:

         到此为止,我们已经得到了答案,即2个模板直接的距离为26. 我们还可以通过回溯找到最短距离的路径,通过箭头方向反推回去。如下所示:

         到这里,估计大家动手算一下就会明白了。其实很简单,通过例子的学习后再回去看那些枯燥的理论公式就发现很容易了。

    function [Dist,D,k,w]=dtw(t,r)
    %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
    [rows,N]=size(t);
    [rows,M]=size(r);
    %for n=1:N
    %    for m=1:M
    %        d(n,m)=(t(n)-r(m))^2;
    %    end
    %end
    d=(repmat(t(:),1,M)-repmat(r(:)',N,1)).^2; %this replaces the nested for loops from above Thanks Georg Schmitz 
    
    D=zeros(size(d));
    D(1,1)=d(1,1);
    
    for n=2:N
        D(n,1)=d(n,1)+D(n-1,1);
    end
    for m=2:M
        D(1,m)=d(1,m)+D(1,m-1);
    end
    for n=2:N
        for m=2:M
            D(n,m)=d(n,m)+min([D(n-1,m),D(n-1,m-1),D(n,m-1)]);
        end
    end
    
    Dist=D(N,M);
    n=N;
    m=M;
    k=1;
    w=[];
    w(1,:)=[N,M];
    while ((n+m)~=2)
        if (n-1)==0
            m=m-1;
        elseif (m-1)==0
            n=n-1;
        else 
          [values,number]=min([D(n-1,m),D(n,m-1),D(n-1,m-1)]);
          switch number
          case 1
            n=n-1;
          case 2
            m=m-1;
          case 3
            n=n-1;
            m=m-1;
          end
      end
        k=k+1;
        w=cat(1,w,[n,m]);
    end

    转自:

    http://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html

    http://www.mathworks.com/matlabcentral/fileexchange/6516-dynamic-time-warping/content/dtw.m

  • 相关阅读:
    使用Regex.Replace只替换字符串一次
    Socket
    [转载]ASP.NET中在不同的子域中共享Session
    C#构造函数
    C# 的 ArrayList
    [转]决定何时使用 DataGrid、DataList 或 Repeater
    window.showModalDialog弹出对话框刷新问题
    ASP.NET] 选择文件夹的对话框
    网页打印javascript:window.print()
    开展工作
  • 原文地址:https://www.cnblogs.com/gogly/p/3584356.html
Copyright © 2020-2023  润新知