单序列的序列模式挖掘

机器算法验证 机器学习 无监督学习 序列分析
2022-03-14 01:11:27

有人可以给我一个关于在单个序列中找到频繁模式的好方法的提示吗?

例如有单个序列

3 6 1 2 7 3 8 9 7 2 2 0 2 7 2 8 4 8 9 7 2 4 1 0 3 2 7 2 0 3 8 9 7 2 0

我正在寻找一种可以检测此有序序列中频繁模式的方法:

3 6 1 [2 7] 3 [8 9 7 2] 2 0 [2 7] 2 8 4 [8 9 7 2] 4 1 0 3 [2 7] 2 0 3 [8 9 7 2] 0

其他信息也会很有趣,例如:

  • 7 出现在 2 之后的概率是多少
  • 当每个数字都有一个时间戳分配给它时,7在2之后出现的估计时间间隔是多少

我发现的顺序模式挖掘方法需要多个序列,但我有一个大序列,我想检测规律性。

谢谢你的帮助!

4个回答

计算 N-gram 的直方图和适当级别的阈值。在 Python 中:

from scipy.stats import itemfreq
s = '36127389722027284897241032720389720'
N = 2 # bi-grams
grams = [s[i:i+N] for i in xrange(len(s)-N)]
print itemfreq(grams)

N-gram 计算(第三和第四行)来自这个答案。

示例输出是

[['02' '1']
 ['03' '2']
 ['10' '1']
 ['12' '1']
 ['20' '2']
 ['22' '1']
 ['24' '1']
 ['27' '3']
 ['28' '1']
 ['32' '1']
 ['36' '1']
 ['38' '2']
 ['41' '1']
 ['48' '1']
 ['61' '1']
 ['72' '5']
 ['73' '1']
 ['84' '1']
 ['89' '3']
 ['97' '3']]

所以 72 是您的示例中最常见的两位数子序列,总共出现五次。您可以为所有人运行代码N你有兴趣。

我认为您可以使用Apriori 算法计算序列中每个单个元素出现的次数。如果计数大于某个阈值ε那么这个项目是频繁的。然后计算频繁项对的数量。继续频繁次数4-元组等

您可以使用以下内容。据我所知,SPADE 对多个序列也使用了类似的东西。

36127389722027284897241032720389720

首先,您需要收集序列中每个项目的位置。

长度:1

{
    0: [11,23,28,34], //4
    1: [2,22], //2
    2: [3,9,10,12,14,20,25,27,33], //9
    3: [0,5,24,29], //4
    4: [16,21], //2
    5: [], //0
    6: [1], //1
    7: [4,8,13,19,26,32], //6
    8: [6,15,17,30], //4
    9: [7,18,31] //3
}

然后根据您为频繁序列选择的最小支持检查这些项目的支持。

min_sup: 3

{
    0: [11,23,28,34], //4
    2: [3,9,10,12,14,20,25,27,33], //9
    3: [0,5,24,29], //4
    7: [4,8,13,19,26,32], //6
    8: [6,15,17,30], //4
    9: [7,18,31] //3
}

在您的情况下,您需要找到具有连续位置的项目。您也可以使用通配符,但在这种情况下,位置差异将超过 1,您会发现更多的候选人。

长度:2

{
    00: [], //0
    02: [[11,12]], //1
    03: [[23,24],[28,29]], //2
    07: [], //0
    08: [], //0
    09: [], //0
    20: [[33,34]], //1
    22: [[9,10]], //1
    23: [], //0
    27: [[3,4],[12,13],[25,26]], //3
    28: [], //0
    29: [], //0
    30: [], //0
    32: [[24,25]], //1
    33: [], //0
    37: [], //0
    38: [[5,6],[29,30]], //2
    39: [], //0
    70: [], //0
    72: [[8,9],[13,14],[19,20],[26,27],[32,33]], //5
    73: [[4,5]], //1
    77: [], //0
    78: [], //0
    79: [], //0
    80: [], //0
    82: [], //0
    83: [], //0
    87: [], //0
    88: [], //0
    89: [[6,7],[17,18],[30,31]], //3
    90: [], //0
    92: [], //0
    93: [], //0
    97: [[7,8],[18,19],[31,32]], //3
    98: [], //0
    99: [] //0
}

min_sup: 3

{
    27: [[3,4],[12,13],[25,26]], //3
    72: [[8,9],[13,14],[19,20],[26,27],[32,33]], //5
    89: [[6,7],[17,18],[30,31]], //3
    97: [[7,8],[18,19],[31,32]], //3
}

您可以尝试根据结尾组合上面的序列,或者您可以只检查位置。

长度:3

{
    272: [[12,13,14],[25,26,27]], //2
    727: [], //0
    897: [[6,7,8],[17,18,19],[30,31,32]], //3
    972: [[7,8,9],[18,19,20],[31,32,33]] //3
}

min_sup: 3

{
    897: [[6,7,8],[17,18,19],[30,31,32]], //3
    972: [[7,8,9],[18,19,20],[31,32,33]] //3
}

长度:4

{
    8972: [[6,7,8,9],[17,18,19,20],[30,31,32,33]] //3
}

min_sup: 3

{
    8972: [[6,7,8,9],[17,18,19,20],[30,31,32,33]] //3
}

只有一种模式,不能和自己结合,所以挖矿就完成了。

{
    27: [[3,4],[12,13],[25,26]], //3
    72: [[8,9],[13,14],[19,20],[26,27],[32,33]], //5
    89: [[6,7],[17,18],[30,31]], //3
    97: [[7,8],[18,19],[31,32]], //3
    897: [[6,7,8],[17,18,19],[30,31,32]], //3
    972: [[7,8,9],[18,19,20],[31,32,33]] //3
    8972: [[6,7,8,9],[17,18,19,20],[30,31,32,33]] //3
}

如果我们排除 8972 的子模式。

{
    27: [[3,4],[12,13],[25,26]], //3
    72: [[13,14],[26,27]], //2
    8972: [[6,7,8,9],[17,18,19,20],[30,31,32,33]] //3
}

min_sup: 3

{
    27: [[3,4],[12,13],[25,26]], //3
    8972: [[6,7,8,9],[17,18,19,20],[30,31,32,33]] //3
}

我认为这与您找到的模式相同。

361[27]3[8972]20[27]284[8972]4103[27]203[8972]0

保留 72 的另一种选择,因为它作为 8972 的子序列出现 3 次,另外 2 次独立于 8972。我认为这应该取决于您是否允许重叠。

361[27]3[89(72)]202(72)84[89(72)]4103[2(7]2)03[89(72)]0

注意:我不认为顺序模式挖掘被认为是机器学习。

当涉及到单个序列时,剧集挖掘适合需要。当您想知道一个元素跟随另一个元素的概率时,顺序关联分析,例如滞后顺序分析(Bakeman & Gottman,1997:观察交互:顺序分析简介)就可以满足需求。