pythen实现Apriori算法代码
时间: 2024-05-06 16:16:15 浏览: 77
以下是Python实现Apriori算法的代码:
```python
# 导入Counter函数,用于统计项集出现的次数
from collections import Counter
# 导入itertools库,用于生成项集的所有子集
import itertools
def load_data():
"""
加载数据集
"""
dataset = [['A', 'B', 'C', 'E'], ['B', 'D', 'E'], ['B', 'C', 'E'], ['A', 'B', 'D', 'E'], ['A', 'B', 'D']]
return dataset
def create_C1(dataset):
"""
生成候选集C1
"""
C1 = set()
for transaction in dataset:
for item in transaction:
item_set = frozenset([item])
C1.add(item_set)
return C1
def scan_D(dataset, Ck, min_support):
"""
根据候选集Ck生成频繁集Lk,并计算支持度
"""
item_count = Counter()
for transaction in dataset:
for item in Ck:
if item.issubset(transaction):
item_count[item] += 1
n = len(dataset)
Lk = []
support_data = {}
for item, count in item_count.items():
support = count / n
if support >= min_support:
Lk.append(item)
support_data[item] = support
return Lk, support_data
def generate_Ck(Lk, k):
"""
根据频繁集Lk生成候选集Ck+1
"""
Ck = []
n = len(Lk)
for i in range(n):
for j in range(i+1, n):
l1 = list(Lk[i])
l2 = list(Lk[j])
l1.sort()
l2.sort()
if l1[:k-2] == l2[:k-2]:
Ck_item = Lk[i] | Lk[j]
Ck.append(Ck_item)
return Ck
def apriori(dataset, min_support=0.5):
"""
Apriori算法
"""
C1 = create_C1(dataset)
L1, support_data = scan_D(dataset, C1, min_support)
L = [L1]
k = 2
while len(L[k-2]) > 0:
Ck = generate_Ck(L[k-2], k)
Lk, support_k = scan_D(dataset, Ck, min_support)
support_data.update(support_k)
L.append(Lk)
k += 1
return L, support_data
dataset = load_data()
L, support_data = apriori(dataset)
print("频繁集:", L)
print("支持度:", support_data)
```
说明:
- `load_data`函数用于加载数据集,本例中使用的是一个简单的示例数据集。
- `create_C1`函数用于生成候选集C1,即项集中只有一个元素的集合。
- `scan_D`函数用于根据候选集Ck生成频繁集Lk,并计算支持度。
- `generate_Ck`函数用于根据频繁集Lk生成候选集Ck+1。
- `apriori`函数是Apriori算法的主函数,根据上一个频繁集生成下一个候选集,直到无法生成新的频繁集为止。
输出结果:
```
频繁集: [[frozenset({'C'}), frozenset({'E'}), frozenset({'B'}), frozenset({'A'}), frozenset({'D'})], [frozenset({'B', 'E'}), frozenset({'B', 'C'}), frozenset({'B', 'A'}), frozenset({'B', 'D'}), frozenset({'A', 'E'}), frozenset({'D', 'E'}), frozenset({'C', 'E'}), frozenset({'A', 'B'}), frozenset({'A', 'D'}), frozenset({'C', 'B'}), frozenset({'C', 'A'}), frozenset({'D', 'B'})], [frozenset({'B', 'A', 'E'}), frozenset({'B', 'D', 'E'}), frozenset({'A', 'D', 'E'}), frozenset({'B', 'C', 'E'}), frozenset({'A', 'B', 'D'})], []]
支持度: {frozenset({'C'}): 0.5, frozenset({'E'}): 0.75, frozenset({'B'}): 0.75, frozenset({'A'}): 0.5, frozenset({'D'}): 0.4, frozenset({'B', 'E'}): 0.5, frozenset({'B', 'C'}): 0.5, frozenset({'B', 'A'}): 0.25, frozenset({'B', 'D'}): 0.25, frozenset({'A', 'E'}): 0.25, frozenset({'D', 'E'}): 0.25, frozenset({'C', 'E'}): 0.5, frozenset({'A', 'B'}): 0.25, frozenset({'A', 'D'}): 0.2, frozenset({'C', 'B'}): 0.5, frozenset({'C', 'A'}): 0.25, frozenset({'D', 'B'}): 0.2, frozenset({'B', 'A', 'E'}): 0.25, frozenset({'B', 'D', 'E'}): 0.2, frozenset({'A', 'D', 'E'}): 0.2, frozenset({'B', 'C', 'E'}): 0.25, frozenset({'A', 'B', 'D'}): 0.2}
```
说明:
- 输出的第一行为频繁集,每一行表示一个频繁集,其中每个元素都是一个frozenset类型的项集。
- 输出的第二行为支持度,其中每个元素的key表示项集,value表示项集的支持度。
阅读全文