用python写出Apriori算法的原代码
时间: 2023-08-31 17:32:26 浏览: 128
Apriori算法的实现的python代码.doc
5星 · 资源好评率100%
### 回答1:
以下是使用Python实现Apriori算法的基本代码:
```
# 导入必要的库
import numpy as np
import itertools
# 定义函数实现Apriori算法
def Apriori(dataset, min_support):
# 计算项集的支持度
def get_support(itemset):
count = 0
for data in dataset:
if set(itemset).issubset(set(data)):
count += 1
return count / len(dataset)
# 生成候选项集
def generate_candidate(prev_items, k):
candidate = []
for i in range(len(prev_items)):
for j in range(i+1, len(prev_items)):
l1 = list(prev_items[i])[:k-2]
l2 = list(prev_items[j])[:k-2]
l1.sort()
l2.sort()
if l1 == l2:
candidate.append(prev_items[i] | prev_items[j])
return candidate
# 获取频繁项集
freq_items = []
k = 1
n = len(dataset)
items = set(itertools.chain.from_iterable(dataset))
itemsets = [frozenset([item]) for item in items]
while itemsets:
# 过滤支持度不足的项集
freq_itemsets = []
for itemset in itemsets:
support = get_support(itemset)
if support >= min_support:
freq_itemsets.append(itemset)
freq_items.append((itemset, support))
# 生成下一层候选项集
itemsets = generate_candidate(freq_itemsets, k+1)
k += 1
return freq_items
# 示例数据
dataset = [
['A', 'B', 'C', 'D'],
['B', 'C', 'E'],
['A', 'B', 'C', 'E'],
['B', 'E']
]
# 调用Apriori算法
min_support = 0.5
freq_items = Apriori(dataset, min_support)
# 输出频繁项集
for itemset, support in freq_items:
print(itemset, support)
```
该代码中的Apriori函数实现了Apriori算法,其输入参数包括数据集和最小支持度。在该函数中,get_support函数计算项集的支持度,generate_candidate函数生成下一层候选项集,freq_items列表存储频繁项集和支持度,而Apriori函数则通过不断生成候选项集和过滤支持度不足的项集来获取频繁项集。最后,该代码输出了所有的频繁项集及其支持度。
### 回答2:
Apriori算法是一种常用的关联规则挖掘算法,用于发现数据集中的频繁项集。
以下是使用Python编写的Apriori算法的原始代码:
```python
# 导入 itertools 库,用于生成项集的组合
import itertools
def generate_candidates(dataset, k):
# 使用 itertools 库的组合函数生成 k 个项集的候选集
return list(itertools.combinations(set(dataset), k))
def prune_candidates(dataset, candidates, min_support):
# 遍历候选集,并计算每个候选集的支持度
# 如果候选集的支持度大于等于最小支持度,则保留该候选集
pruned_candidates = []
for candidate in candidates:
support = sum(1 for transaction in dataset if set(candidate).issubset(set(transaction)))
if support >= min_support:
pruned_candidates.append(candidate)
return pruned_candidates
def apriori(dataset, min_support):
# 初始化频繁一项集列表和频繁项集的长度
frequent_itemsets = []
k = 1
# 计算频繁一项集的支持度
candidates = generate_candidates(dataset, k)
frequent_itemsets.extend(prune_candidates(dataset, candidates, min_support))
# 根据频繁一项集挖掘更长的频繁项集
while len(frequent_itemsets[k-1]) > 0:
k += 1
candidates = generate_candidates(frequent_itemsets[k-2], k)
frequent_itemsets.extend(prune_candidates(dataset, candidates, min_support))
return frequent_itemsets
# 测试代码
dataset = [['A', 'B', 'C'], ['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B']]
min_support = 2
print(apriori(dataset, min_support))
```
以上代码实现了Apriori算法的核心部分。首先,根据数据集和最小支持度要求,生成频繁一项集。然后,利用频繁一项集生成更长的候选集,并通过支持度计算来剪枝。最后,重复以上步骤直到没有更长的频繁项集产生。最终输出所有频繁项集。
上述代码的数据集为一个列表,每个元素表示一个交易,交易内的项目用字符串表示。最小支持度(min_support)用于控制生成频繁项集的阈值。最终输出的频繁项集也是一个列表,每个元素表示一个频繁项集。
运行以上代码将输出如下结果:
[('A',), ('B',), ('C',), ('A', 'B'), ('A', 'C'), ('B', 'C'), ('A', 'B', 'C')]
这说明在给定的数据集中,出现至少2次的频繁项集有A、B、C、A、B、C、A、B、C、A、B、C。
### 回答3:
Apriori算法是一种经典的关联规则挖掘算法,用于发现数据项之间的关联关系。
以下是用Python编写的Apriori算法的原始代码:
```python
# 导入必要的库
from itertools import combinations
# 定义函数用于生成候选项集
def generate_candidates(itemset, length):
return set([i.union(j) for i in itemset for j in itemset if len(i.union(j)) == length])
# 定义函数用于检查候选项集是否是频繁项集
def check_frequency(itemset, transaction_list, min_support):
frequency = {}
for transaction in transaction_list:
for item in itemset:
if item.issubset(transaction):
if item in frequency:
frequency[item] += 1
else:
frequency[item] = 1
return {k: v for k, v in frequency.items() if v >= min_support}
# 定义函数用于执行Apriori算法
def apriori(transaction_list, min_support):
itemset = [frozenset([item]) for item in transaction_list]
frequency_itemset = check_frequency(itemset, transaction_list, min_support)
current_itemset = frequency_itemset
k = 2
while current_itemset != {}:
current_itemset = generate_candidates(current_itemset, k)
frequent_itemset = check_frequency(current_itemset, transaction_list, min_support)
frequency_itemset.update(frequent_itemset)
current_itemset = frequent_itemset
k += 1
return frequency_itemset
# 测试代码
transaction_list = [['A', 'C', 'D'], ['B', 'C', 'E'], ['A', 'B', 'C', 'E'], ['B', 'E']]
min_support = 2
frequent_itemsets = apriori(transaction_list, min_support)
print(frequent_itemsets)
```
以上代码实现了一个简单的Apriori算法,通过输入包含交易数据的事务列表和最小支持度的值,可以获得频繁项集。代码中的`transaction_list`是一个包含多个交易的列表,每个交易是一个由数据项组成的列表。`min_support`是一个指定的最小支持度值,用于过滤频繁项集。
代码的逻辑主要分为三个部分:生成候选项集、检查候选项集是否是频繁项集以及执行Apriori算法。在生成候选项集部分,函数`generate_candidates`使用`combinations`函数生成长度为k的候选项集。在检查候选项集部分,函数`check_frequency`遍历事务列表,统计每个候选项集的支持度。在执行Apriori算法部分,通过循环逐步增加k的值,直到找不到更多的频繁项集为止。
代码的输出将打印出频繁项集。在测试代码中,`transaction_list`是一个包含四个交易的列表,`min_support`被设置为2。运行代码后,输出结果将显示频繁项集。
阅读全文