不同长度的时间序列数据的相似性度量

时间:2014-04-23 15:57:47

标签: algorithm dynamic-programming

考虑以下数据。

Groundtruth      |  Dataset1         |  Dataset2         |  Dataset3
Datapoints|Time  |  Datapoints|Time  |  Datapoints|Time  |  Datapoints|Time
    A     |0     |      a     |0     |      a     |0     |      a     |0
    B     |10    |      b     |5     |      b     |5     |      b     |13
    C     |15    |      c     |12    |      c     |12    |      c     |21
    D     |25    |      d     |22    |      d     |14    |      d     |30
    E     |30    |      e     |30    |      e     |17    |
                 |                   |      f     |27    |
                 |                   |      g     |30    |

可视化(如每个标识符之间的数量):

Time ->         
Groundtruth: A|----------|B|-----|C|----------|D|-----|E
Dataset1:    a|-----|b|-------|c|----------|d|--------|e
Dataset2:    a|-----|b|-------|c|--|d|---|e|----------|f|---|g
Dataset3:    a|-------------|b|--------|c|---------|d

我的目标是将数据集与groundtruth进行比较。我想创建一个函数,在一个数据集和groundtruth之间生成相似性度量,以评估我的分割算法有多好。显然,我希望分割算法由相同数量的数据点(片段)组成,但是如数据集所示,这不是保证,也不是提前知道数据点的数量。

我已经创建了一个Jacard Index来生成一个基本的评估分数。但我现在正在研究一种惩罚数据点的丰度/缺失以及限制到正确数据点的距离的评估方法。也就是说,b不必匹配B,它只需要接近正确的数据点。

我试图研究一种动态编程方法,其中我引入了删除或添加数据点的惩罚以及移动到最近数据点的距离惩罚。我正在努力,因为: 1.我需要将每个数据点限制为一个正确的数据点 2.根据需要确定要删除的数据点 3.对如何实施DP算法普遍缺乏了解

任何人都有想法如何做到这一点?如果动态编程是要走的路,我会喜欢一些链接建议以及如何去做它的一些指示。

1 个答案:

答案 0 :(得分:1)

基本上,您可以修改Levenshtein编辑距离的DP以计算问题的距离。 Levenshtein DP相当于在非循环有向图中找到最短路径,看起来像这样

*-*-*-*-*
|\|\|\|\|
*-*-*-*-*
|\|\|\|\|
*-*-*-*-*

其中弧从左到右和从上到下定向。 DAG具有编号为0到m的行和编号为0到n的列,其中m是第一个序列的长度,n是第二个序列的长度。用于将第一序列改变为第二序列的指令列表对应于从左上到右下的路径的一对一(成本和全部)。从(i,j)到(i + 1,j)的弧对应于从第一序列中删除i th 元素的指令。从(i,j)到(i,j + 1)的弧对应于从第二序列添加j th 元素的指令。来自(i,j)的弧对应于修改第一序列的i th 元素,使其成为第二序列的j th 元素。

为问题得到二次时算法所需要做的就是定义(i)添加数据点(ii)删除数据点(iii)修改数据点成为另一个数据点然后计算最短的成本其中一个ways described by Wikipedia中的DAG上的路径。

(顺便说一下,这个算法假设做出相互“交叉”的修改永远不会有利可图。在一个相对温和的假设中,修改成本,这个假设是多余的。如果你对更多的细节感兴趣,请参阅我的这个答案:Approximate matching of two lists of events (with duration)。)