第3章关联规则挖掘
3.基本概念
关联规则挖掘发现大量数据中项集之间有趣的关联联系。如果两项或多项属性之间
存在关联,那么其中一项的属性就可以依据其他属性值进行预测。关联规则挖掘是数据
挖掘中的一个重要的课题,最近已被业界深入研究和广泛应用。
关联规则研究有助于发现交易数据库中不同商品(项)之间的联系,找出顾客购买行
为模式,如购买了某商品对购买其他商品的影响。分析结果可以应用于商品货架布局、存
货安排以及根据购买模式对用户进行分类。
关联规则挖掘问题可以分为两个子问题:第一个是找出事务数据库中所有大于或等
于用户指定的最小支持度的数据项集;第二个是利用频繁项集生成所需要的关联规则,根
据用户设定的最小置信度进行取舍,最后得到强关联规则。识别或发现所有频繁项集是
关联规则发现算法的核心,关联规则的基本描述如下。
1.
项与项集
数据库中不可分割的最小单位信息称为项(或项目), 用符号
i
表示,项的集合称为项
集。设集合I={i1,i2,…,
k
}是项集,-项集。例
如,集合{啤酒,尿布,奶粉}
i
是一个3-项集
I
。
中项目的个数为k,则集合
I
称为k
2.
事务
设I=
{1,2,…,k}是由数据库中所有项目构成的集合, {1,2,…,
iii事务数据库T=
ttt}是由一系列具有唯一标识的事务组成的。每个事务ti(2,…,
i=1,n)包含的项集都是(n) I
的子集。例如,顾客在商场里同一次购买多种商品,这些购物信息在数据库中有一个
唯一的标识,用以表示这些商品是同一顾客同一次购买的,称该用户的本次购物活动对应
一个数据库事务。
3.
项集的频数(支持度计数)
包括项集的事务数称为项集的频数(支持度计数)。
4.
关联规则
关联规则是形如X.
Y
的蕴含式,其中X,并且
X
∩Y=
Y
分别是
I
的真子集, .。
X
称为规则的前提,
Y
称为规则的结果。关联规则反映
X
中的项目出现时,
Y
中的项目
也跟着出现的规律。
5.
关联规则的支持度
关联规则的支持度(support)是交易集中同时包含
X
和
Y
的交易数与所有交易数之
比,它反映了
X
和
Y
中所含的项在事务集中同时出现的频率,记为support(
X
.Y), 即
support(
X
.Y)=support(
X
∪Y)=P(XY) (3-1)
6.
关联规则的置信度
关联规则的置信度(confidence)是交易集中包含
X
和
Y
的交易数与包含
X
的交易数
之比,它反映了包含
X
的事务中出现
Y
的条件概率,记为confidence(X.Y), 即
cofdne(= support(X) P(
X) (3-2)
niecX.Y)support(X∪Y)=
Y
7.
最小支持度与最小置信度
通常用户为了达到一定的要求,需要指定规则必须满足的支持度和置信度阈值,这两
个值称为最小支持度阈值(min_sup)和最小置信度阈值(min_conf)。其中,min_sup描述
了关联规则的最低重要程度,min_conf规定了关联规则必须满足的最低可靠性。
8.
强关联规则
support(
X
.Y)≥minsup且confidence(
X
.Y)≥minconf,称关联规则
X
.
Y
为
强关联规则,否则称X.Y为(_) 弱关联规则。通常所说的关联规(_) 则一般是指强关联规则。
9.
频繁项集
设
U
.I,项集
U
在数据集
T
上的支持度是包含
U
的事务在
T
中所占的百分比,即
support(U)=‖{t∈
T
‖TU‖
.t}‖ (3-3)
式中,‖·‖表示集合中的元素数目。对项集I,在事务数据库
T
中所有满足用户指定的
最小支持度的项集,即不小于min_sup的
I
的非空子集,称为频繁项集或大项集。
10.
项集空间理论
R.Agrawal等人建立了用于事务数据库挖掘的项集空间理论。理论的核心:频繁项
集的子集仍是频繁项集,非频繁项集的超集是非频繁项集。
3.关联规则挖掘算法———Apiri算法原理
2
ro
最著名的关联规则发现方法是R.Agrawal提出的Apriori算法。
1.Apriori算法的基本思想
Apriori算法的基本思想是通过对数据库的多次扫描来计算项集的支持度,发现所有
36
37
的频繁项集从而生成关联规则。Apriori算法对数据集进行多次扫描。第次扫描得到频
繁1-项集的集合L1,第k(k>1)次扫描首先利用第(k-1)次扫描的结果Lk-1 来产生候
选k-项集的集合Ck ,然后在扫描的过程中确定Ck 中元素的支持度,最后在每次扫描结束
时计算频繁k-项集的集合Lk ,算法在当候选k-项集的集合Ck 为空时结束。
2.Apriori算法产生频繁项集的过程
Apriori算法产生频繁项集的过程主要分为连接和剪枝两步。
(1)连接。为找到Lk(k ≥2),通过Lk-1与自身进行连接产生候选k-项集的集合
Ck 。设l1 和l2 是Lk-1中的项集。记li j[ ] 表示li 的第j 个项。Apriori算法假定事务或项
集中的项按字典次序排序;对于(k-1)项集li,对应的项排序为li[1]
1,重复执行步骤(4)~(6)。
(4)由Lk 执行连接和剪枝操作,产生候选(k+1)-项集的集合Ck+1。
(5)根据最小支持度,由候选(k+1)-项集的集合Ck+1产生频繁(k+1)-项集的集
合Lk+1。
(6)若L≠.,则k=k+1,跳往步骤(4);否则,跳往步骤(7)。
(7)根据最小置信度,由频繁项集产生强关联规则,结束。
4.Apriori算法描述
输入:数据库D ,最小支持度阈值min_sup。
输出:D 中的频繁集L。
(1)Begin
(2)L1=1-频繁项集;
(3)for(k=2;Lk-1≠.;k++)dobegin
(4)Ck =Apriori_gen(Lk-1);{调用函数Apriori_gen(Lk-1)通过频繁(k-1)-项集
产生候选k-项集}
(5)for所有数据集t∈
D
dobegin {扫描
D
用于计数}
6)Ct=subseCk
,ubse
(t(t);{ 用st找出该事务中候选的所有子集
}
(7)for所有候选项集c∈Ct
do
(8)c.count++
;
(9)end;
(c∈Ck|
_
10)Lk
={c.count≥minsup}
(11)end;
(12)end;
(13)ReturnL1∪L2∪Lk
∪…∪Lm
{形成频繁项集的集合
}
3.3
Apriori算法实例分析
i算法
rioArp
实例分析
笔交易都用唯一的标识符TID 作标记,
寻找
D
中频繁项集的过程。
【1】
例3.表3-1是一个数据库的事务列表,在数据库中有9笔交易,即|D|=9。每
交易中的项按字典序存放,下面描述Aprior
i算法
表3-
1
数据库的事务列表
事务商品ID
列表事务商品ID
列表
T100 I1,I2,I5 T600 I2,I3
T200 I2,I4 T700 I1,I3
T300 I2,I3 T800 I1,I2,I3,I5
T400 I1,I2,I4 T900 I1,I2,I3
T500 I1,I3
设最小支持度计数为2,即min_sup=2,利用Apriori算法产生候选项集及频繁项集
的过程如下。
1)第一次扫描
扫描数据库
D
获得每个候选项的计数:
由于最小事务支持数为2,没有删除任何项目。可以确定频繁1-项集的集合L1,它
38
由具有最小支持度的候选1-项集组成。
2)第二次扫描
为发现频繁2-项集的集合L2,算法使用L1∞L1产生候选2-项集的集合C2。在剪枝
步骤没有候选从C2中删除,因为这些候选的每个子集也是频繁的。
3)第三次扫描
L2∞L2产生候选3-项集的集合C3。
候选3-项集的集合C3产生的详细地列表如下。
(1)连接:
C3=L2∞L2
={{I2},{I3},{I5},{I3},{I4},{I5}}∞
I1,I1,I1,I2,I2,I2,
{{I2},{I3},{I5},{I3},{I4},{I5}}
I1,I1,I1,I2,I2,I2,
={{I1,I2,I1,I5},{I3,I2,I4},{I3,
I3},{I2,I1,I5},{I3,I2,I5},
{I4,
I2,I5}}。
riorI1,
(2)使用Api性质剪枝:频繁项集的所有非空子集也必须是频繁的。例如,{
I3,I1,I5} I5 I3,I5}
I5}的2-项子集是{I3},{和{}。{不是L2 的元素,所以不是频
I1,I1,I5
I1,I3,
繁的。因此,从C3中删除{}。剪枝C3={{I3},{}}。
4)第四次扫描
I1,I3,I5 I2,I2,
算法使用L3∞L3产生候选4-项集的集合C4。L3∞L3={{I1,I2,I3,I5}}, 根据
Apriori性质,因为它的子集{I3,不是频繁的,所以这个项集被删除。这样C4=.,
I2,I5}
因此算法终止,找出了所有的频繁项集。
【例3.表3-riori算法发现
D
中的频繁
项集。
2】2为某超市销售事务数据库D,使用Ap
39
40
表3-2 某超市销售事务数据库
TID 商品ID 列表TID 商品ID 列表
T100 I1,I2,I5 T600 I2,I3
T200 I2,I4 T700 I1,I3
T300 I2,I3 T800 I1,I2,I3,I5
T400 I1,I2,I4 T900 I1,I2,I3
T500 I1,I3
事务数据库D 中有9个事务,即‖D ‖=9。超市中有5件商品可供顾客选择,即
I={I1,I2,I3,I4,I5} ,且‖I‖=5。设最小支持数minsup_count=2,则对应的最小支
持度为2/9=22%。
寻找所有频繁项集的过程如下。
41
3.4 Apriori算法源程序分析
#include
#include
#include
#include