apriori算法实例
时间: 2023-09-08 20:13:44 浏览: 252
假我们有一个包含多个交易的数据集,每个交易都列出了一些物品。我们想要使用 Apriori 算法来找出频繁项集(即在数据集中频繁出现的物品组合)。
下面是一个简单的示例数据集:
```
[{'葡萄酒', '尿布', '啤酒'},
{'葡萄酒', '尿布', '可乐'},
{'葡萄酒', '尿布', '啤酒', '鸡肉'},
{'葡萄酒', '尿布'},
{'啤酒', '鸡肉'}]
```
现在我们将使用 Apriori 算法来找出这个数据集中的频繁项集。
首先,我们定义一个项集是频繁项集,当且仅当它在数据集中出现的次数大于等于最小支持度。假设我们选择最小支持度为 2,即项集在数据集中出现的次数必须大于等于 2 才能被认为是频繁项集。
第一步是找到所有的单个物品项集,即所有可能的单个物品。
```
C1 = {'葡萄酒', '尿布', '啤酒', '可乐', '鸡肉'}
```
第二步是找到所有的频繁项集,即在数据集中出现次数大于等于最小支持度的项集。
为了找到频繁项集,我们需要遍历数据集,并计算每个可能项集的出现次数。我们从单个物品项集开始,计算它在数据集中出现的次数。如果它的出现次数大于等于最小支持度,则将其添加到频繁项集列表中。
为了计算项集在数据集中的出现次数,我们可以使用一个计数字典。对于每个交易,我们将其物品列表转换为一个集合,并遍历计数字典的所有键。如果某个键是当前集合的子集,则将该键的值加 1。
```
D = [{'葡萄酒', '尿布', '啤酒'},
{'葡萄酒', '尿布', '可乐'},
{'葡萄酒', '尿布', '啤酒', '鸡肉'},
{'葡萄酒', '尿布'},
{'啤酒', '鸡肉'}]
C1 = {'葡萄酒', '尿布', '啤酒', '可乐', '鸡肉'}
D_count = {}
for transaction in D:
for item in transaction:
if item not in D_count:
D_count[item] = 0
D_count[item] += 1
F1 = {itemset for itemset in C1 if D_count[itemset] >= 2}
```
这将给出第一层频繁项集:
```
F1 = {'葡萄酒', '尿布', '啤酒'}
```
接下来,我们需要使用 F1 来生成可能的二元组项集,并计算它们在数据集中的出现次数。如果它们的出现次数大于等于最小支持度,则将它们添加到频繁项集列表中。
为了生成二元组项集,我们可以使用 itertools 的 combinations 函数。然后我们可以遍历数据集并计算每个项集在数据集中的出现次数。
```
C2 = {frozenset(itemset) for itemset in combinations(F1, 2)}
D_count = {}
for transaction in D:
for itemset in C2:
if itemset.issubset(transaction):
if itemset not in D_count:
D_count[itemset] = 0
D_count[itemset] += 1
F2 = {itemset for itemset in C2 if D_count[itemset] >= 2}
```
这将给出第二层频繁项集:
```
F2 = {frozenset({'葡萄酒', '尿布'}),
frozenset({'葡萄酒', '啤酒'}),
frozenset({'尿布', '啤酒'})}
```
接下来,我们可以重复这个过程,直到没有更多的频繁项集为止。在每次迭代中,我们使用上一层的频繁项集来生成可能的下一层项集,并计算它们在数据集中的出现次数。
```
C3 = {itemset1.union(itemset2) for itemset1 in F2 for itemset2 in F2 if itemset1 != itemset2}
D_count = {}
for transaction in D:
for itemset in C3:
if itemset.issubset(transaction):
if itemset not in D_count:
D_count[itemset] = 0
D_count[itemset] += 1
F3 = {itemset for itemset in C3 if D_count[itemset] >= 2}
```
在这个示例中,F3 将为空集,因为没有项集出现的次数大于等于 2。
这就是 Apriori 算法的基本示例。在实际应用中,可能需要调整最小支持度、最小置信度和最小 Lift 值等参数,以便找到最有意义的频繁项集。
阅读全文