【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序

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

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

概述

算法原理与步骤

算法的实现

概述

DTW (Dynamic time warping)算法是可以度量两个独立时间序列的相似度的一种方法。曾被广泛应用在单词音频的匹配上。该方法主要用来解决在两段序列的时长不同的情况下,进行相似度的判断。

上图中,左侧时长相等,可以逐一进行欧式距离的计算,右侧则是时长不等,经过DTW之后得到的结果,可以看出来两个序列并不是一一对应的。

再比如上面左图,要得到蓝色序列与红色序列的相似度,因为可以看出来两个序列有经过平移的迹象,直接用一一匹配的方法显然是不合理的。要得到左图的对应效果,就需要用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

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

【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序相关教程

数据库实现-索引文件(Index File)BPTree 版本

数据库实现-索引文件(Index File)BPTree 版本 Project 1 - Index file 这个项目呢,是尝试复刻一下数据库中的索引系统,只实现了内存版本的BPTree,索引文件并未建立成功(本博客持续更新ing) 文章目录 Project 1 - Index file 1.Abstract 2.Tasks Require

Cube实现天空盒子,看了你自己也能做

Cube实现天空盒子,看了你自己也能做 大家可能都了解了引擎自带的天空盒子,菜鸟也用过,感觉很棒。但是菜鸟在使用的过程中感觉天空盒子太大了,而场景比较小,所以想缩放一下天空盒子,奈何没找见,所以私下自己使用Cube实现了一下,分享给大家 1.坐标空间

02-链表

02-链表 链表 1.定义 链表是一种线性的动态数据结构,与动态数组,栈,队列的“动态”不同(这三种数据结构的底层都是静态数组,依托resize解决容量问题),链表是真正意义上的动态数据结构 链表与数组相比,失去了随机访问的能力,但却拥有动态的优点(不需

涉及简历

涉及简历 反射 反射概念:反射就是动态调用一个类/一个对象的成员变量/属性、方法、构造器的功能 定义测试的User:看到原类的构造器、成员属性、方法,想着怎么使用反射生成 package reflect;public class User { private int id=1; private String name=张三

ATM机项目实现:实现登录,注册操作(登录后可以存款,取款,查

ATM机项目实现:实现登录,注册操作(登录后可以存款,取款,查询余额,转账) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、分析需求 二、建立TestDemo.java 三、建立ATM.java 四、建立Bank.java 五、建立BankCard.

GPU中实现反距离加权插值(IDW)

GPU中实现反距离加权插值(IDW) 利用GPU实现IDW(反距离加权插值) IDW的实现比较简单,已知插值点位比较少的情况下,可以直接遍历所有插值点,来获取临近的几个点,进行插值运算。插值点较多时,需要可以使用 kd-tree 来加速临近点的查找。本次仅对 小数据量 情

前端实现一个小说分页的功能

前端实现一个小说分页的功能 来源 | https://juejin.im/post/6886418644381728776 先让我找找我的思路在哪里? 在小说读书APP中,都会有分页的功能,那么前端如何实现这个功能呢? 因为没有什么思路,那就只能在前辈的项目中寻找思路了。 这不,直接打开起点

centos7 docker容器内实现动态maven打包

centos7 docker容器内实现动态maven打包 背景:业务需要动态更新maven依赖,目前想到的办法是动态打包执行jar实现。已有centos7镜像且已安装java sdk。 linux下安装maven环境 官网下载安装包:http://maven.apache.org/download.cgi cd /mkdir optcd opt# 下

matlab如何看算法时间,【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序...相关推荐

  1. 动态时间规整_动态时间规整下时间序列子序列的搜索与挖掘

    一.DTW的背景 对于时间序列数据挖掘算法的相似性搜索来说最大的瓶颈就是所花费的时间,所以大多数关于时间序列数据挖掘的学术研究都在考虑数百万个时间序列对象时停滞不前,而许多工业和科学都在数十亿个等待探 ...

  2. php 获取动态时间,PHP 显示动态时间

    PHP 显示动态时间 一.重点:php时间的表示方法,js,dom取值 1.第一种方法 当前时间: function changetime(){ var ary = ["星期日", ...

  3. matlab如何看线性趋势线,matlab自动画趋势线指标公式

    自动画线太多了,给你一个我看好的,源码下面网址里有图片演示. 该指标能够做到对前期高点和最近高点的连线.前期低点和最近低点的连线.阻力位和支撑位的平行直线的连线,可以说简单易懂,一目了然.这类指标要用 ...

  4. python绘制时间轴_MatPlotLib动态时间轴

    因为我不知道你流的是什么,我写了一个通用的例子,它可以帮助你解决你的问题.在from pylab import * import matplotlib.animation as animation c ...

  5. 蝙蝠算法的matlab程序,经典蝙蝠算法MATLAB实现

    为什么会有这么多基于群智能的算法,蚁群.粒子群.鱼群.烟花.炮竹.猪群.牛群.马群.羊群.猴群.鸡群...算法.?????? 黑人问号.jpg 蝙蝠算法( BA) 是 Yang 教授于 2010 年基 ...

  6. 动态时间规整_动态规划-数组系列(10%)

    哇呀呀呀呀~~~好!实不相瞒,小弟我就是人称玉树临风胜潘安,一支梨花压海棠的小淫虫周伯通!<唐伯虎点秋香> 不同路径 II​leetcode-cn.com 一个机器人位于一个 m x n ...

  7. GEE:DTW(Dynamic Time Warping)动态时间规整,Sentinel-2 时间序列分类

    时间动态规整算法(Dynamic Time Warping,DTW)是一种常用到的时间序列分析方法,常用于时间序列分类.模式发现. 卫星影像时间序列分类的动态时间规整介绍:https://medium ...

  8. DTW 笔记: Dynamic Time Warping 动态时间规整 (DTW的python实现) 【DDTW,WDTW】

    0 总述 DTW可以计算两个时间序列的相似度,尤其适用于不同长度.不同节奏的时间序列(比如不同的人读同一个词的音频序列) DTW将自动扭曲(warping)时间序列(即在时间轴上进行局部的缩放),使得 ...

  9. dynamic time warping(动态时间规整)--学习笔记

    DTW可以计算两个时间序列的相似度,尤其适用于不同长度.不同节奏的时间序列(比如不同的人读同一个词的音频序列).DTW将自动warping扭曲 时间序列(即在时间轴上进行局部的缩放),使得两个序列的形 ...

  10. 无人驾驶路径规划(三)局部路径规划-Frenet坐标系下的动态轨迹规划

    前言:对于无人驾驶路径规划系列的第二篇RRT算法的改进部分,由于有些内容属于个人想到的创新点,有想法投一篇小论文所以暂时没有公开,等后续完成后我会再公开介绍.今天第三篇内容开启一个新的算法介绍:Fre ...

最新文章

  1. vlookup示例_VLOOKUP示例–如何在Excel中执行VLOOKUP
  2. “应付”大学作业,我花3小时写了一个“文本转手写”神器
  3. 收藏 | 常见的神经网络求导总结!
  4. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】...
  5. mariadb数据库备份与恢复
  6. MySQL Workbench运行脚本
  7. hivesql修改字段类型_Hive SQL语法总结
  8. mariadb与mysql的兼容_「MySQL架构」MariaDB versus MySQL: Compatibility
  9. Android Native C Log
  10. 【Unity3d】使GUI适应屏幕分辨率
  11. back propagation反向传播(浅层神经网络分析示例)
  12. 图像识别并用机械手进行抓取
  13. 风车IM即时通讯聊天系统源码
  14. 使用 Arduino Uno 与MQTT,echarts,java自己手动撸一个IOT平台
  15. python股票量化交易系统源码_经典的股票量化交易策略(含源码)
  16. GMS:基于网格运动统计的快速极度鲁棒的特征匹配
  17. 目标检测入门实战:贪吃蛇小游戏
  18. 无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。
  19. 华侨城集团欲借华侨城A 实现主业整合上市
  20. WebLogic的下载与安装

热门文章

  1. DBA:这有一份对接NBU备份故障排除指南,请查收!
  2. matlab画图命令
  3. 教你用MSChart控件绘制正态分布图形
  4. 推荐一份完整的python教学视频
  5. 北理工-大二数据结构乐学编程题-约瑟夫问题、验证表、循环小数、综教楼后的坑...
  6. EasyUI前端框架
  7. java删除非空文件夹
  8. 天线基础与HFSS天线设计流程
  9. java8新特性及汪文君Google Guava项目实战
  10. DDA数值微分法详解