自从研究生毕业之后很长时间没有看过论文了,刚开始看这篇论文时有点不太适应,但是静下心来仔细品读这篇文章时,还是能够大概理解作者的意思.
言归正传,这篇文章讲了啥?
使用Dynamic Time Warping(下文叫DTW)算法技术在万亿级别的数据上搜索和查询时间子序列,而这样规模的数据搜寻技术在以前是无法做到的.另外这种技术还能使用廉价和低功耗的设备处理实时数据流,类似于考察两个子序列的相似度.
定义
在讨论DTW算法前,文章中定义了时间序列:
定义1, 定义了一个时间序列的表达式
定义2,定义了一个时间序列的子序列表达式
定义3,定义了两个子序列的欧式距离
另外: 我们可以通过将欧式距离绘制成二维矩阵,来画出warping path, 以及利用Sakoe-Chiba Band 和 R 的限制来得到搜索的最佳路径, 如下图:
看见二维图像中的红色实心块连接成的曲线就是搜索时间序列中子序列的最佳路径,从矩阵最开始将两个曲线起始点对齐和终止点对齐,而虚线是R限制下对齐线.
算法
对于已知算法优化,主要有以下方法:
- Using the Squared Distance
- Lower Bounding
- Early Abandoning of ED and LB_ Keogh
- Early Abandoning of DTW
- Exploiting Multicores
对于计算两个子序列的欧式距离,如下图所示:
lower bound计算公式:
lower bound = ED function(候选序列C,U/L更接近C者)
另外,针对比较Early Abandoning 时,
上图中,左边是使用了全局计算距离的方式,右边使用了局部选择不同的计算距离方式(DTW+LB),通过选择使用不同的计算方式,发现局部计算方式计算的欧式距离将会更小,相比全局计算来说,而且时间复杂度也会降低.
论文作者在上述优化方法的基础上提出了一个新颖的优化算法:The UCR Suite
首先: Z-Normalization
其次:Reordering Early Abandoning
在计算两个子序列的距离时,当累计距离求和达到某一个值时会考虑丢弃一部分数据,
这个是怎么解释呢?可以举个例子:
我们在一个整形数组里面查找某一个数字,当这个数组比较大(10000000000)时,我们应该怎样去精确查找呢?
eg: a = [1,2,5,4,9,2,567,343,274,346,456,.....],我们需要查找'45'这个数?
当然我们会想到二分查找的思路,在本文中,作者也借鉴了这个思路风格,所以在上图中作者也设置了一个阈值b,当超过b后,选择性放弃某一些值,所以这就是lower bound的思想.
为了研究DTW和LB的时间复杂度,作者做了大量的实验,如下图:
通过上图可以直观看出,单纯使用DTW和单纯使用LB的方法都不是很理想,要么时间复杂度很高(DTW),要么Tigthness 比较低(LB), 然而两者结合在一起使用时,能得到比较好的效果.
实现结果
本文作者结合了多个方法(navie,state-of-the-art,UCR Suite),做了大量的对比:
最后
作者的论文总体思想前部分是介绍DTW试用场景:比较适合大规模数据查询子序列情况,但是一般是针对全局查询来说,但是这种查询方法时间复杂度比较高,为了解决这个问题,作者想到了试用局部使用DTW和ED算法的思路,为了验证这个思路的正确性,做了大量相关实验,而且能够证明自己提出方法是有效的,甚至还大胆的猜想针对"基因序列"的查询和实时数据查询也是能起到作用的,同时也得到了证明.
但是从本文来看,单独使用DTW方法去计算查询数据,而且是针对万亿级的数据来说,依然存在消耗时间比较长的问题,借鉴"二分查找"的思路可以有效的解决时间过长的问题.
另外,作者花了一小段篇幅强调,在使用DTW查询时,一定要对数据进行normalization,这样能在一定程度上加快查询速度.
论文链接,
对NLP感兴趣的同学,可以了解一下!
完毕!