📜  数据挖掘中的广义序列模式(GSP)挖掘(1)

📅  最后修改于: 2023-12-03 14:54:55.318000             🧑  作者: Mango

数据挖掘中的广义序列模式(GSP)挖掘

在数据挖掘领域中,序列挖掘是一种热门的研究方向。广义序列模式(GSP)是一种用于发现数据集中重复出现的序列模式的算法。本文将介绍GSP算法的原理、流程和实现方式。

算法原理

GSP算法的核心思想是将数据集看作一系列序列,通过扫描数据集并根据支持度阈值发现频繁的序列模式。与传统的序列挖掘算法不同,GSP算法可以处理长度不同的序列,并且能够处理相对时间和绝对时间两种模式。

具体来说,GSP算法包含以下步骤:

  1. 扫描数据集:对数据集进行扫描,生成所有的候选序列(即长度为1的序列)。
  2. 计算支持度:遍历每个候选序列,在数据集中计算其出现的次数,获得其支持度。
  3. 剪枝:通过支持度筛选,删除低支持度的序列,减少计算时间。
  4. 发现频繁序列:针对已剪枝的序列,递归地生成高阶候选序列,并且计算其支持度,直到无法生成更多的序列为止。
算法流程

算法流程如下:

  1. 输入:数据集、支持度阈值。
  2. 扫描数据集,生成所有的一阶候选序列。
  3. 遍历数据集,计算每个候选序列的出现次数,获得支持度。
  4. 通过支持度阈值筛选低支持度的序列,进行剪枝操作。
  5. 针对已剪枝的序列,递归地生成高阶候选序列,计算其支持度。
  6. 重复进行剪枝和生成序列的步骤,直到无法生成更多的序列为止。
  7. 输出频繁序列模式。
代码实现

以下是Python语言下GSP算法的简单实现:

# 数据集
dataset = [['a', 'b', 'c', 'd'], ['a', 'c', 'd'], ['a', 'd'], ['b', 'c'], ['c', 'd']]

# 支持度阈值
minsup = 3

# 生成所有一阶序列
frequent_sequences = [{(item,): 0} for item in set([item for seq in dataset for item in seq])]
for seq in dataset:
    for candidate in frequent_sequences[0]:
        if candidate in seq:
            frequent_sequences[0][candidate] += 1

# 剪枝
frequent_sequences[0] = {sequence: count for sequence, count in frequent_sequences[0].items() if count >= minsup}

# 递归生成高阶序列
k = 2
while frequent_sequences[-1]:
    frequent_sequences.append({})
    for prev_sequence in frequent_sequences[k-2]:
        for curr_sequence in frequent_sequences[0]:
            sequence = tuple(sorted(set(prev_sequence + curr_sequence)))
            if len(sequence) == k and sequence not in frequent_sequences[k]:
                count = 0
                for seq in dataset:
                    seq_contains_sequence = False
                    for i in range(len(seq) - len(sequence) + 1):
                        if tuple(seq[i:i+len(sequence)]) == sequence:
                            seq_contains_sequence = True
                            break
                    if seq_contains_sequence:
                        count += 1
                frequent_sequences[k][sequence] = count
    frequent_sequences[k] = {sequence: count for sequence, count in frequent_sequences[k].items() if count >= minsup}
    k += 1

# 输出频繁序列模式
for sequences in frequent_sequences[:-1]:
    for sequence, count in sequences.items():
        print("{}: {}".format(",".join(sequence), count))

参考资料:

[1] Srikant R, Agrawal R. Mining sequential patterns: Generalizations and performance improvements[C]//Proceedings of the 5th International Conference on Extending Database Technology: Advances in Database Technology. Springer-Verlag, 1996: 3-17.