
Apriori 算法是一种用于挖掘关联规则的经典算法,由 R. Agrawal 和 R. Srikant 在1994年提出。Apriori 算法的主要思想是如果一个项集是频繁出现的,那么它的子项集一定是频繁出现的。基于这个思想,该算法通过逐层扫描数据集、计算支持度来发现频繁项集,然后再利用频繁项集构建关联规则。
基本原理
Apriori 算法的主要思想是通过逐层扫描数据集、计算支持度来发现频繁项集,再构建关联规则。
首先介绍关于算法的一些定义:
1、设为数据集,为所有项的集合,则一个包含个项的集合称为,其中;
2、满足最小支持度阈值的称为频繁;
3、表示项集在数据集中出现的支持度;
4、关联规则为,其中,且,表示有置信度为的关联规则,其中
Apriori 算法流程与公式如下:
设:为候选的集合,为频繁的集合,为最小支持度阈值,则:
1、生成;
2、计算每个候选在中出现的频次,筛选出:;
3、对于,利用频繁生成:
4、计算每个候选在中的出现频次,筛选出:;
5、重复步骤 3 和 4,直至没有新的频繁被发现。
Apriori 算法通过上述步骤挖掘出频繁项集,再基于频繁项集构建关联规则。该算法的时间复杂度较高,因为需要遍历所有项集,但清晰而简洁的思想使其成为经典算法之一。
Python 实现 Apriori 算法
可以使用 Python 中的 mlxtend 库来实现 Apriori 算法,具体步骤如下:
1、准备数据
transactions = [['Milk', 'Bread', 'Beer'], ['Milk', 'Bread', 'Diaper'], ['Milk', 'Beer'], ['Milk', 'Bread', 'Eggs'], ['Bread', 'Diaper', 'Beer'], ['Milk', 'Diaper', 'Beer'], ['Milk', 'Bread'], ['Milk', 'Eggs'], ['Bread', 'Eggs'], ['Beer', 'Diaper'], ['Milk', 'Cookies'], ['Bread'], ['Milk', 'Diaper'], ['Milk', 'Bread', 'Meat'], ['Milk', 'Beer', 'Meat'], ['Eggs'], ['Milk', 'Cheese', 'Beer'], ['Beer'], ['Milk', 'Bread', 'Cookies'], ['Milk', 'Cheese']]
数据集为一个列表数据,其中每个元素表示一笔交易,共有20笔交易数据,每笔交易包含了购买的哪些商品。
2、使用 TransactionEncoder 对数据进行编码
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
data = te.fit_transform(transactions)
df = pd.DataFrame(data, columns=te.columns_)
使用 TransactionEncoder 对数据进行编码,将列表中的每个商品都转换为一个二进制变量,表示该商品是否出现在该笔交易中。同时将编码后的数据转换为 DataFrame 类型,其中每行表示每笔交易,每列表示不同的商品。
3、执行 Apriori 算法,获取频繁项集
from mlxtend.frequent_patterns import apriori
frequent_items = apriori(df, min_support=0.3, use_colnames=True)
apriori 函数用于生成频繁项集,其中,参数 min_support 表示最小支持度阈值,即只有出现次数占比超过该值的商品组合才会被认为是频繁项集;参数 use_colnames 表示将列名转换为具体商品名称。
4、根据频繁项集生成关联规则
from mlxtend.frequent_patterns import association_rules
rules = association_rules(frequent_items, min_threshold=0.6)
association_rules 函数用于根据频繁项集生成关联规则,其中参数 min_threshold 表示最小置信度阈值,即只有置信度达到该值的关联规则才会被保留。
5、输出频繁项集和关联规则
print("频繁项集: \n", frequent_items)
print("关联规则: \n", rules)
输出结果如下:
频繁项集:
support itemsets
0 0.40 (Beer)
1 0.45 (Bread)
2 0.70 (Milk)
3 0.30 (Bread, Milk)
关联规则:
antecedents consequents antecedent support consequent support support confidence lift leverage conviction zhangs_metric
0 (Bread) (Milk) 0.45 0.7 0.3 0.666667 0.952381 -0.015 0.9 -0.083333
完整代码如下:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
transactions = [['Milk', 'Bread', 'Beer'], ['Milk', 'Bread', 'Diaper'], ['Milk', 'Beer'], ['Milk', 'Bread', 'Eggs'], ['Bread', 'Diaper', 'Beer'], ['Milk', 'Diaper', 'Beer'], ['Milk', 'Bread'], ['Milk', 'Eggs'], ['Bread', 'Eggs'], ['Beer', 'Diaper'], ['Milk', 'Cookies'], ['Bread'], ['Milk', 'Diaper'], ['Milk', 'Bread', 'Meat'], ['Milk', 'Beer', 'Meat'], ['Eggs'], ['Milk', 'Cheese', 'Beer'], ['Beer'], ['Milk', 'Bread', 'Cookies'], ['Milk', 'Cheese']]
te = TransactionEncoder()
data = te.fit_transform(transactions)
df = pd.DataFrame(data, columns=te.columns_)
frequent_items = apriori(df, min_support=0.3, use_colnames=True)
rules = association_rules(frequent_items, min_threshold=0.6)
print("频繁项集: \n", frequent_items)
print("关联规则: \n", rules)
结语
Apriori算法是一种经典的关联规则挖掘算法,通过逐层扫描数据集、计算支持度来发现频繁项集,并利用频繁项集构建关联规则。其思想简洁明了,在实际应用中具有广泛的应用。对于更大型的数据集,可以使用Apriori算法的变种算法以降低其时间复杂度,提升效率。




