算法思路简介
Apriori
根据原始的销售表:
- 第一步:列出所有元素,所有元素独立组成一个集合,计算每个集合的支持度。然后根据最小支持度的阈值剔除掉小的支持度的集合。
- 第二步:每个集合都增加一个与原有集合中没有的元素,构成多个新的集合,计算每个集合的支持度。然后根据最小支持度的阈值剔除掉小的支持度的集合。
- 依次循环,直到所有计算支持度的集合都被阈值卡掉。
详细的可以参考这个比较形象的描述:Apriori Algorithm
案例
使用mlxtend
计算Apriori
:
github地址:https://github.com/rasbt/mlxtend
Mlxtend Doc:https://rasbt.github.io/mlxtend/
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder # 传入模型的数据需要满足特定的格式,可以用这种方法来转换为bool值,也可以用函数转换为0、1
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
shopping_list = [['豆奶', '莴苣'],
['莴苣', '尿布', '葡萄酒', '甜菜'],
['豆奶', '尿布', '葡萄酒', '橙汁'],
['莴苣', '豆奶', '尿布', '葡萄酒'],
['莴苣', '豆奶', '尿布', '橙汁']]
shopping_df = pd.DataFrame(shopping_list)
df_arr = shopping_df.stack().groupby(level=0).apply(list).tolist()
te = TransactionEncoder() # 定义模型
df_tf = te.fit_transform(df_arr)
df = pd.DataFrame(df_tf, columns=te.columns_)
# 求频繁项集:
frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True) # use_colnames=True 表示使用元素名字,默认的False使用列名代表元素
frequent_itemsets.sort_values(by='support', ascending=False, inplace=True) # 频繁项集可以按支持度排序
print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) >= 2]) # 选择长度 >=2 的频繁项集
# 求关联规则:
association_rule = association_rules(frequent_itemsets, metric='confidence',
min_threshold=0.9) # metric可以有很多的度量选项,返回的表列名都可以作为参数
association_rule.sort_values(by='leverage', ascending=False, inplace=True) # 关联规则可以按leverage排序
print(association_rule)
参考资料
Apriori算法原理总结:https://www.cnblogs.com/pinard/p/6293298.html
WikiMapia Association rule learning:https://en.wikipedia.org/wiki/Association_rule_learning
一步步教你轻松学关联规则Apriori算法:https://bainingchao.github.io/2018/09/27/%E4%B8%80%E6%AD%A5%E6%AD%A5%E6%95%99%E4%BD%A0%E8%BD%BB%E6%9D%BE%E5%AD%A6%E5%85%B3%E8%81%94%E8%A7%84%E5%88%99Apriori%E7%AE%97%E6%B3%95/