我有一个黑盒算法,可以分析时间序列并“检测”系列中的某些事件.它返回一个事件列表,每个事件包含一个开始时间和结束时间.事件不重叠.
我还有一个“真实”事件列表,同样包含每个事件的开始时间和结束时间,而不是重叠.
我想比较两个列表,并匹配在特定时间容差内的检测到的和真实事件(真实肯定).复杂的是,该算法可以检测不存在的事件(误报)或可能错过那里的事件(假阴性).
什么是最佳配对来自两个列表的事件并使正确事件不成对的算法?我很确定我不是第一个解决这个问题的人,而且这种方法存在,但我找不到它,也许是因为我不知道正确的术语.
速度要求:
列表将包含不超过几百个条目,速度不是主要因素.准确性更重要.在普通电脑上花费不到几秒钟的任何东西都可以.
最佳答案 这是一个二次时间算法,它根据以下模型给出最大似然估计.设A1< ……
sub(i, j') + sub(i', j) <= max {sub(i, j ) + sub(i', j')
,del(i) + ins(j') + sub(i', j )
,sub(i, j') + del(i') + ins(j)
}.
这确保了间隔之间的最佳匹配是非交叉的,因此我们可以使用以下类似Levenshtein的动态程序.
动态程序呈现为记忆递归函数score(i,j),其计算匹配A1,…,Ai与B1,…,Bj的最佳分数.调用树的根是得分(m,n).可以修改它以在最优解中返回子(i,j)运算的序列.
score(i, j) | i == 0 && j == 0 = 0
| i > 0 && j == 0 = del(i) + score(i - 1, 0 )
| i == 0 && j > 0 = ins(j) + score(0 , j - 1)
| i > 0 && j > 0 = max {sub(i, j) + score(i - 1, j - 1)
,del(i) + score(i - 1, j )
,ins(j) + score(i , j - 1)
}
以下是sub,del和ins的一些可能定义.我不确定他们会不会有任何好处;您可能希望将它们的值乘以常数或使用2以外的幂.如果Ai = [s,t]且Bj = [u,v],则定义
sub(i, j) = -(|u - s|^2 + |v - t|^2)
del(i) = -(t - s)^2
ins(j) = -(v - u)^2.
(向几十年前在生物信息学文献中发表过类似内容的毫无疑问的现存学者致歉.)