事件序列的聚类算法

数据挖掘 聚类 预测建模
2022-02-20 21:06:11

我正在使用事务数据集,并试图找到一个库(最好是 python),它可以聚集一组可能导致另一个事件的事件。有什么想法吗?

即假设我有一系列事件,如下所示:

A -> B -> C -> D
E -> A -> B -> C
A -> B -> B -> C
D -> C -> B

从这个(尽管是一个小数据集)可以推断出B通常会导致C

1个回答

当您想查找所有连续事件时,您只需计算一个条件概率。

您有一个事件序列数据集,并希望为每个输入找到最可能的结果,然后您可以决定如何总结您的结果,例如找到所有高概率(什么是高概率?通常高于基于用户的阈值!)和对它们进行排序以找出哪些事件“最有可能”导致哪些事件。

事件概率ei存在B导致事件ei+1存在C(正式地P(ei+1=C|ei=B)) 可以很容易地通过计数来计算。对于小型数据集,无需担心即可。我为您的玩具示例编写输出,然后建议使用一个小的 Python 代码片段作为入门:

P(B->C) = P(C|B) = 3/4 = 0.75
P(D->C) = P(C|D) = 1
P(C->D) = P(D|C) = 1/2 = 0.5
P(A->B) = P(B|A) = 1
P(C->B) = P(B|C) = 1/2 = 0.5

等等等等。

一个简单(并且非常未优化)的 Python 代码将是:

S = [['A', 'B', 'C', 'D'],
     ['E', 'A', 'B', 'C'],
     ['A', 'B', 'B', 'C'],
     ['D', 'C', 'B']]

event_set = set([ii for l in S for ii in l])
consecutives = []

for s in S:
    consecutives = consecutives + [(s[ii],s[ii+1]) for ii in range(len(s)-1)]

all_counter = Counter(consecutives)
first_event_cntr = {ii:sum([1 for c in consecutives if c[0]==ii]) for ii in event_set}

out_dict = {ii:all_counter[ii]/second_event_cntr[ii[0]] for ii in all_counter}

print(f'Set of all events consists of {sorted(event_set)}')
print(f'Number of times any two consecutive events happened:\n {all_counter}')
print(f'probability of each consecutive event pair is as bellow:\n{out_dict}')nter[ii]/second_event_cntr[ii[1]] for ii in all_counter}

输出在哪里

Set of all events consists of ['A', 'B', 'C', 'D', 'E']
Number of times any two consecutive events happened:
 Counter({('A', 'B'): 3, 
          ('B', 'C'): 3, 
          ('C', 'D'): 1, 
          ('E', 'A'): 1, 
          ('B', 'B'): 1, 
          ('D', 'C'): 1, 
          ('C', 'B'): 1})
probability of each consecutive event pair is as bellow:
{('A', 'B'): 1.0, ('B', 'C'): 0.75, ('C', 'D'): 0.5, ('E', 'A'): 1.0, ('B', 'B'): 0.25, ('D', 'C'): 1.0, ('C', 'B'): 0.5}

这里有一个问题是一些连续事件的唯一性。D作为第一个事件只出现一次,因此P(ei+1=C|ei=D)是 1,但是当数据很小时,您永远无法推断这是规则还是异常!一个想法是考虑一个事件作为“第一个事件”出现的次数,例如使用第一个事件的频率作为输出概率的置信度分数。

最后但并非最不重要的一点是,在这个答案中,我重新发明了轮子,因为我发现您可能是初学者。针对这个问题有不同的数据挖掘解决方案。如果一组事件是公证的大或不更新,那么像我一样制作输入输出对并使用任何分类算法(朴素贝叶斯是一个合适的选择,它是我在上面给你的解决方案的正式结构良好的版本) . 如果事件集非常大或被新事件更新,则将整个数据转换为有向图并对其进行任何聚类、挖掘和推理

更新

我忘了提及与您的问题最相关的 ML 算法,感谢rapaio的评论,我更新了答案。

马尔可夫链是基于last历史的序列模型n序列中的事件。它可用于根据需要按顺序预测下一个事件。关键是在数学上它又有点类似于我们上面所做的方法,但格式良好且理论上可靠,而不是一堆凌乱的 Python 代码!

马尔可夫链的有趣(但实际上与您无关)使用是在一个非常强大的概率图形模型中,称为隐马尔可夫模型(广泛称为 HMM)。传统的文本转语音机器大多基于 HMM(这就是为什么Rabiner 的教程仍然是开始学习的完美资源)。HMM 计算从状态转换的概率i陈述i+1在一个序列中,并且还发出一些统计上依赖于状态的观察的概率。很高兴您不需要后者,而您需要的第一个是基于马尔可夫链计算的。