关联规则
经典案例导入
• 在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的商品居然摆在一起。但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了。这可不是一个笑话,而是一直被商家所津津乐道的发生在美国沃尔玛连锁超市的真实案例。原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。这个发现为商家带来了大量的利润,但是如何从浩如烟海却又杂乱无章的数据中,发现啤酒和尿布销售之间的联系呢?这又给了我们什么样的启示呢?
• 这就是我们所说的——关联规则!
关联规则引论
• 关联式规则(Association Rules, AR),又称关联规则,是数据挖掘的一个重要课题,用于从大量数据中挖掘出有价值的数据项之间的相关关系。关联规则解决的常见问题如:“如果一个消费者购买了产品A,那么他有多大机会购买产品B?”以及“如果他购买了产品C和D,那么他还将购买什么产品?”正如大多数数据挖掘技术一样,关联规则的任务在于减少潜在的大量杂乱无章的数据,使之成为少量的易于观察理解的静态资料。关联式规则多不考虑项目的次序,而仅考虑其组合。
• 关联规则一个经典的实例是购物篮分析(Market Basket Analysis)。超市对顾客的购买记录数据库进行关联规则挖掘,可以发现顾客的购买习惯,例如,购买产品X的同时也购买产品Y,于是,超市就可以调整货架的布局,比如将X产品和Y产品放在一起,增进销量。
关联规则的基本概念
根据韩家炜等,关联规则定义为:
假设 是项的集合。给定一个交易数据库 ,其中每个事务(Transaction)t是I的非空子集,即t是 I的非空子集,即 ,每一个交易都与一个唯一的标识符TID(Transaction ID)对应。关联规则是形如 的蕴涵式,其中 且 , X和Y分别称为关联规则的先导(antecedent或left-hand-side,LHS)和后继(consequent或right-hand-side,RHS) 。关联规则 在D中的支持度(support)是D中事务包含 的百分比,即概率 ;置信度(confidence)是包含X的事务中同时包含Y的百分比,即条件概率P ( Y | X)。如果同时满足最小支持度阈值和最小置信度阈值,则认为关联规则是有趣的。这些阈值由用户或者专家设定。
关联规则的基本量
• 支持度:
支持度指的是A和B 同时出现的概率。
• 置信度:
置信度表示在A出现的情况下,B出现的概率。
• 提升度:
提升度是一种简单的相关性度量,定义如下。项集A的出现独立于项集B的出现,如果 ;否则作为事件,项集A和B是依赖的和相关的。若lift <1,则A的出现于B的出现是负相关的,意味着一个出现将会导致另一个不出现;若lift >1,则A的出现于B的出现是正相关的,意味着一个的出现将蕴含着另一个的出现;若lift=1,则A,B之间相互独立,不存在相关性。
案例
用一个简单的例子说明。表1是顾客购买记录的数据库D,包含6个事务。项集I={网球拍,网球,运动鞋,羽毛球}。考虑关联规则:网球拍网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,支持度support= 3/6= 0.5,置信度confident= 3/5=0.6。若给定最小支持度 ,最小置信度 ,关联规则 是有趣的,认为购买网球拍和购买网球之间存在强关联.
表1:关联规则的简单例子 |
||||
TID |
网球拍 |
网 球 |
运动鞋 |
羽毛球 |
1 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
0 |
0 |
3 |
1 |
0 |
0 |
0 |
4 |
1 |
0 |
1 |
0 |
5 |
0 |
0 |
1 |
1 |
6 |
1 |
1 |
0 |
0 |
关联规则的分类
根据关联规则所处理的值的类型
如果考虑关联规则中的数据项是否出现,则这种关联规则是布尔关联规则(Boolean associationrules)。例如上面的例子。
如果关联规则中的数据项是数量型的,这种关联规则是数量关联规则(quantitativeassociation rules)。例如年龄("20-25")购买("网球拍"),年龄是一个数量型的数据项。在这种关联规则中,一般将数量离散化(discretize)为区间。
根据关联规则所涉及的数据维数
如果关联规则各项只涉及一个维,则它是单维关联规则(single-dimensionalassociation rules),例如购买("网球拍")购买("网球")只涉及“购买”一个维度。
如果关联规则涉及两个或两个以上维度,则它是多维关联规则(multi-dimensionalassociation rules),例如年龄("20-25")购买("网球拍")涉及“年龄”和“购买”两个维度。
根据关联规则所涉及的抽象层次
如果不涉及不同层次的数据项,得到的是单层关联规则(single-levelassociation rules)。
在不同抽象层次中挖掘出的关联规则称为广义关联规则(generalizedassociation rules)。例如年龄(“20-25”)购买(“HEAD网球拍”)和年龄(“20-25”)购买(“网球拍”)是广义关联规则,因为“HEAD网球拍”和“网球拍”属于不同的抽象层次。
算法
Apriori 算法
F-P算法
Eclat算法
算法
Apriori 算法[
Apriori算法是种最有影响的挖掘布尔关联规则频繁项集的算法。它的核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集(简称频集),也常称为最大项目集。
在Apriori算法中,寻找最大项目集(频繁项集)的基本思想是:算法需要对数据集进行多步处理。第一步,简单统计所有含一个元素项目集出现的频数,并找出那些不小于最小支持度的项目集,即一维最大项目集。从第二步开始循环处理直到再没有最大项目集生成。循环过程是:第k步中,根据第k-1步生成的(k-1)维最大项目集产生k维侯选项目集,然后对数据库进行搜索,得到侯选项目集的项集支持度,与最小支持度进行比较,从而找到k维最大项目集。
下面以图例的方式说明该算法的运行过程:假设有一个数据库D,其中有4个事务记录,分别表示为:
TID |
Items |
T1 |
I1,I3,I4 |
T2 |
I2,I3,I5 |
T3 |
I1,I2,I3,I5 |
T4 |
I2,I5 |
这里预定最小支持度minSupport=2,下面用图例说明算法运行的过程:
TID |
Items |
T1 |
I1,I3,I4 |
T2 |
I2,I3,I5 |
T3 |
I1,I2,I3,I5 |
T4 |
I2,I5 |
扫描D,对每个候选项进行支持度计数得到表C1:
项集 |
支持度计数 |
{I1} |
2 |
{I2} |
3 |
{I3} |
3 |
{I4} |
1 |
{I5} |
3 |
比较候选项支持度计数与最小支持度minSupport,产生1维最大项目集L1:
项集 |
支持度计数 |
{I1} |
2 |
{I2} |
3 |
{I3} |
3 |
{I5} |
3 |
由L1产生候选项集C2:
项集 |
{I1,I2} |
{I1,I3} |
{I1,I5} |
{I2,I3} |
{I2,I5} |
{I3,I5} |
扫描D,对每个候选项集进行支持度计数:
项集 |
支持度计数 |
{I1,I2} |
1 |
{I1,I3} |
2 |
{I1,I5} |
1 |
{I2,I3} |
2 |
{I2,I5} |
3 |
{I3,I5} |
2 |
比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2:
项集 |
支持度计数 |
{I1,I3} |
2 |
{I2,I3} |
2 |
{I2,I5} |
3 |
{I3,I5} |
2 |
由L2产生候选项集C3:
项集 |
{I2,I3,I5} |
比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:
项集 |
支持度计数 |
{I2,I3,I5} |
2 |
算法终止。
从算法的运行过程,我们可以看出该Apriori算法的优点:简单、易理解、数据要求低,然而我们也可以看到Apriori算法的缺点:(1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法,如下面要介绍的F-P算法。
F-P算法[编辑]
针对Apriori算法的性能瓶颈问题-需要产生大量候选项集和需要重复地扫描数据库,2000年Jiawei Han等人提出了基于FP树生成频繁项集的FP-growth算法。该算法只进行2次数据库扫描且它不使用侯选集,直接压缩数据库成一个频繁模式树,最后通过这棵树生成关联规则。研究表明它比Apriori算法大约快一个数量级。
FP-growth算法是一种不产生候选模式而采用频繁模式增长的方法挖掘频繁模式的算法。算法只需要扫描2次数据库:第一次扫描数据库,得到1维频繁项集;第二次扫描数据库,利用1维频繁项集过滤数据库中的非频繁项,同时生成FP树。由于FP树蕴涵了所有的频繁项集,其后的频繁项集的挖掘只需要在FP树上进行。FP树挖掘由两个阶段组成:第一阶段建立FP树,即将数据库中的事务构造成一棵FP树;第二阶段为挖掘FP树,即针对FP树挖掘频繁模式和关联规则。
FP-growth算法描述:
输入:事务数据库D,最小支持度minSupport。
输出:频繁模式的完全集。
方法:
1 构建FP树:
1.1 扫描事务数据库,收集频繁项集F并统计支持度,对F按支持度降序排序,得到频率排序好的项表L。
1.2 创建FP树的根节点,用“null”标记它。对于D中每个事务T,执行:选择T中的频繁项,并按L中的次序排序。设排序后的频繁项表为[p|P],其中p是第一个元素,而P是剩余元素的表。调用insert_tree([p|P],T)。该过程执行情况如下:如果T有子女N使得N.itemName=p.itemName,则N的计数增加1;否则创建一个新节点N,将其计数设置为1,链接到它的父节点T,并且通过节点链结构将其链接到具有相同itemName的节点。如果P非空,递归地调用inser