关联规则挖掘算法_【理论】挖掘关联规则

养码千日,用码一时。

目录

1 关联规则基本概念

2 Apriori 算法生成频繁项集

3 根据频繁项集挖掘关联规则

4 FP-Growth算法生成频繁项集

1 关联规则基本概念

沃尔玛商店的营销人员发现了一个现象:啤酒与尿布的销量在周末总会同时出现增长。他们对这个现象进行了分析和讨论,并在商场内进行观察,他们发现这些顾客有几个共同的特点:

  • 一般是周末出现这种情况。
  • 购买者以已婚男士为主。
  • 他们家中有孩子且不到两岁,有尿不湿的刚需。

从中受到启发,他们对超市的物品摆放位置进行了调整,将啤酒与尿布摆放在一起,同时将牛肉干等一些简便的下酒食品也摆放在一起。这样全年下来,营业额显著增加。

上面这个故事称为购物篮分析,是一种关联规则。

关联规则是指从一份资料库中(如销售记录)中发现某些特征(如商品种类)之间的联系。

关联规则挖掘可以让我们从数据集中发现项与项之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。所以关联规则挖掘是个非常有用的技术。

下面是几名客户购买的商品列表:

890a90ab3f50d7816be5687337fed260.png

下面先介绍几个概念。

【定义1】 项集(itemset)是项的集合,也就是一个商品或多个商品的组合。

包含k个项的项集称为k-项集。例如{面包}是1-项集,{牛奶,面包}是2-项集。

【定义2】 项集的支持度

对于项集X,用count(x)表示交易集合D中包含项集X的交易的数量。如果用|D|表示交易的数量 ,则项集X的支持度的计算公式是

013f3f4bed79d5531bcfa94d0581b8d5.png

其中T是所有项目的集合。

项集的支持度是一个或几个商品出现的次数与交易总数之间的比例,支持度可以理解为物品当前流行程度。

在上面顾客购买的商品列表中,我们能看到“牛奶”出现了 4 次,那么这 5 笔交易中1-项集“牛奶”的支持度就是 4/5=0.8。

同样“牛奶,“面包”出现了 3 次,那么这 5 笔订单中,2-项集“牛奶,面包”的支持度就是 3/5=0.6。

【定义3】 项集的最小支持度与频繁项集

发现关联规则要求项集必须满足最小阈值,最小阈值称之为项集的最小支持度,记为

。从统计意义上讲,它表示用户关心的关联规则必须满足的最低出现概率。最小支持度用于衡量规则需要满足的最低重要性,需要人为指定。

支持度大于或等于

的项集称为频繁项集,简称频繁项集 (frequent itemset)。如果k-项集满足
,称为k-频繁项集,记作

频繁项集 就是支持度大于等于最小支持度的项集,就是频繁的一起出现的物品的集合。所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集。

假设指定最小支持度是 0.5,在上面的顾客购买的商品列表中,“面包”的支持度等于0.6,其大于0.5,则“面包”是频繁项集。“可乐,面包,尿布,啤酒”的支持度是0.25,小于0.5,其不是频繁项集。

【定义4】关联规则

关联规则是一个蕴含式

,即由项集X可以推导出项集Y。

其中X,Y都是项集,且

。X称为规则的条件,也称为前项,Y称为规则结果,也称为后项。

关联规则表示在一次交易中,如果出现项集X,则项集Y也会按照一定概率出现。

【定义5】关联规则的支持度

对于关联规则

,规则R的支持度是交易中同时包含X和Y的交易与所有交易之比,记为
,其计算公式是

3c01af2166f836068fe512e841ae3c55.png

关联规则的支持度反映了X和Y 中所含的商品在全部交易中同时出现的频率。由于关联规则必须由频繁集产生,所以规则的支持度其实就是频繁集的支持度,即

9e76c365e9c6b29a1e5e473badd611e6.png

【定义6】关联规则的置信度

对于关联规则

,,规则R的置信度是指同时包含X和Y的交易与包含X的交易之比,记为
, ,其计算公式是

6cbb50e25608de57423a3d990bee25ba.png

关联规则的置信度反映了当交易中包含项集X 时,项集Y 同时出现的概率。

关联规则的支持度和置信度分别反映了,当前规则在整个数据库中的统计重要性和可靠程度。

关联规则置信度指的就是当你购买了商品 A,会有多大的概率购买商品 B。置信度是个条件概率,就是说在 A 发生的情况下,B 发生的概率是多少。

例如在上面的顾客购买的商品列表中,置信度(牛奶

啤酒)=2/4=0.5,代表如果购买了牛奶,有0.5的概率会购买啤酒。

置信度(啤酒

牛奶)=2/3=0.67,代表如果购买了啤酒,有0.67的概率会购买牛奶。

【定义7】关联规则的提升度

关联规则的提升度

f4045756d3f49177eb95382b06a18655.png

提升度

是用来衡量 A 出现的情况下,是否会对 B 出现的概率有所提升。

所以提升度有三种可能:

提升度

代表有提升;

提升度

代表有没有提升,也没有下降;

提升度

代表有下降。

【定义8】关联规则的最小支持度和最小置信度

关联规则的最小支持度记为

,它用于衡量规则需要满足的最低重要性,需要人为指定。

关联规则的最小置信度记为

,它表示关联规则需要满足的最低可靠性,需要人为指定。

【定义9】强关联规则

如果关联规则

满足
,则称规则
为强关联规则,否则为弱关联规则。

挖掘关联规则时,产生的规则要经过

的衡量,筛选出来的强关联规则才能用于指导商家的决策。

我们在做商品推荐的时候,重点考虑的是提升度,因为提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度。

发现物品间的关联规则也就是要寻找物品之间的潜在关系。要寻找这种关系,有两个步骤:

1)找出频繁项集。比如一个超市的频繁项集可能有{{啤酒,尿布},{鸡蛋,牛奶},{香蕉,苹果}}。

2)在频繁项集的基础上,使用关联规则算法找出其中物品的关联结果。

简单来说,就是先找频繁项集,再找关联的物品。

下面先介绍如何用Apriori算法找出频繁项集,然后介绍在频繁项集的基础上找出物品的关联规则。

2 Apriori 算法生成频繁项集

Apriori 算法是挖掘关联规则的频繁项集算法,其实就是查找频繁项集的过程。

Apriori算法有一条重要性质:一个频繁项集的所有非空子集也是频繁项集。其逆否命题是:如果一个项集不是频繁项集,那么它的扩集也不是频繁项集。或者说,如果一个项集的子集不是频繁项集,则该项集也不是频繁项集。

因为假设support(I)小于最小支持度阈值,当有元素A添加到I中时,结果项集(A

I)不可能比I出现次数更多,即support(A
I)也小于最小支持度阈值。因此A
I也不是频繁的。

例如,若存在3-项集{a, b, c},如果它的2-项子集{a, b}的支持度小于阈值,则{a, b, c}的支持度也会小于阈值。

Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描交易记录,找出所有的频繁1-项集,该集合记为L1,然后利用L1找频繁2-项集的集合L2,然后找L2找L3,以此类推,直到不能再找到任何频繁k-项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。

Apriori 算法分为连接步和剪枝步。

(1)连接步

若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个项相同,而最后一个项不同,则说明它们是可连接的,即可连接生成k项集。例如有两个3项集:{a, b, c}和{a, b, d},这两个3项集就是可连接的,它们可以连接生成4项集{a, b, c, d}。又如两个3项集{a, b, c}和{a, d, e},这两个3项集是不能连接生成4项集的。

(2)剪枝步

如果一个项集的子集不是频繁项集,则该项集也不是频繁项集。因此,若存在一个项集的子集不是频繁项集,那么该项集就应该被舍弃。

总结来说,Apriori 算法的步骤是,先指定最小支持度阈值;

  1. 扫描交易数据,计算每个1-项集的支持度,找出所有频繁1-项集的集合,该集合记作L[1],令k=1;
  2. 连接步。合并L[k],并且扫描交易数据得到候选k+1项集及其支持度,记作C[k+1],注意这时的候选C[k+1]项集不一定全都是频繁项集;
  3. 剪枝步。剔除C[k+1]中支持度小于最小支持度阈值的项集,得到L[k+1]。因为如果C[k+1]中的项集不是频繁项集,那么它的扩集也不是频繁项集。
  4. 令k=k+1,重复2、3步,直到不能生成更大的频繁集为止。

如下图所示,

66d55d7b45b74c7715f0c5632a712ff6.png

在图中,有4个交易记录。假设指定最小支持度阈值是0.5,由这些交易记录应用Apriori 算法找到频繁项集的详细步骤是:第1步:扫描交易数据并计算每个1-项集的支持度,{A}、{B}、{C}、{D}、{E}的支持度分别是0.5、0.75、0.75、0.25、0.75。

第2步:移除支持度小于0.5的项集{D},因此包含D的项集都不是频繁项集。得到所有频繁1-项集L[1] = {{A},{B},{C},{E}}。

它们的支持度分别是0.5、0.75、0.75、0.75。

第3步:连接步。在L[1]的基础上,通过合并并且扫描交易表,得到候选2-项集C[2],其项集是{A,B}、{A,C}、{B,C}、{B,E}、{C,E},它们的支持度分别是0.25、0.5、0.25、0.5、0.75、0.5。

第4步:剪枝步。剔除C[2]中支持度小于0.5的项集,得到L[2]是{{A,C}、{B,C}、{B,E}、{C,E}},它们的支持度分别是0.5、0.5、0.75、0.5。

第5步:连接步。在L[2]的基础上,通过合并并且扫描交易表,得到候选3-项集C[3],其项集是{A,B,C}、{A,C,E}、{A,B,E}、{B,C,E},它们的支持度分别是0.25、0.25、0.25、0.5。

第6步:剪枝步。剔除C[3]中支持度小于0.5的项集,得到L[3]是{{B,C,E}},它的支持度是0.5。

在第6步之后,得到的频繁项集只有1个不能生成更大的频繁项集了,这时结束。

因此得到的1-频繁项集L[1] = {{A},{B},{C},{E}},其支持度分别是0.5、0.75、0.75、0.75。

2-频繁项集L[2]={{A,C}、{B,C}、{B,E}、{C,E}},它们的支持度分别是0.5、0.5、0.75、0.5。

3-频繁项集L[3]={{B,C,E}},它的支持度是0.5。

3 根据频繁项集挖掘关联规则

如有一个频繁项集{豆奶,莴苣},那么可能有一条关联规则是“豆奶=>莴苣”,即一个人购买了豆奶,则大可能他会购买莴苣,但反过来一个人购买了莴苣,不一定他会购买豆奶,频繁项集使用支持度量化,关联规则使用置信度量化。一条规则

的置信度定义为

d1f32d9482372ec8e676b192a08baf51.png

从频繁项集产生关联规则的步骤是:先给定最小置信度。

(1)根据每个频繁项集,找到它所有的非空真子集。

(2)根据这些非空真子集,两两组成所有的关联规则。

(3)计算所有的关联规则的置信度,移除小于最小置信度的规则,得到强关联规则。

如下图所示从一个3频繁项集中挖掘关联规则。

4bfcb8df251d6ee3d709e48e8f501bc0.png

该图是频繁项集{0,1,2,3}的关联规则示意图,阴影区域是低置信度关联规则。如果{0,1,2}=>{3}是一条低置信度的关联规则,那么所有包含3为后项的关联规则的置信度也会低。

因此,先从2-频繁项集出发(1-频繁项集没有关联规则的),创建一个规则列表,该规则右边只包含一个元素,然后对这些规则测试;然后合并所有规则创建新的关联列表,该规则右边包含两个元素。

以此类推从3-频繁项集、4-频繁项集中挖掘关联规则。

在4.2.2节Apriori 算法生成频繁项集的例子中,得到的1-频繁项集L[1] = {{A},{B},{C},{E}},其支持度分别是0.5、0.75、0.75、0.75。

2-频繁项集L[2]={{A,C}、{B,C}、{B,E}、{C,E}},它们的支持度分别是0.5、0.5、0.75、0.5。

3-频繁项集L[3]={{B,C,E}},它的支持度是0.5。

下面从这些频繁项集中找出关联规则,设给定最小置信度是0.8。

第1步:2-频繁项集L[2]={{A,C}、{B,C}、{B,E}、{C,E}}。

先从2-频繁项集{A,C}出发,其非空真子集是{{A},{C}},关联规则有{A}=>{C}、{C}=>{A}。

下面计算这些规则的置信度,得到强关联规则。

{A}=>{C}的置信度confidence({A}=>{C}) = support({A,C}) / support({A}} = 0.5/0.5=1,其值大于最小置信度是0.8 ,因此该条关联规则保留。

{C}=>{A}的置信度confidence({C}=>{A}) = support({C,A}) / support({C}} = 0.5/0.75=0.67,其值小于0.8 ,因此移除该条关联规则。

从2-频繁项集{B,C}出发,其非空真子集是{{B},{C}},可能的关联规则有{B}=>{C}、{C}=>{B}。

{B}=>{C}置信度confidence({B}=>{C}) = support({B,C}) / support({B}} = 0.5/0.75=0.67,其值小于0.8 ,因此移除该条关联规则。

{C}=>{B}置信度confidence({C}=>{B}) = support({C,B}) / support({C}} = 0.5/0.75=0.67,其值小于0.8 ,因此移除该条关联规则。

从2-频繁项集{B,E}}出发,其非空真子集是{{B},{E}},关联规则有{B}=>{E}、{E}=>{B}。

下面计算这些规则的置信度,得到强关联规则。

{B}=>{E}置信度confidence({B}=>{E}) = support({B,E}) / support({B}} = 0.75/0.75=1,其值大于0.8 ,因此保留该条关联规则。

{E}=>{B}置信度confidence({E}=>{B}) = support({E,B}) / support({E}} = 0.75/0.75=1,其值大于0.8 ,因此保留该条关联规则。

第2步:3-频繁项集L[3]={{B,C,E}},其非空真子集有{B},{C},{E},{B,C},{B,E},{C,E}。因此所有的关联规则有{B}=>{C,E},{C}=>{B,E},{E}=> {B,C},{B,C}=>{E},{B,E}=>{C},{C,E}=>{B}。

因单项的频繁项集{B},{C},{E}之间的规则已经计算过,所以只需计算有多项的规则。

下面计算这些规则的置信度,得到强关联规则。

计算规则的{B}=>{C,E}置信度confidence({B}=>{C,E}) = support({B})/support({C,E}) = 0.75/0.5 = 1.5 > 最小置信度是0.8,所以保留该条规则。

以此类推,confidence({C}=>{B,E}) = 0.75/0.75=1>0.8。

confidence({E}=>{B,C}) = 0.75/0.5=1.5>0.8。

confidence({B,C}=>{E}) = 0.5/0.75=0.67<0.8。

confidence({B,E}=>{C}) = 0.75/0.75=1>0.8。

confidence({C,E}=>{B}) = 0.5/0.75=0.67<0.8。

因此,在支持度是0.5、最小置信度是0.8的条件下得到的强关联规则有

{A}=>{C},{B}=>{E},{E}=>{B},{B}=>{C,E},{C}=>{B,E},{E}=>{B,C},{B,E}=>{C}。

4 FP-Growth算法生成频繁项集

从Apriori算法挖掘频繁项集的过程可以看出,每进行一次连接步就需要扫描一次交易数据,当交易数据量很大时,会非常耗时,这时需要对其优化,本节要介绍的FP-Growth算法就是一种优化算法。

FP-Growth是一种比Apriori更高效的频繁项挖掘方法,它只需要扫描交易表2次。其中第1次扫描获得当个项目的频率,去掉不符合支持度要求的项,并对剩下的项按照置信度降序排序。第2遍扫描是建立一棵频繁项树FP-Tree(frequent-patten tree)。

FP-Growth算法生成频繁项集分为两个过程:(1)构建FP树;(2)从FP树中挖掘频繁项集。

首先FP-Growth是一种分治的算法,有下面4个步骤:

1:其先统计交易数据中的项。按照出现次数进行从大到小排序,删掉小于支持度阈值的项,然后将数据库中的每条记录按照支持度对应的项进行排序,并删掉小于min_sup的项。

2:用排序好的每条记录来构建一个前缀树T,每个节点维护<item,count>,当这棵树只剩下一个分支的时候,生成相关的频率模式。

3:深度优先遍历T,对于每一个item生成其条件模式基。

4:把条件模式基当成数据库中的记录重复步骤1、2、3。

构建FP树

参考:http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html

https://zhuanlan.zhihu.com/p/30194709

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值