Apriori算法是一种用于挖掘频繁项集的经典算法,通常需要多次扫描数据集来完成挖掘。下面通过一个简单的示例来解释Apriori算法的三次扫描过程。
假设我们有以下交易数据集,其中每一行代表一次购物交易,包含不同的商品:
Transaction 1: {A, B, D}
Transaction 2: {B, C, E}
Transaction 3: {A, B, C, E}
Transaction 4: {B, E}
Transaction 5: {A, C, E}
现在,我们想要找到这个数据集中的频繁项集,假设我们设置最小支持度阈值为2,也就是说,一个项集出现的次数必须至少为2次才能被认为是频繁项集。
第一次扫描(扫描数据集,生成频繁1项集):
在第一次扫描中,我们统计每个单个商品的出现次数,以生成频繁1项集。
频繁1项集L1:
- {A} 出现3次
- {B} 出现4次
- {C} 出现3次
- {D} 出现1次
- {E} 出现4次
然后,我们筛选掉不满足最小支持度阈值的项集,剩下的频繁1项集L1:{A, B, C, E}。
第二次扫描(扫描数据集,生成频繁2项集):
在第二次扫描中,我们生成候选2项集并计算它们的支持度,然后筛选出频繁2项集。
候选2项集C2:
- {A, B}
- {A, C}
- {A, E}
- {B, C}
- {B, E}
- {C, E}
我们扫描数据集,计算每个候选2项集的支持度。
频繁2项集L2:
- {A, B} 出现2次
- {A, C} 出现2次
- {A, E} 出现2次
- {B, C} 出现2次
- {B, E} 出现3次
- {C, E} 出现2次
然后,筛选掉不满足最小支持度阈值的项集,剩下的频繁2项集L2是:{A, B}、{A, C}、{A, E}、{B, C}、{B, E}、{C, E}。
第三次扫描(扫描数据集,生成频繁3项集):
在第三次扫描中,我们生成候选3项集并计算它们的支持度,然后筛选出频繁3项集。
在第三次扫描中,我们生成候选3项集的方法是通过将频繁2项集连接(join)来创建候选3项集,然后进行剪枝(prune)以保证生成的候选3项集仍然是频繁的。
具体的步骤如下:
- 连接(Join):
- 对于两个频繁2项集 {A, B} 和 {A, C},如果它们的前k-1项相同(即{A}相同),则可以连接它们,生成一个候选3项集 {A, B, C}。
例如:
{A, B} 和 {A, C} 连接后生成 {A, B, C}。
这个连接的过程会生成候选3项集的候选集合,但不保证所有生成的3项集都是频繁的。
- 剪枝(Prune):
- 对于新生成的候选3项集 {A, B, C},我们需要检查它的所有子集,确保它们都是频繁的。如果它的任何一个子集不是频繁的,那么 {A, B, C} 也不会是频繁的,因此需要将它剪枝。
例如:
对于 {A, B, C},我们需要检查 {A, B}、{A, C} 和 {B, C} 是否都是频繁的。
剪枝的过程保证了生成的候选3项集中只有那些在数据集中出现频率高于最小支持度阈值的项集会被保留。
通过连接和剪枝的过程,我们可以在第三次扫描中生成频繁3项集,然后计算它们的支持度,以确定哪些是频繁的,哪些不是。这样就完成了Apriori算法的第三次扫描。
候选3项集C3:
- {A, B, C}
- {A, B, E}
- {A, C, E}
- {B, C, E}
我们扫描数据集,计算每个候选3项集的支持度。
频繁3项集L3:
- {A, B, E} 出现2次
只有{A, B, E}满足最小支持度阈值,所以它是频繁3项集。
这就是Apriori算法的三次扫描过程,最终找到的频繁项集为{A, B}、{A, C}、{A, E}、{B, C}、{B, E}、{C, E}和{A, B, E}。这些项集在给定的最小支持度阈值下都出现频繁。这个算法的关键点是通过候选项集的生成和支持度计算来筛选出频繁项集,从而减少计算的复杂度。