连续序列数据中的模式

Pattern in continuous sequence data

假设我有一个事件列表。例如 A, D, T, H, U, A, B, F, H, ....

我需要的是找到在完整序列中出现的频繁模式。在这个问题中,我们不能使用像先验或 fp 增长这样的传统算法,因为它们需要单独的项目集。而且,我无法将此流分成更小的集合。

知道哪种算法适合我吗?


编辑

例如,对于序列 A, D, T, H, U, A, D, T, H, T, H, U, A, H, T, Hmin_support = 2

频繁的模式将是

Of length 1 --> [A, D, T, H, U]
Of length 2 --> [AD, DT, TH, HU, UA, HT]
Of length 3 --> [ADT, DTH, THU, HUA]
Of length 4 --> [ADTH, THUA]
No sequences of length 5 and further

您可以生成所有可能的子字符串,例如:

A
AD
ADT
ADTH
...
D
DT
DTH
...

现在的问题是,较小子串的元素顺序是否重要。

如果没有,您可以尝试 运行 标准关联挖掘算法。

如果是,那么顺序在整个序列及其子序列中都很重要,这使得这是一个信号处理或时间序列问题。但即使顺序很重要,我们也可以继续以这种方式分析所有子串。我们可以尝试匹配它们,精确匹配或模糊匹配之类的。

这是频繁项集挖掘的一个特殊变体,称为顺序模式挖掘

如果您查找此主题,您会发现几十种算法。

有 GSP、SPADE、PrefixSpan 等等。

这是一个简单的算法(在 JavaScript 中),它将生成所有子字符串的计数。

记录子字符串在字典中出现的次数。遍历流中每个可能的子字符串,如果它已经在字典中,则将其递增,否则将其值添加为 1.

var stream = 'FOOBARFOO';
var substrings = {};
var minimumSubstringLength = 2;

for (var i = 1; i <= stream.length; i++) {
    for (var j = 0; j <= i - minimumSubstringLength; j++) {
        var substring = stream.substring(j, i);
        substrings[substring] ? substrings[substring]++ : substrings[substring] = 1;
    }
}

然后使用排序算法按字典的值对字典进行排序。

您可以尝试使用通配符 and/or 的 aho-corasick 算法,仅对所有子字符串进行处理。 Aho-corasick 基本上是一个有限状态机,它需要一个字典,然后它可以非常快速地在搜索字符串中找到多个模式。您可以使用 trie 和广度优先搜索构建有限状态机。这是一个很好的动画示例:http://blog.ivank.net/aho-corasick-algorithm-in-as3.html。所以您基本上需要 2 个步骤:构建有限状态机并搜索字符串。