apriori算法实例代码
时间: 2023-09-12 10:03:33 浏览: 95
Apriori 算法 实例
3星 · 编辑精心推荐
以下是一个简单的Python实现apriori算法的例子:
```python
def apriori(dataset, min_support=0.5):
"""
apriori算法实现
:param dataset: 数据集
:param min_support: 最小支持度
:return: 频繁项集列表
"""
# 获取所有不重复的元素
C1 = create_C1(dataset)
# 转化为列表形式,便于后续操作
D = list(map(set, dataset))
# 计算第一层的频繁项集和支持度
L1, support_data = scan_D(D, C1, min_support)
# 将所有的频繁项集放入列表L中
L = [L1]
k = 2
while len(L[k-2]) > 0:
# 生成候选项集
Ck = generate_ck(L[k-2], k)
# 计算候选项集的支持度
Lk, support_k = scan_D(D, Ck, min_support)
# 将候选项集的支持度加入到support_data中
support_data.update(support_k)
# 将频繁项集添加到L中
L.append(Lk)
k += 1
return L, support_data
```
该实现中使用了以下辅助函数:
```python
def create_C1(dataset):
"""
创建第一层的频繁项集
:param dataset: 数据集
:return: 频繁项集列表
"""
C1 = []
for transaction in dataset:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
def scan_D(D, Ck, min_support):
"""
计算候选项集的支持度
:param D: 数据集
:param Ck: 候选项集
:param min_support: 最小支持度
:return: 频繁项集和支持度
"""
support_data = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not in support_data:
support_data[can] = 1
else:
support_data[can] += 1
num_items = float(len(D))
ret_list = []
support_data_new = {}
for key in support_data:
support = support_data[key] / num_items
if support >= min_support:
ret_list.append(key)
support_data_new[key] = support
return ret_list, support_data_new
def generate_ck(Lk, k):
"""
生成候选项集
:param Lk: k-1层的频繁项集
:param k: 当前层数
:return: 候选项集列表
"""
ret_list = []
len_lk = len(Lk)
for i in range(len_lk):
for j in range(i+1, len_lk):
l1 = list(Lk[i])[:k-2]
l2 = list(Lk[j])[:k-2]
l1.sort()
l2.sort()
if l1 == l2:
ret_list.append(Lk[i] | Lk[j])
return ret_list
```
这些辅助函数分别用于创建第一层的频繁项集、计算候选项集的支持度以及生成候选项集。apriori函数本身则是一个迭代过程,从第一层开始不断生成新的频繁项集,直到没有新的频繁项集产生为止。最终返回所有的频繁项集和它们的支持度。
阅读全文