Skip to content

【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序列之间的相似度

【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序列之间的相似度

概述

DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断
例子1
上图中,左侧时长相等,可以逐一进行欧式距离的计算,右侧则是时长不等,经过DTW之后得到的结果,可以看出来两个序列并不是一一对应的。
例子2
再比如上面左图,要得到蓝色序列与红色序列的相似度,因为可以看出来两个序列有经过平移的迹象,直接用一一匹配的方法显然是不合理的。要得到左图的对应效果,就需要用DTW方法。

算法原理与步骤

① 计算两个特征点之间的欧氏距离。构成一个 n*m 矩阵,距离矩阵。
在这里插入图片描述
②计算累计距离 得到DP矩阵
在这里插入图片描述
计算后的的值,放到DP矩阵中,为了更加直观的理解,把这两个序列绘图如下:
在这里插入图片描述
其实在计算过程中,计算的顺序其实是有方向的。网上有很多的博客说的也非常清楚,博主在这里不再赘述。为了更好的理解计算过程,列举一个非常非常非常非常简单的例子来帮助理解,如下图: A B为带有两个特征值的序列,右边是其对应的DP矩阵的求解步骤。
在这里插入图片描述
③ 当计算完整个DP矩阵 后,右上角的值(不一定是右上角,就是最终的得到的那个矩阵角上的值)即为两个序列的累计距离。

④从右上角往左下角回溯,找到累计距离最短的路径,根据路径可以得到各个点之间的对应关系。

算法的实现

博主是利用matlab实现的这个算法,只是因为利用matlab可以很方便的查看矩阵和画图,检查算法的正确性,但是没有调用matlab中成形的函数,所以利用这个思路,用C/C++也是可以实现的,便于移植。

首先要写好两个函数。
一个是Get Min();用来得到三个值中的最小值,在计算 DP矩阵 时用得到。

function min = GetMin(a,b,c)
if(a <= b && a <= c)
    min = a;
elseif(b <= a && b <= c)
    min = b;
elseif(c <= b && c <= a)
    min = c;
end
end

另一个是GetMinIndex();这是用来在得到 DTW 结果之后,方便显示特征点匹配的结果,返回两个序列对应特征点的索引。

function [index_i,index_j] = GetMinIndex(a,b,c,i,j)
%a 是相邻左上角,b 是相邻正上方,c说相邻正左方 
%i 是当前的x坐标  j 是当前 y坐标
if(a <= b && a <= c)
    index_i = i-1;
    index_j = j-1;
elseif(b <= a && b <= c)
    index_i = i-1;
    index_j = j;
elseif(c <= b && c <= a)
    index_i = i;
    index_j = j-1;
end
end

接下来就是主函数了

%生成两个有明显平移性质的时间序列
x = zeros(1,50);
for i = 1:50
    x(i) = sin(i*2*pi/50)+2;
end
y = zeros(1,50);
for i = 1:50
    y(i) = sin(i*2*pi/50 + pi/6)+2;
end

x_len = length(x);
y_len = length(y);
plot(1:x_len,x);hold on
plot(1:y_len,y);hold on
%计算两序列每个特征点的距离矩阵
distance = zeros(x_len,y_len);
for i = 1:x_len
    for j=1:y_len
        distance(i,j) = (x(i)-y(j)).^2;
    end
end

%计算两个序列
DP = zeros(x_len,y_len);
DP(1,1) = distance(1,1);
for i=2:x_len
    DP(i,1) = distance(i,1)+DP(i-1,1);
end
for j=2:y_len
    DP(1,j) = distance(1,j)+DP(1,j-1);
end
for i=2:x_len
    for j=2:y_len
        DP(i,j) = distance(i,j) + GetMin(DP(i-1,j),DP(i,j-1),DP(i-1,j-1));
    end
end


%回溯,找到各个特征点之间的匹配关系
i = x_len;
j = y_len;
while(~((i == 1)&&(j==1)))
    plot([i,j],[x(i),y(j)],'b');hold on %画出匹配之后的特征点之间的匹配关系
    if(i==1)
        index_i = 1
        index_j = j-1
    elseif(j==1)
        index_i = i-1
        index_j = 1
    else
    [index_i,index_j] = GetMinIndex(DP(i-1,j-1),DP(i-1,j),DP(i,j-1),i,j)
    end
    i = index_i;
    j = index_j;
    
end

最终效果如下图,可以看出来是考虑了平移之后的匹配。
效果图


深圳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 网站制作 网站优化