我尝试使用动态时间翘曲(DTW)来检测使用智能手机执行的手势,使用加速度传感器。我已经实现了一个简单的DTW算法。
因此,我基本上是在比较加速度计阵列数据(x,y,z)和DTW。一个数组包含我的前置手势,另一个数组应该包含测量值。我的问题是,加速度传感器测量的是连续的新值,我不知道什么时候开始用预定义的值序列进行比较。
我需要知道手势何时开始和结束,但这可能与不同的手势不同。在我的例子中,所有的手势都支持在同一点开始和结束,但据我所知,我无法可靠地计算出从加速度到行程的距离。
因此,总结一下:如何确定使用DTW比较我的数组的正确时间?
提前感谢!
发布于 2015-07-05 19:28:02
答案是,您将预定义的手势与每个子序列进行比较。您可以以比实时更快的速度完成这一任务(请参阅a)。
您需要对每个子序列进行z-规范化,并对您预先定义的手势进行z-规范化。
所以,比方说,如果你流的是.
NOW IS THE WINTER OF OUR DISCONTENT, MADE GLORIOUS SUMMER.. 您的预定义单词是made,您可以比较每个标记的单词开头(用空格表示)。
DTW(MADE,NOW)
DTW(MADE,IS)
DTW(MADE,THE)
DTW(MADE,WINTER)等
在你的情况下,你没有制造者,你有这个.
NOWISTHEWINTEROFOURDISCONTENTMADEGLORIOUSSUMMER.. 所以你只需要测试每一个偏移量
DTW(MADE,NOWI)
DTW(MADE, OWIS)
DTW(MADE, WIST)
DTW(MADE, ISTH)
::
DTW(MADE, TMAD)
DTW(MADE, MADE) // Success!埃蒙
发布于 2016-07-25 10:48:25
您不仅希望将DTW应用于时间序列,还希望将DTW应用到不断演变的流中。因此,您必须使用n个最近的数据点的滑动窗口。这正是eamonn在他的第二个例子中所描述的。他的目标模式包括4个事件(M,A,D,E),因此他使用了一个长度为4的滑动窗口。
但在这种情况下,他假设数据流不包含扭曲,例如(M,A,A,D,E)。DTW的优点是它允许这种扭曲,但同时也承认扭曲的目标模式是匹配的。在你的例子中,时间上的扭曲很可能发生。我假设你想要同样的手势,无论是慢的还是快的,都要做同样的手势。
因此,滑动窗口的长度必须高于目标模式的长度(以便能够检测到缓慢的目标手势)。这在计算上是很昂贵的。
最后,我的观点是:我想给你们推荐这篇由酒井、法鲁佐斯和山三郎撰写的论文弹簧算法。
他们优化了数据传输的DTW算法。您不再需要超过每个传入事件的n*n计算,而只需要n。它基本上是DTW,但是减少了所有不相关的计算,并且只考虑了模板与流的最佳对齐。
附注:大部分关于时间序列和模式匹配的知识,我都是通过阅读Eamonn Keogh提供的内容而学到的。非常感谢,基奥先生。
https://stackoverflow.com/questions/31230852
复制相似问题