养码千日,用码一时。
目录
1 关联规则基本概念
2 Apriori 算法生成频繁项集
3 根据频繁项集挖掘关联规则
4 FP-Growth算法生成频繁项集
1 关联规则基本概念
沃尔玛商店的营销人员发现了一个现象:啤酒与尿布的销量在周末总会同时出现增长。他们对这个现象进行了分析和讨论,并在商场内进行观察,他们发现这些顾客有几个共同的特点:
- 一般是周末出现这种情况。
- 购买者以已婚男士为主。
- 他们家中有孩子且不到两岁,有尿不湿的刚需。
从中受到启发,他们对超市的物品摆放位置进行了调整,将啤酒与尿布摆放在一起,同时将牛肉干等一些简便的下酒食品也摆放在一起。这样全年下来,营业额显著增加。
上面这个故事称为购物篮分析,是一种关联规则。
关联规则是指从一份资料库中(如销售记录)中发现某些特征(如商品种类)之间的联系。
关联规则挖掘可以让我们从数据集中发现项与项之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。所以关联规则挖掘是个非常有用的技术。
下面是几名客户购买的商品列表:
下面先介绍几个概念。
【定义1】 项集(itemset)是项的集合,也就是一个商品或多个商品的组合。
包含k个项的项集称为k-项集。例如{面包}是1-项集,{牛奶,面包}是2-项集。
【定义2】 项集的支持度
对于项集X,用count(x)表示交易集合D中包含项集X的交易的数量。如果用|D|表示交易的数量 ,则项集X的支持度的计算公式是
其中T是所有项目的集合。
项集的支持度是一个或几个商品出现的次数与交易总数之间的比例,支持度可以理解为物品当前流行程度。
在上面顾客购买的商品列表中,我们能看到“牛奶”出现了 4 次,那么这 5 笔交易中1-项集“牛奶”的支持度就是 4/5=0.8。
同样“牛奶,“面包”出现了 3 次,那么这 5 笔订单中,2-项集“牛奶,面包”的支持度就是 3/5=0.6。
【定义3】 项集的最小支持度与频繁项集
发现关联规则要求项集必须满足最小阈值,最小阈值称之为项集的最小支持度,记为
支持度大于或等于
频繁项集 就是支持度大于等于最小支持度的项集,就是频繁的一起出现的物品的集合。所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集。
假设指定最小支持度是 0.5,在上面的顾客购买的商品列表中,“面包”的支持度等于0.6,其大于0.5,则“面包”是频繁项集。“可乐,面包,尿布,啤酒”的支持度是0.25,小于0.5,其不是频繁项集。
【定义4】关联规则
关联规则是一个蕴含式
其中X,Y都是项集,且
关联规则表示在一次交易中,如果出现项集X,则项集Y也会按照一定概率出现。
【定义5】关联规则的支持度
对于关联规则
关联规则的支持度反映了X和Y 中所含的商品在全部交易中同时出现的频率。由于关联规则必须由频繁集产生,所以规则的支持度其实就是频繁集的支持度,即
【定义6】关联规则的置信度
对于关联规则
关联规则的置信度反映了当交易中包含项集X 时,项集Y 同时出现的概率。
关联规则的支持度和置信度分别反映了,当前规则在整个数据库中的统计重要性和可靠程度。
关联规则置信度指的就是当你购买了商品 A,会有多大的概率购买商品 B。置信度是个条件概率,就是说在 A 发生的情况下,B 发生的概率是多少。
例如在上面的顾客购买的商品列表中,置信度(牛奶
置信度(啤酒
【定义7】关联规则的提升度
关联规则的提升度
提升度
所以提升度有三种可能:
提升度
提升度
提升度
【定义8】关联规则的最小支持度和最小置信度
关联规则的最小支持度记为
关联规则的最小置信度记为
【定义9】强关联规则
如果关联规则
挖掘关联规则时,产生的规则要经过
我们在做商品推荐的时候,重点考虑的是提升度,因为提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度。
发现物品间的关联规则也就是要寻找物品之间的潜在关系。要寻找这种关系,有两个步骤:
1)找出频繁项集。比如一个超市的频繁项集可能有{{啤酒,尿布},{鸡蛋,牛奶},{香蕉,苹果}}。
2)在频繁项集的基础上,使用关联规则算法找出其中物品的关联结果。
简单来说,就是先找频繁项集,再找关联的物品。
下面先介绍如何用Apriori算法找出频繁项集,然后介绍在频繁项集的基础上找出物品的关联规则。
2 Apriori 算法生成频繁项集
Apriori 算法是挖掘关联规则的频繁项集算法,其实就是查找频繁项集的过程。
Apriori算法有一条重要性质:一个频繁项集的所有非空子集也是频繁项集。其逆否命题是:如果一个项集不是频繁项集,那么它的扩集也不是频繁项集。或者说,如果一个项集的子集不是频繁项集,则该项集也不是频繁项集。
因为假设support(I)小于最小支持度阈值,当有元素A添加到I中时,结果项集(A
例如,若存在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-项集的集合,该集合记作L[1],令k=1;
- 连接步。合并L[k],并且扫描交易数据得到候选k+1项集及其支持度,记作C[k+1],注意这时的候选C[k+1]项集不一定全都是频繁项集;
- 剪枝步。剔除C[k+1]中支持度小于最小支持度阈值的项集,得到L[k+1]。因为如果C[k+1]中的项集不是频繁项集,那么它的扩集也不是频繁项集。
- 令k=k+1,重复2、3步,直到不能生成更大的频繁集为止。
如下图所示,
在图中,有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 根据频繁项集挖掘关联规则
如有一个频繁项集{豆奶,莴苣},那么可能有一条关联规则是“豆奶=>莴苣”,即一个人购买了豆奶,则大可能他会购买莴苣,但反过来一个人购买了莴苣,不一定他会购买豆奶,频繁项集使用支持度量化,关联规则使用置信度量化。一条规则
从频繁项集产生关联规则的步骤是:先给定最小置信度。
(1)根据每个频繁项集,找到它所有的非空真子集。
(2)根据这些非空真子集,两两组成所有的关联规则。
(3)计算所有的关联规则的置信度,移除小于最小置信度的规则,得到强关联规则。
如下图所示从一个3频繁项集中挖掘关联规则。
该图是频繁项集{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