之前已经介绍过了DTW算法,现在根据文章 toward accurate dynamic time warping in linear time and space,以及别人实现的fastdtw代码分析fast-DTW算法。参考博客:http://www.cnblogs.com/kemaswill/archive/2013/04/18/3029078.html
简单讲讲fast-DTW,该算法最主要有两个部分,第一个是约束

将搜索空间约束在阴影位置,减少了搜索的次数。
第二个是抽象(abstraction),将图像的像素合并,1/1–>1/2–>1/4–>1/8…知道可以确定路径。如下图,当像素合并为1/8时,已经可以确定路径,即从左下角到右上角。接着再像素粒度细化,从1/8回到1/4确定该像素下的路径,接着1/2,最后1/1。

接下来我们看看python实现的fastdtw算法。

def fastdtw(x, y, radius=1, dist=lambda a, b: abs(a - b)):min_time_size = radius + 2if len(x) < min_time_size or len(y) < min_time_size:return dtw(x, y, dist=dist)x_shrinked = __reduce_by_half(x)y_shrinked = __reduce_by_half(y)distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist)window = __expand_window(path, len(x), len(y), radius)return dtw(x, y, window, dist=dist)

从代码可以看出来这个过程实现是递归的,并且调用了三个函数,__expand_window,dtw,__reduce_by_half。我们先去弄懂这三个函数,再回头来把整个fastdtw算法理顺。
首先我们来看这个dtw算法。仔细理一理思路,就能很清晰的分析这个代码了,window就是限制了的搜索范围,只要在这个范围内按照这个条件搜索就行。
D[i, j] = min((D[i-1, j][0]+dt, i-1, j), (D[i, j-1][0]+dt, i, j-1),(D[i-1, j-1][0]+dt, i-1, j-1), key=lambda a: a[0])
这其中用到了python的collections的defaultdict模块,只要你传入一个默认的工厂方法,那么请求一个不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值。寻找路径的时候是从终点寻到起点即可。

def dtw(x, y, window=None, dist=lambda a, b: abs(a - b)):len_x, len_y = len(x), len(y)if window is None:window = [(i, j) for i in xrange(len_x) for j in xrange(len_y)]window = ((i + 1, j + 1) for i, j in window)D = defaultdict(lambda: (float('inf'),))D[0, 0] = (0, 0, 0)for i, j in window:dt = dist(x[i-1], y[j-1])D[i, j] = min((D[i-1, j][0]+dt, i-1, j), (D[i, j-1][0]+dt, i, j-1),(D[i-1, j-1][0]+dt, i-1, j-1), key=lambda a: a[0])path = []i, j = len_x, len_ywhile not (i == j == 0):path.append((i-1, j-1))i, j = D[i, j][1], D[i, j][2]path.reverse()return (D[len_x, len_y][0], path)

接着,看看constraint是怎么实现的,即dtw中的window。这一部分没太弄明白,我运行了一下这个程序,当2x2–> 4x4扩大的时候,path是整个大小,而4x4–>8x8扩大的时候path大小为56。我表示很惊讶,要是我写这个代码,写出来的path大小不会这么多。

paper里面写时间复杂度的时候提到

假设我们是在8*8的的大小下寻找搜索空间,按照paper的公式来说应该是56个,而按照图示和描述应该是44个,不信自己可以去数一数。当然我也知道当N趋于无穷时,搜索空间的差异就显得很小了。

def __expand_window(path, len_x, len_y, radius):path_ = set(path)for i, j in path:for a, b in ((i + a, j + b)for a in xrange(-radius, radius+1)for b in xrange(-radius, radius+1)):path_.add((a, b))window_ = set()for i, j in path_:for a, b in ((i * 2, j * 2), (i * 2, j * 2 + 1),(i * 2 + 1, j * 2), (i * 2 + 1, j * 2 + 1)):window_.add((a, b))window = []start_j = 0for i in xrange(0, len_x):new_start_j = Nonefor j in xrange(start_j, len_y):if (i, j) in window_:window.append((i, j))if new_start_j is None:new_start_j = jelif new_start_j is not None:breakstart_j = new_start_jreturn window

最后返回去看整个代码,fastdtw就是一直递推调用自己,同时将两个序列二分压缩,直到达到可以直接计算出path的大小时,返回每一次调用。然后将粒度细化,就是图二的整个过程。

fast-DTW算法相关推荐

  1. SIFT,SURF,ORB,FAST 特征提取算法比较

    SIFT,SURF,ORB,FAST 特征提取算法比较 主要的特征检测方法有以下几种,在一般的图像处理库中(如OpenCV, VLFeat, Boofcv等)都会实现. FAST ,Machine L ...

  2. DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Fast R-CNN算法的简介(论文介绍) 1.实验结果 2.Fast R-CNN算 ...

  3. JavaScript实现Fast Powering算法(附完整源码)

    JavaScript实现Fast Powering算法(附完整源码) fastPowering.js完整源代码 fastPowering.js完整源代码 export default function ...

  4. 时序分析:DTW算法(基于模板)

    对时序对象进行分析,使用KMP算法可以分析速率不变的模式,参考时序分析:欧式空间轨迹模式识别.使用基于模板匹配的方法,对于速率发生变化的模式,需要用新的对速率要求松散的方法,DTW方法为一种广泛使用的 ...

  5. 动态时间规整-DTW算法

    作者:桂. 时间:2017-05-31  16:17:29 链接:http://www.cnblogs.com/xingshansi/p/6924911.html 前言 动态时间规整(Dynamic ...

  6. DTW算法(语音识别)

    DTW主要是应用在孤立词识别的算法,用来识别一些特定的指令比较好用,这个算法是基于DP(动态规划)的算法基础上发展而来的.这里介绍语音识别就先介绍下语音识别的框架,首先我们要有一个比对的模版声音,然后 ...

  7. 从一个实例中学习DTW算法

     基于动态时间规整算法(DTW)的相似度计算 Killer 发表于(2015-10-063) 本文标签:大数据 机器学习 算法 浏览量:193次 喜欢收藏 在孤立词语音识别中,最为简单有效的方法是 ...

  8. 【fast ICA】基于fast ICA算法的去除伪迹matlab仿真

    1.软件版本 matlab2021a 2.本算法理论知识 FAST方法,步骤如下所示: 3.核心代码 clc; clear; close all; warning off; addpath 'func ...

  9. 模仿微信声音锁的实现(运用DTW算法)

    自己写了模仿微信声音锁的一个android程序,先录两段相同的语音信号作为模板,解锁时通过对比输入语音和该两段语音模板的相似度,如果相似度高则解锁成功. 程序界面如下,仿照微信设置,当然跟原版比效果略 ...

  10. DTW 算法的实时语音识别——命令词识别(Python 实现)

    介绍 这是我们计算机视听觉的第三个实验,也是本学期语音部分的最后一个实验,大概花了两天才写完.上个实验做的是语音编码问题,这个实验是语音识别的事,感觉处理语音还是比较有意思的. 附上实验代码地址:实验 ...

最新文章

  1. android中的回调
  2. js控制鼠标移动_原生JS封装可拖拽效果
  3. html表单的数据保存在哪里,提交和保存表单数据
  4. Linux网络基础设施配置
  5. Mina代码跟踪(1)
  6. 基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历
  7. 巧用路径工具做流线字
  8. 小米路由器dns辅服务器未响应,小米路由器频繁掉线的原因与解决办法
  9. Vue 进阶系列(一)之响应式原理及实现
  10. PLSQL Split分割字符串
  11. maven库的查询和配置
  12. Unity3D学习笔记——layer
  13. 常用的Linux命令(小白入门指南)
  14. Django下载、安装
  15. 在移动硬盘(SDD)上装ubuntu18.04
  16. Python实现网络爬虫
  17. maximo跟java_maximo遇到的错误问题
  18. latex参考文献居中_latex参考文献常见问题
  19. html页面用excel打印,excel怎么打印不能全部显示出来
  20. wps excel 多数字文本格式转换为数字(不会以科学计数法显示)

热门文章

  1. Solid angle to Arnold for Cinema4D破解教程
  2. 苹果cms V10模板|首涂第二十五套精简宽屏主题模板破解带后台无加密版
  3. 本科毕设论文查重方法(重点介绍笔杆网站)
  4. python程序代码大全-Python编程代码示例 - 全文
  5. 班级管理系统(SSM+LayUI)
  6. 中继段光缆测试与用户光缆测试有什么区别?
  7. 菜鸟教程Python教程100例(一)(持续更新)
  8. 计算机操作系统-1days
  9. python手册下载_python学习手册
  10. xcap发包工具的简单使用3(报文描述)