关联规则挖掘算法_数据挖掘-关联规则

772de4b99cc49ec098fba8c02bddd0f1.png
关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系。它的目的是利用一些度量指标来分辨数据库中存在的强规则。也即是说关联规则挖掘是用于知识发现,而非预测,所以是属于无监督的机器学习方法。

1.啤酒和尿布

沃尔玛在分析销售记录时,发现啤酒和尿布经常一起被购买,于是他们调整了货架,把两者放在一起,结果真的提升了啤酒的销量。

原因解释:爸爸在给宝宝买尿布的时候,会顺便给自己买点啤酒?

通过上述的案例我们找到了找到类似的规则:啤酒→尿布;这些规则出现的频次很高,关联性很强。

2.衡量方法

支持度、置信度和提升度

2.1支持度

频率,指的是某个商品组合出现的次数与总次数之间的比例,如果某个项原本的支持度很低,即使关联性很强,实际的意义可能不大。

比如我们有以下的商品订单

010194533d397ec9981ad5369cf6b93b.png

牛奶的支持度为

牛奶+面包的支持度为

2.2置信度

条件概率,买了X的人又买了Y的比例有多少,表示关联性的强弱

比如上面的案例中

我们来计算牛奶->面包置信度:

牛奶出现的次数为 4次

牛奶和面包一起出现的次数为 3

牛奶->的置信度为

2.3提升度

商品A的出现,对商品B的出现概率提升的程度

提升度的三种可能:

  • 提升度(x→y)>1:代表有提升;
  • 提升度(x→y)=1:代表有没有提升,也没有下降;
  • 提升度(x→y)<1:代表有下降。

3.Apriori算法

Apriori算法就是查找频繁项集(frequent itemset)的过程

缺点:效率低下,在数据较大时难以使用。

频繁项集:支持度大于等于最小支持度(Min Support)阈值的项集。

非频繁项集:支持度小于最小支持度的项集

我们把上面案例中的商品用ID来代表,牛奶、面包、尿布、可乐、啤酒、鸡蛋的商品ID分别设置为1-6

ea98741ca09aa7ef6a68d203c23144a5.png

先计算K=1的支持度

04373fc4aa458ec71eaaabeeca82eda6.png
K=1的支持度

假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集

6f1685f48891eab289578af47730240e.png
过滤非频繁集的支持度

在这个基础上,我们将商品两两组合,得到k=2项的支持度

8de65093f0c6eaa415865916be576c63.png

将其中支持度小于0.5的剔除

6e4dc9500a3691c3ca24762b681af3da.png

将商品进行K=3项的商品组合

6d52001333d4792d857861152acc6427.png

将其中支持度小于0.5的剔除

5ed7a7ae770610cda15604c3a58e9aa2.png

得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。

因此我们就得到了 牛奶、面包、尿布具有关联

3.1Apriori算法

Apriori算法的流程:
Step1,K=1,计算K项集的支持度;
Step2,筛选掉小于最小支持度的项集;
Step3,如果项集为空,则对应K-1项集的结果为最终结果。
否则K=K+1,重复1-3步。

3.2python第三方库

使用工具包:
from efficient_apriori import apriori
或者:
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
from efficient_apriori import apriori
# 设置数据集
transactions = [('牛奶','面包','尿布'),
		('可乐','面包', '尿布', '啤酒'),
		('牛奶','尿布', '啤酒', '鸡蛋'),
		('面包', '牛奶', '尿布', '啤酒'),
		('面包', '牛奶', '尿布', '可乐')]
# 挖掘频繁项集和频繁规则
itemsets, rules = apriori(transactions, min_support=0.5,  min_confidence=1)
print("频繁项集:", itemsets)
print("关联规则:", rules)

频繁项集: {1: {('牛奶',): 4, ('尿布',): 5, ('面包',): 4, ('啤酒',): 3}, 2: {('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3, ('啤酒', '尿布'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}

关联规则: [{牛奶} -> {尿布}, {面包} -> {尿布}, {啤酒} -> {尿布}, {牛奶, 面包} -> {尿布}]

4. FP-Growth算法

FP-Growth算法最大的特点就是通过构造树来提升计算速度

  • 创建了一棵FP树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。
  • 整个生成过程只遍历数据集2次,大大减少了计算量

创建项头表

  • 作用是为FP构建及频繁项集挖掘提供索引。
  • Step1、流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。
  • 项头表包括了项目、支持度,以及该项在FP树中的链表。初始的时候链表为空。

Step2、对于每一条购买记录,按照项头表的顺序进行排序,并进行过滤。

构造FP树,根节点记为NULL节点

Step3、整个流程是需要再次扫描数据集,把Step2得到的记录逐条插入到FP树中。节点如果存在就将计数count+1,如果不存在就进行创建。同时在创建的过程中,需要更新项头表的链表。

bff675f5d0b2b11664952d11932a2534.png

Step4、通过FP树挖掘频繁项集

现在已经得到了一个存储频繁项集的FP树,以及一个项头表。可以通过项头表来挖掘出每个频繁项集。

挖掘从项头表最后一项“啤酒”开始。

从FP树种找到所有“啤酒”节点,向上遍历祖先节点,得到3条路径。对于每条路径上的节点,其count都设置为“啤酒”的count

具体的操作会用到一个概念,叫“条件模式基”

因为每项最后一个都是“啤酒”,因此我们把“啤酒”去掉,得到条件模式基,此时后缀模式是(啤酒)

假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},此时的条件频繁项集为{{}, {尿布}},所以啤酒的频繁项集为{啤酒},{尿布,啤酒}

647388df1b91ecbb89bd24b329953d1d.png

继续找项头表倒数第2项面包,求得“面包”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}

1c77b221e51ca32d573b2658426eb728.png

继续找项头表倒数第3项面包,求得“牛奶”的条件模式基

根据条件模式基,可以求得面包的频繁项集:{牛奶},{尿布,牛奶}

ec4e89c2c1109267aca6edb7597f3e58.png

60aee84ae89483960abe1e952051a949.png

继续找项头表倒数第4项面包,求得“尿布”的条件模式基

根据条件模式基,可以求得尿布的频繁项集:{尿布}

所以全部的频繁项集为:

{啤酒},{尿布,啤酒}

{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}

{牛奶},{尿布,牛奶}

{尿布}

4.1python第三方库

import fptools as fp

transactions = [('牛奶','面包','尿布'),
		('可乐','面包', '尿布', '啤酒'),
		('牛奶','尿布', '啤酒', '鸡蛋'),
		('面包', '牛奶', '尿布', '啤酒'),
		('面包', '牛奶', '尿布', '可乐')]
#fis = [iset for iset in fp.frequent_itemsets(transactions, 2)]
mfis = [iset for iset in fp.maximal_frequent_itemsets(transactions, 2)]
#print(fis)
print(mfis)

[['尿布', '面包', '可乐'], ['尿布', '面包', '啤酒'], ['尿布', '牛奶', '啤酒'], ['尿布', '面包', '牛奶']]

5.思考

关联规则作为推荐系统/数据挖掘中一个非常经典的算法,对于从整体角度去寻找变量之间的相关性提供了极大的便利。配合数据分析中的探索性分析,寻找变量之间的关系具有较大的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值