我有一个黑盒算法,可以分析时间序列并“检测”系列中的某些事件。它返回一个事件列表,每个事件包含一个开始时间和结束时间。事件不重叠。 我还有一个“真实”事件列表,每个事件的开始时间和结束时间都没有重叠。
我想比较两个列表,并匹配在特定时间容差(True Positives)内的检测到的和真实事件。复杂的是,算法可能会检测到那些不存在的事件(误报)或者可能会错过那里的事件(假阴性)。
什么算法可以最佳地配对来自两个列表的事件并使正确的事件不成对?我很确定我不是第一个解决这个问题的人,而且这种方法存在,但是我找不到它,也许是因为我不知道正确的术语。
速度要求: 列表将包含不超过几百个条目,速度不是主要因素。准确性更重要。在普通计算机上花费不到几秒钟的任何东西都可以。
答案 0 :(得分:2)
这是一个二次时间算法,它根据以下模型给出最大似然估计。设A1< ......<是真实的间隔,让B1< ......< Bn是报告的间隔。数量sub(i,j)是Ai变为Bj的对数似然。数量del(i)是删除Ai的对数似然。数量ins(j)是插入Bj的对数似然。到处做独立假设!我将选择sub,del和ins,以便每个i<我和每个j< j',我们有
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 - 就像动态程序一样。
动态程序以memoized递归函数score(i, j)
表示,它计算匹配A1,...,Ai与B1,...,Bj的最佳分数。调用树的根是score(m, n)
。可以修改它以在最优解中返回sub(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.
(向几十年前在生物信息学文献中发表过类似内容的毫无疑问的现存学者致歉。)