【问题标题】:Detection of similar sequences in ordered event lists检测有序事件列表中的相似序列
【发布时间】:2014-06-28 16:48:42
【问题描述】:

我有一堆(数百万)小型实验的日志。

每个日志都包含一个条目列表(数十到数百个)。每个条目是一个时间戳和一个事件 ID(有数千个事件 ID,每个可能在日志中出现多次):

1403973044 阿尔法 1403973045 测试版 1403973070 伽玛 1403973070 阿尔法 1403973098 三角洲

我知道一个事件以后可能会触发其他事件。

我正在研究这个数据集。我正在寻找在实验中经常发生的“稳定”事件序列。

有没有一种方法可以在不编写太多代码且不使用专有软件的情况下做到这一点?该解决方案应该具有足够的可扩展性,并且适用于大型数据集。

我认为这项任务类似于生物信息学的工作——在 DNA 中寻找序列等。只有我的任务在一个字母表中包含四个以上的字母......(更新,感谢@JayInNyc:蛋白质组学处理比我更大的字母表。)

(注意,顺便说一句,我事先不知道我想要我的序列有多稳定和相似,最小序列长度是多少等。我正在研究数据集,并且必须在旅途中弄清楚这一点。)

无论如何,对我可以使用的方法/工具/库有什么建议吗?


更新:对cmets中问题的一些回答:

稳定的序列:在实验中经常发现。 (多久才够?还不知道。看来我需要计算链的顶部,并丢弃最稀有的。)

相似序列: 看起来相似的序列。 “在你看来,序列‘A B C D E’和‘A B C E D’(序列的微小差异)是否相似?在你看来,序列‘A B C D E’和‘A B C 1 D E’(选定事件的发生顺序相同)是否也相似? " ——两个问题都是。更剧烈的突变可能也可以。同样,我希望能够计算一个顶部并丢弃最不相似的......

时间安排: 我现在可以放弃时间安排信息(但不是订单)。但是如果把它放在相似度指数公式中会很酷。


更新 2:预期输出。

最后,我想对最受欢迎的最长稳定链进行评级。所有三个因素的组合都会对评分的计算产生影响。

显然,这种评级中的链条是一组足够相似的链条。

链簇的合成示例:

α 测试版 伽玛 [垃圾] [垃圾] 三角洲

另一个:

α 测试版 伽马|zeta|ε 三角洲

(或者我现在没有想到的任何变体。)

所以,最终输出会是这样的(在这个例子中数字是完全随机的):

链簇ID |发现时间 |时间刺。因素 |链刺。因素 |长度 |分数 一个 | 12345 | 123 | 3 | 5 | 100000 乙| 54321 | 12 | 30 | 3 | 700000

【问题讨论】:

  • 我事先不知道我想要的序列有多稳定和相似 - 稳定是什么意思?两个序列是否相似,即使它们不相同?
  • 在决定它们是否相似时,只有事件的顺序很重要,还是它们之间的时间也很重要?根据您的说法,序列“A B C D E”和“A B C E D”(序列上的微小差异)是否相似?根据您的说法,序列“A B C D E”和“A B C 1 D E”(所选事件的发生顺序相同)是否也相似?如果您现在不知道,您是否仍然认为您可能想在以后确定这些序列是相似的?
  • 许多压缩算法的作用基本相同:寻找重复模式,它们越长,越频繁,越好 - 因为用代表它们的令牌替换它们会产生更好的节省。因此,我将研究常见的开源压缩,并让我从那些构建和检查模式树的代码部分中获得灵感。
  • @Bushmills 压缩算法如果受资源限制,有权丢弃序列信息……我宁愿保留我能做的一切。
  • @AlexanderGladysh 感谢您的更新!我只是想让这个问题更客观地回答。

标签: linux data-analysis sequencing


【解决方案1】:

过去一天左右,我一直在考虑这个设置——如何在 bash 等中以合理的可扩展方式进行设置。答案实际上是由您想要从数据中提取的关系信息驱动的,并且您当前拥有的数据集的表观大小。最精简的解决方案是将您的数据集加载到关系数据库中(MariaDB 会根据我的建议)

由于您的数据已经以相当干净的格式存在,您将数据放入数据库的选项是 2。(1) 如果文件在可用的 rowxcol 设置中包含数据,那么您可以简单地使用 LOAD DATA INFILE 来将您的数据导入数据库;或者(2)在while read line; do场景下用bash解析文件,解析数据得到你想要的表格格式的数据,使用mysql批处理方式直接将信息一次性加载到mysql中。 bash 命令的一般形式是mysql -uUser -hHost database -Bse "your insert command"

一旦进入关系数据库,您就可以使用适当的工具来以合理的方式对您的数据运行灵活的查询,而不是不断地编写/重写 bash sn-ps 来处理您的数据每次的方式都不一样。这可能是您正在寻找的最佳可扩展解决方案。前期工作多一些,但后续设置要好得多。

【讨论】:

  • 使用关系数据库没问题,谢谢。您能否建议一种方法来解决我的 SQL 问题而无需编写太多 (SQL) 代码?
【解决方案2】:

维基百科将算法定义为“精确步骤的精确列表”:“我正在寻找在实验中经常发生的“稳定”事件序列。没有定义的“稳定”和“经常足够”使为您提供算法的任务变得不可能。

所以我给你一个简单的计算长度为 2 的序列的频率。我将忽略时间戳。这是awk代码(pW代表previous Word,pcs代表pair counters):

#!/usr/bin/awk -f

BEGIN { getline; pW=$2; }

{ pcs[pW, $2]++; pW=$2; }

END {
    for (i in pcs)
        print i, pcs[i];
}

我复制了你的样本以展示一些有意义的外观

1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 alpha
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta

运行上面的代码给出:

gammaalpha 1
alphabeta 4
gammabeta 3
deltaalpha 3
betagamma 4
alphadelta 1
betadelta 3

可以解释为 alpha 后跟 beta 和 beta 后跟 gamma 是最常见的长度两个序列,每个序列在样本中出现 4 次。我想这就是你对经常发生的稳定序列的定义。

接下来是什么?

(1) 您可以轻松地将上面的代码用于长度为 N 的序列,并找到出现频率足够高的序列,您可以对第二列的输出进行排序 (-k2nr)。

(2) 要限制 N,您可以规定没有事件自行触发,这为您提供了一个截止点。或者您可以对时间戳设置一个限制,即连续事件之间的差异。

(3) 到目前为止,这些序列实际上是字符串,我在它们之间使用了精确匹配(CLRS 术语)。没有什么能阻止您改用您最喜欢的相似性度量:

{ pcs[CLIFY(pW, $2)]++; pW=$2; }

CLIFY 将是一个函数,它接受 k 个连续事件并将它们放入一个 bin 中,即也许您希望 ABCDE 和 ABDCE 进入同一个 bin。 CLIFY 当然可以将迄今为止的垃圾箱集作为附加参数。

选择 awk 是为了方便。它不会飞,但您可以轻松地并行运行它们。

不清楚你想用这个做什么,但谷歌搜索马尔可夫链,Mark V Shaney 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多