关联式规则

维基百科,自由的百科全书
跳转至: 导航搜索


关联式规则(Association Rules, AR),又称关联规则,是数据挖掘的一个重要课题,用于从大量数据中挖掘出有价值的数据项之间的相关关系。关联规则解决的常见问题如:“如果一个消费者购买了产品A,那么他有多大机会购买产品B?”以及“如果他购买了产品C和D,那么他还将购买什么产品?”正如大多数数据挖掘技术一样,关联规则的任务在于减少潜在的大量杂乱无章的数据,使之成为少量的易于观察理解的静态资料。关联式规则多不考虑项目的次序,而仅考虑其组合。

关联规则一个经典的实例是购物篮分析(Market Basket Analysis)。超市对顾客的购买记录数据库进行关联规则挖掘,可以发现顾客的购买习惯,例如,购买产品X的同时也购买产品Y,于是,超市就可以调整货架的布局,比如将X产品和Y产品放在一起,增进销量。

基本概念[编辑]

表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

根据韩家炜等[1],关联规则定义为:

假设I=\{I_1, I_2,\ldots,I_m\}的集合。给定一个交易数据库D=\{t_1, t_2,\ldots,t_n\},其中每个事务(Transaction)t是I的非空子集,即t\subseteq I,每一个交易都与一个唯一的标识符TID(Transaction ID)对应。关联规则是形如X \Rightarrow Y蕴涵式,其中X, Y \subseteq IX \cap Y = \emptysetXY分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。关联规则X \Rightarrow Y在D中的支持度(support)是D中事务包含X \cup Y的百分比,即概率P(X \cup Y)置信度(confidence)是包含X的事务中同时包含Y的百分比,即条件概率P \left ( Y | X \right )。如果同时满足最小支持度阈值最小置信度阈值,则认为关联规则是有趣的。这些阈值由用户或者专家设定。

用一个简单的例子说明。表1是顾客购买记录的数据库D,包含6个事务。项集I={网球拍,网球,运动鞋,羽毛球}。考虑关联规则:网球拍 \Rightarrow 网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,支持度support= \frac{3}{6} = 0.5,置信度confident= \frac{3}{5} = 0.6。若给定最小支持度 \alpha =0.5,最小置信度 \beta =0.6,关联规则网球拍 \Rightarrow 网球是有趣的,认为购买网球拍和购买网球之间存在强关联。

分类[编辑]

关联规则有以下常见分类[1]

根据关联规则所处理的值的类型

  • 如果考虑关联规则中的数据项是否出现,则这种关联规则是布尔关联规则(Boolean association rules)。例如上面的例子。
  • 如果关联规则中的数据项是数量型的,这种关联规则是数量关联规则(quantitative association rules)。例如年龄("20-25")\Rightarrow购买("网球拍"),年龄是一个数量型的数据项。在这种关联规则中,一般将数量离散化(discretize)为区间。

根据关联规则所涉及的数据维数

  • 如果关联规则各项只涉及一个维,则它是单维关联规则(single-dimensional association rules),例如购买("网球拍")\Rightarrow购买("网球")只涉及“购买”一个维度。
  • 如果关联规则涉及两个或两个以上维度,则它是多维关联规则(multi-dimensional association rules),例如年龄("20-25")\Rightarrow购买("网球拍")涉及“年龄”和“购买”两个维度。

根据关联规则所涉及的抽象层次

  • 如果不涉及不同层次的数据项,得到的是单层关联规则(single-level association rules)。
  • 在不同抽象层次中挖掘出的关联规则称为广义关联规则(generalized association rules)。例如年龄("20-25")\Rightarrow购买("HEAD网球拍")和年龄("20-25")\Rightarrow购买("网球拍")是广义关联规则,因为"HEAD网球拍"和"网球拍"属于不同的抽象层次。

算法[编辑]

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非空,递归地调用insert_tree(P,N)。
2 FP树的规则挖掘(通过FP-growth(Tree,α)函数来实现,初始调用FP-growth(Tree,null)):
if Tree含单个路径P then {
for 路径P中节点的每个组合(记作β)
产生模式β∪α,其支持度support=β中节点的最小支持度; }
else for each αi 在Tree的头部 do {
产生模式β=αi ∪ α,其支持度support=αi.support;
构造β的条件模式基,然后构造β的条件FP树Treeβ;
if Treeβ≠空集 then
调用FP_growth(Treeβ,β) }
end

F-P算法实现[编辑]

Bash版本:请参考文章FP-growth算法实现

Eclat算法[编辑]

与fp-growth 和apriori算法不同,Eclat算法加入了倒排的思想,具体就是将事务数据中的项作为key,每个项对应的事务ID作为value。

原输入数据为

tid item
1 A,B
2 B,C
3 A,C
4 A,B,C

转换后为:

item tids
A 1,3,4
B 1,2,4
C 2,3,4

通过转换后的倒排表可以加快频繁集生成速度。 其算法思想是 由频繁k项集求交集,生成候选k+1项集 。对候选k+1项集做裁剪,生成频繁k+1项集,再求交集生成候选k+2项集。如此迭代,直到项集归一。 根据上述数据的情况,具体计算过程为

   算法过程:

1.计算频繁1项集,结果为:

item freq
A 3
B 3
C 3

2.由频繁1项集生成频繁2项集

item freq
A,B 2
A,C 2
B,C 2

3.由频繁2项集生成频繁3项集

item freq
A,B,C 1

频繁k项集生成频繁k+1项集的过程与由1项集生成2项集的过程完全一致。

这里有个隐含的条件是,两个频繁k项集生成k+1项集时,前k-1项是一致的,A,B+A,C==>A,B,C

Eclat算法实现[编辑]

eclat的核心思想就是倒排,这种数据处理方式很适合用关系型数据表示和实现。 具体可参考用关系型数据结构实现Eclat算法——Hive

参考文献[编辑]

  1. ^ 1.0 1.1 J. Han, M. Kamber. Data Mining: Concepts and Techniques. Morgan Kaufmann: 2000

http://en.wikipedia.org/wiki/Association_rule_learning