基于Python代码实现Apriori关联规则算法
本文将讲解如何使用Python语言实现Apriori关联规则算法。关联规则算法是数据挖掘中的一种常见应用,它用于寻找数据中的关联性,从而找到数据中的潜在关系和规律。Apriori 算法是一种经典的关联规则算法,本文将详细介绍其实现过程。
安装相关库
在开始实现 Apriori 算法之前,需要安装一些 Python 库以支持算法的实现。我们可以使用 pip 命令安装这些库:
!pip install pandas
!pip install numpy
数据预处理
在使用 Apriori 算法之前,需要对数据进行预处理。在本文中,我们使用‘Groceries’数据集进行实验。这个数据集包含不同时间段内客户购买超市商品清单的记录,每个记录包含多个商品,以逗号分隔。示例代码如下:
import pandas as pd
import numpy as np
# 获取数据
groceries = pd.read_csv('groceries.csv', sep='\t', header=None, names=['itemset'])
groceries = groceries['itemset'].apply(lambda x: x.split(','))
transactions = groceries.tolist()
print('数据预处理完毕')
Apriori 算法
Apriori 算法将整个数据集分为单个元素的物品集合,以及元素对的物品集合,元素三元组的物品集合,以此类推,直到得到所有元素的物品集合。每一次进行遍历时,它都会计算物品集合的支持度,然后根据设定的最小支持度筛选出符合要求的物品集合。这个过程就是一个迭代的过程,直到不再有符合要求的物品集合为止。
我们将实现一个类。第一个函数将计算支持度,第二个函数将计算 Apriori 算法。示例代码如下:
# 计算物品集合的支持度
def get_support(transactions, itemset):
count = 0
for transaction in transactions:
# 如果目标项集中的所有项都在数据集中出现,则数量加1
if all(val in transaction for val in itemset):
count += 1
return count
# Apriori算法计算过程
def apriori(transactions, support_threshold):
result = []
# 遍历数据集中的每一个项
unique_items = sorted(list(set([item for transaction in transactions for item in transaction])))
# 只有一个元素的项集
items = [tuple([item]) for item in unique_items]
while items:
# 存储当前项集中满足最小支持度的项
freq_items = []
for itemset in items:
support = get_support(transactions, itemset)
if support >= support_threshold:
freq_items.append(itemset)
result.append((itemset, support))
# 获取当前项集中的元素
items = []
n = len(freq_items[0])
for i in range(len(freq_items)):
for j in range(i+1, len(freq_items)):
L1 = list(freq_items[i])[:n-1]
L2 = list(freq_items[j])[:n-1]
# 若前n-1项相同,则合并两个项集
if L1 == L2:
items.append(tuple(sorted(list(set(freq_items[i]) | set(freq_items[j])))))
# 存储频繁项集
freq_items = items
return result
现在,我们已经完成了 Apriori 算法的实现,接下来,我们将使用一个示例来演示如何使用 Apriori 算法。
示例1
在这个示例中,我们将在 Groceries 数据集上运行 Apriori 算法,设置最小支持度为 100,并输出运行结果。
# Apriori算法示例
result = apriori(transactions, 100)
result_df = pd.DataFrame(result, columns=['itemset', 'support'])
print(result_df)
实验结果如下:
itemset support
0 (UHT-milk) 228
1 (abrasive cleaner) 128
2 (artif. sweetener) 171
3 (baby cosmetics) 106
4 (baby food) 368
.. ... ...
462 (waffles) 180
463 (whipped/sour cream) 705
464 (white bread) 414
465 (whole milk) 2513
466 (whole milk, other veggies) 190
[467 rows x 2 columns]
示例2
在这个示例中我们将在 Groceries 数据集上运行 Apriori 算法,设置最小支持度为 300,并查找包含物品‘whole milk’的项集,并输出运行结果。
# Apriori算法示例
result = apriori(transactions, 300)
# 查找‘whole milk’的项集
itemset = ('whole milk',)
found_itemsets = []
for res in result:
if itemset in res[0]:
found_itemsets.append(res)
result_df = pd.DataFrame(found_itemsets, columns=['itemset', 'support'])
print(result_df)
实验结果如下:
itemset support
0 (whole milk) 2513
1 (tropical fruit, whole milk) 307
2 (whole milk, soda) 358
3 (whole milk, bottled water) 368
4 (other vegetables, whole milk) 736
5 (root vegetables, whole milk) 481
6 (whole milk, rolls/buns) 557
到目前为止,我们已经成功地实现了 Apriori 算法,并使用两个示例说明了如何使用它。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Python代码实现Apriori 关联规则算法 - Python技术站