我正在研究比较时间序列数据的方法。我发现用于匹配此类数据的算法之一是DTW(动态时间扭曲)算法。
我拥有的数据类似于以下结构(可以是一条路径):
Path Event Time Location (x,y)
1 1 2:30:02 1,5
1 2 2:30:04 2,7
1 3 2:30:06 4,4
...
...
现在,我想知道是否有其他算法适合找到给定路径的最接近匹配。
答案 0 :(得分:2)
如果两条路径长度相同,比如 n ,则它们实际上是 2n 维空间中的点。第一个位置确定前两个维度,第二个位置确定下两个维度,依此类推。例如,如果我们只取你的例子中的三个点,那么路径可以表示为单个6维点(1,5,2,7,4,4)。如果我们想将它与另一个三点路径进行比较,我们可以计算欧几里德距离(两点之间每维度距离的平方和的平方根)或曼哈顿距离(每维度差异的总和) )。
例如,在所有三次停留在(0,0)的钻孔路径变为6维点(0,0,0,0,0,0)。然后,此点与示例路径之间的欧几里德距离为sqrt((1-0)^2 + (5-0)^2 + (2-0)^2 + (7-0)^2 + (4-0)^2 + (4-0)^2) = sqrt(111) = 10.54
。曼哈顿距离为abs(1-0) + abs(5-0) + abs(2-0) + abs(7-0) + abs(4-0) + abs(4-0) = 23
。这种指标之间的差异并不罕见,因为曼哈顿距离可以证明至少与欧几里德距离一样大。
当然,这种方法的一个问题是并非所有路径都具有相同的长度。但是,您可以轻松地将较长的路径切断为与较短路径相同的长度,或者考虑两条路径中的较短路径保持在同一位置或在测量结束后沿相同方向移动,直到两条路径长度相同为止。这两种方法都会引入一些不准确之处,但无论你做什么,你都必须处理这样一个事实:你在短路径上缺少数据并且必须以某种方式弥补它。
修改强>
假设path1
和path2
都是包含这些点的List<Tuple<int, int>>
个对象,我们可以切断较长的列表以匹配较短的列表:
// Enumerable.Zip stops when it finishes one of the sequences
List<Tuple<int, int, int, int>> matchingPoints = Enumerable.Zip(path1, path2,
(tupl1, tupl2) =>
Tuple.Create(tupl1.Item1, tupl1.Item2, tupl2.Item1, tupl2.Item2));
然后,您可以使用以下代码查找曼哈顿距离:
int manhattanDistance = matchingPoints
.Sum(tupl => Math.Abs(tupl.Item1 - tupl.Item3)
+ Math.Abs(tupl.Item2 - tupl.Item4));
使用与曼哈顿距离相同的假设,我们可以生成欧几里德距离:
int euclideanDistanceSquared = matchingPoints
.Sum(tupl => Math.Pow(tupl.Item1 - tupl.Item3, 2)
+ Math.Pow(tupl.Item2 - tupl.Item4, 2));
double euclideanDistance = Math.Sqrt(euclideanDistanceSquared);
答案 1 :(得分:2)
还有一个问题here可能会有所帮助。如果已有给定路径,则可以使用跨轨距离算法找到最接近的匹配;另一方面,如果你真的想要解决模式识别问题,你可能想要了解更多关于Levenshtein距离和弹性匹配的信息(来自维基百科:“弹性匹配可以定义为二维变形指定的优化问题受影像之间的相应像素“。
答案 2 :(得分:2)
您正在寻找的关键字是&#34;(dis-)相似性度量&#34;。
Adam Mihalcin提到的欧几里得距离(ED)(第一个答案)很容易计算,并以某种方式反映了自然语言中对词距离的自然理解。然而,当比较两个时间序列时,DTW将被优先考虑 - 特别是当应用于真实世界数据时。1)ED只能应用于相同长度的系列。因此,当缺少点时,ED根本不可计算(除非也切断其他序列,因此丢失更多信息)。
2)ED不允许与基于DTW的所有算法相反的时移或时间扭曲。
因此,ED不是DTW的真正替代品,因为要求和限制要高得多。但是要回答你的问题,我想向你推荐这个讲座:
时间序列聚类 - 十年回顾 Saeed Aghabozorgi,Ali Seyed Shirkhorshidi,Teh Ying Wah http://www.sciencedirect.com/science/article/pii/S0306437915000733
本文概述了时间序列聚类中使用的(dis-)相似性度量。这里有一些摘录可以激励你真正阅读论文: