【问题标题】:Pattern in continuous sequence data连续序列数据中的模式
【发布时间】:2016-01-16 18:58:09
【问题描述】:

假设我有一个事件列表。例如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

【问题讨论】:

  • 我认为这个问题太宽泛了,但作为第一个猜测,你可能想看看iSAX
  • 我只想在那个大流中找到各种长度的频繁模式。经过一番搜索,我在互联网上找不到任何东西。
  • "String" compression 算法试图利用(至少在局部)可预测的序列概率不均匀性。
  • @greybeard,我没有完全理解你。请您再解释一下。
  • 据我所知,J.A. Storer 是使用 Original Pointer Macros (OPM)、External Pointer Macros、它们的组合和 引入“文本压缩”概念的人压缩指针宏(EPM、OEPM、CPM)——所有这些的最佳使用已被证明是棘手的。 (宏:(开始,长度))。在变化和限制中,在一个方向上使用原始指针只允许从另一端开始的线性解决方案;有关来自后缀树的可能目标的信息。 (几十年过去了,后缀数组可能是今天的选择。)

标签: algorithm data-mining frequency sequence-analysis


【解决方案1】:

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

【讨论】:

  • 它非常接近于为所有可能的子字符串构建一个后缀树,然后使用它来检查模式。实际上,这就是我正在考虑的。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 一个非常大的序列不会花费很多时间。仅生成所有可能的子字符串将花费指数时间。
  • 有 n^2 个子串。我觉得可行。
  • 这似乎可行,但我需要存储每个序列及其出现频率以选择最佳序列。
【解决方案3】:

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

如果你寻找这个主题,你会发现几十种算法。

有 GSP、SPADE、PrefixSpan 等等。

【讨论】:

  • 不能使用GSP。或 SPADE,因为它们适用于彼此分离的已经出现的序列。不是一个大的连续序列。
  • 例如,您可以在该序列的 ngram 上运行它。
  • 我没听懂你,你能否通过编辑你的答案来详细说明一下。
【解决方案4】:

这是一个简单的算法(在 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;
    }
}

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

【讨论】:

  • 是的,这已经被建议了。但我想要比蛮力更有效的东西。
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
相关资源
最近更新 更多