-
关联规则算法
Apriori
的学习与实现
p>
(2011-07-18 11:28:52)
首先我们来看,
什么是规则?规则形
如
”
如果
…
那
么
…(If…Then…)”,
前者为条件,后者为结
果。
关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系
。
关联规则揭示了
数据项间的未知的依赖关系,
根据所挖掘的关联关系,
可以从一个数据对象的信息来推断另
< br>一个数据对象的信息。例如购物篮分析。牛奶
?
面包
<
/p>
[
支持度:
3%
,置信度:
40%]
支持度
3%
p>
意味
3%
顾客同时购买牛奶和面包。置信度
40%
意味购买牛奶的顾客
40%
p>
也购买
面包。
规则的支持度和置信度是两个
规则兴趣度度量,
它们分别反映发现规则的有用性和确
定性。<
/p>
关联规则是有趣的,
如果它满足最小支持度阈值和最小置信度阈值
。
这些阈值可以由
用户或领域专家设定。
我们先来认识几个相关的定义:
定义
1
:
<
/p>
支持度(
support
)
支持度
s
是事务数据库<
/p>
D
中包含
A U B
的事务百分比,它是概率
P
(
A
U B
),即
support
(
A
B
)
=P
(
A
U B
),它描述了
A
和
B
这两个物品集的并集在所有的事务中出现的概率。
定义
2
:
<
/p>
置信度(
confidence
)
可信度为事务数据库
D
中包含
A
的事务中同时也包含
B<
/p>
的百分比,它是概率
P
(
B|A
)
,即
confide
nce
(
A B
)
=P
(
B|A
)。
定义
3
:
频繁项目集
支持度不小于用户给定的
最小支持度阈值(
minsup
)的项集称为频繁项目集(简称
频集),
或者大项目集。所有
的频繁
1-
项集记为
L
1
。
假设有如下表的购买记录。
顾客
1
2
3
4
5
项目
orange juice,
coke
milk, orange juice,
window cleaner
orange juice,
detergent
orange juice,
detergent, coke
window
cleaner
将上表整理一下,得到如下的一个
2
维表
Orange
Win Cl
Milk
Coke
Detergent
4
1
1
2
1
1
2
1
0
0
1
1
1
0
0
2
0
0
2
0
2
0
0
1
2
Orange
WinCl
Milk
Coke
Detergent
上表中横栏和纵
栏的数字表示同时购买这两种商品的交易条数。如购买有
Orange
< br>的交易数
为
4
,而同时购买
p>
Orange
和
Coke
< br>的交易数为
2
。
置信度表示了这条规则有多大程度上值得可信。设条件的项的集合为
A,
p>
结果的集合为
B
。
置信度计算在
A
中,同时也含有
B
p>
的概率。即
Confidence(A==>B)=P(B|A)<
/p>
。例如计算
如果
Orange
则
Coke
的置信度。<
/p>
由于在含有
Orange
的
4
条交易中,
仅有
2
条交易含有
Coke.
其置
< br>信度为
0.5
。
支持度计算在所有的交易集中,既有
A
又有
B
的概率。例如在
5
条
记录中,既有
Orange
又
有
Coke
的记录有
2
条。
则此条规则的支持度为
2/5=0.4
。
现在这条规则可表述为,
如果一个
顾客购买了
Orange,
则有
50
%
的可能购买
Coke
。
而这样的情况
(即买了
Orange
会再买
Coke
)
会有
40%
的可能发生。
再来考虑下述情况。
项
A
B
C
A and B
A and
C
B and C
A,B
,
and
C
支持度
0.45
0.42
0.4
0.25
0.2
0.15
0.05
可得到下述规则
规则
置信度
If B and C then A
0.05/0.15*100%=33.33%
If A and C then B
0.05/0.20*100%=25%
If A and B then C
0.05/0.25*100%=20%
上述的三条规则,哪一条规则有用呢?
对于规则
If B and C
then A
,同时购买
B
和
C
的人中,有
33.3
3%
会购买
A
。而单项
A
的支持度有
0.45
,也就
是说在所有交易中,会有
45%
的人购买
A.
看来使用这条规则来进行
推荐,还不如不推荐,随机对顾
客进荐好了。
为此引入另外一个量,即提升度
(Lift)
,以度量此规则是否可用。描述的是相对于不用规则,
使用规则可以提高多少。有用的规则的提升度大于
1
。计算方式为
Lift(A==>B)=Confidence(A==>B)/Su
pport(B)=Support(A==>B)/(Support(A)*Support(B))
。
在上
例中,
Lif
t(If B and C The A)=0.05/(0.15*0.45)=0.74
。而
Lift(If A then
B)=0.25/(
0.45*0.42)=1.32
。
也就是说对买了
A
的人进行推荐
B,
购买
概率是随机推荐
B
的
1.32
倍。
如何产生规则呢。可以分两步走。
首先找出频繁集
(frequent itemset)
。所谓频繁集指满足最小支持度或置信度的集合。其次从
频繁集中找出
强规则
(strong rules)
。强规则指既满足最小支
持度又满足最小置信度的规则。
我们来看如何产生频繁集。
这其中有
一个定理。即频繁集的子集也一定是频繁集。比如,如果
{A,B,C}
是一个
3
项的频
繁集,则其子
集
{A,B},{B,C},{A,C}
也一定是
2
项的频繁集。为方便,可以把含有
k
项的集
合称之为
k-itemsets.
下面以迭代的方式找出频繁集。
首先找出
1-i
temsets
的频繁集,
然后使用这个
1-itemsets
,
进
行组合,
找出
2-itemsets
的频繁集。如此下去,直到不再满足
最小支持度或置信度的条件为
止。
这其中重要的两步骤分别是连
接
(join)
和剪枝
(prune)
.
即从
(k-1)-itemsets
中的项进行组合,
产生备选集
(Candidate item
sets)
。再从备选集中,将不符合最小支持度或置信度的项删去。
< br>例如
Frequent
2-itemsets
I1,I2
I1,I4
I2,I3
I2,I4
==>
I1,I2,I4
I2,I3,I4
Candidate
3-itemsets
==>
I1,I2,I4
Frqquent
3-itemsets
下面我们再来看一个详细的例子。
设
最小支持度为
2
,以
C
k
表示
k-itemsets
备选集
,
以
L
k
表示
k-itemsets
频繁集。
ID
Items
Itemset
Sup.
count
I1
6
7
6
2
2
Itemset
I1
Itemset
I1,I2
100
I1,I2,I5
200
I2,I4
300
I2,I3
400
I1,I2,I4
500
I1,I3
600
I2,I3
700
I1,I3
800
I1,I2,I3,I5
900
I1,I2,I3
==>
C
1:
I2
I3
I4
I5
==>
L
1:
I2
I3
I4
I5
==>
C
2
I1,I3
I1,I4
I1,I5
I2,I3
I2,I4
I2,I5
I3,I4
I3,I5
I4,I5
对
C
2
进行扫描,计算支持度。
Itemset
Sup.
count
I1,I2
I1,I3
I1,I4
I1,I5
I2,I3
I2,I4
I2,I5
I3,I4
I3,I5
I4,I5
4
4
1
2
4
2
2
0
1
0
==>
L
2:
I1,I2
I1,I3
I1,I5
I2,I3
I2,I4
I2,I5
Itemset
==>
C
3
I1,I2,I3
2
I1,I2,I5
2
Itemset
Sup.
count
==>
L
3:
I1,I2,I3
I1,I2,I5
Itemset
< br>对于频繁集中的每一项
k-itemset,
可以产生非
空子集,对每一个子集,可以得到满足最小置
信度的规则了。例如考虑
< br>{I1,I2,I5}
。其子集有
{I1,I2},
{I1,I5}, {I2,I5}, {I1}, {I2}, {I5}
。可以
p>
产生规则,
{I1,I2}
??
{I5} (50%), {I1,I5}
??
{I2} (100%), {I2,I5}
??
{I1} (100%),{I1}
??
{I2,I5}
(33%),
{I2}
??
{I1,I5} (29%), {I5}
??
{I1,I2}
(100%)
。
也不是每个数据集都
有产生强规则。例如
和
一起可能很
难产生有效规则。因为恰好一起买这两个牌子的产品的顾客太少。但
不妨将
Thinkpad
notebook
< br>放到
Notebook
这一层次上考虑,而
Canon printer
放到
printer<
/p>
这一去层次上考虑。
这样的话,一起买
n
otebook
和
printer
的顾
客就较多了。也即
Multilevel association
rules
。
< br>自
1994
年由
Agrawal
等人提出的关联规则挖掘
Apriori
的算法从其产生到现在,
对关联规则
挖掘方面的研究有着很大
的影响。
Apriori
算法是一种最有影响的挖掘布尔关联
规则频繁项
集的算法。算法基于这样的事实:算法使用频繁项集性质的先验知识。
Apriori
使用一种称
作逐层搜索的迭
代方法,
k-
项集用于探索(
k
+1
)
-
项集。首先
,找出频繁
1-
项集的集合。该
集合记
作
L
1
。
L1
用于找频繁
2-
项集的集合
L2
,而
L2
用于找
L3
,如此下
去,直到不能找到
频繁
k
-
项集。找每个
Lk
需要
一次数据库扫描。为提高频繁项集逐层产生的效率,一种称作
Apriori
性质的重要性质用于压缩搜索空间。
为了提高频繁项目集逐层产生的效率,
Apriori
算法利用
了两个重要的性质用于压缩搜索空
间:
(
l
)若
X
是频繁项集,则
x
的所有子集都是频繁项集。
< br>
(
2
)若
x
是非频繁项集,则
X
的所有超集
都是非频繁项集。
算法:
Apriori
算法,使用逐层迭代找出频繁项集。
输入:事务数
据库
D
;最小支持度阈值
min_su
p
。
输出:
D
中的频繁项集
L
。
1
)
L1
= find_frequent_1_itemsets
(
D
);
2
)
for
(
k =
2
;
Lk-
1 ≠
;
k++
)
{
3
)
Ck
= aproiri_gen
(
Lk-1
,
min_sup
);
4
)
for
each transaction t D{ //scan D for count
5
)
Ct
= subset
(
Ck
,
t
);
//get
subsets of t that are candidates
6
)
for
each candidate c Ct
7
)
++
;
8
)
}
9
)
Lk={c Ck | ≥ min_sup}
10
)
}
11
)
return L =
∪
kLk
;
现举例说明:如表
1
所示为事务数据库
D
,设最小支持度为
20%
,挖掘频繁项集的具体过
程如表1所示。
p>
表
1
事务数据库
D
图1所示为
Apriori
算法挖掘频繁集的过程,其中最小支持度为
20%
。
图
1
Apriori
算法的执行流程
第一步,经过算法的第一次迭代,对事务数据库进行一次扫描
,计算出
D
中所包含的每个
项目出现的
次数,生成候选
1-
项集的集合
C
p>
1
。
第二步,根
据设定的最小支持度,从
C
1
中确定频
繁
1-
项集
L
1
。
第三步,由
L
1
产生候选
2-
项集
C
2
,然后扫描事务数据
库对
C
2
中的项集进行计数。
第四步,根据最小支持度,从候选集
C
2
中确定频繁集
L
2
。
第五步,由频繁
< br>2-
项集
L
2
< br>生成候选
3-
项集
C
3
,生成的候选
3-
项集
的集合
C
3
={{1
< br>,
2
,
3}
,
{1
,
3
,
5}
,
{2
,
3
,
5}}
,根据
Apriori
的性质剪枝:所有的频繁项集的子集都
是频繁的,项
集
{1
,
2
,
3}
的子集
{1
,
2}
不包含在频繁<
/p>
2-
项集
L2
中
,故删除
{1
,
2
,
3}
。项集
{1
,
3
,
5}
< br>的子集
{1
,
5}
也不包含在频繁
2-
项集
L
2
中,故删除
{1
,
3
,
5}
,项集
{2
,
3
,
5}
的所有子集
都是
L
2
的元素,故保留。
Apriori
算法的效率分析:
<
/p>
(
1
)
Apri
ori
性质能显著减少候选集的数目。事务数据库
TDB
总共有
4
个项目,因此可能
< br>的
2-
项集有
=6
个。正如本例所示,利用
Apriori
性质,我们只需要检查
4
个候选
2-
项集的
支持度。
Apri
ori
算法在
2
项集这个层次上剪枝率
达
33.3%
。
随着候选集的长度逐渐
增大,
可
能的组合数目也急剧增大,因此
Apriori
算法的剪枝效率也越来越高。
(
2
)
尽管
Apriori
能对大量候选集剪枝,
但是在大型的事
务数据库中,
仍然可能有大量的候
选集需要处理,并且这种操作
相当耗时。例如,如果事务数据库包含
10
6
< br>个项目,并且只有
1%
(即
10
4
)的项目是频繁的,
Apriori
需要产生超过
10
7
< br>个候选
2-
项集,扫描数据库计算它
们的支持度,生成
L
2
以产生候选
3-
项集。
(
3
)反复地扫描数据库、计算候选集的支持度,再生成新的长
度加
1
的候选集,
Apriori
p>
算
法是冗长乏味的,尤其是当存在长模式的时候。
< br>Apriori
是一种产生候选集,然后检测其支
持度的
算法。为挖掘频集
X ={x
1
,
p>
x
2
…
,
x
100
} . Apriori
需要扫描数据库
100
次。
针对
Apriori
算法存在的缺点,
人们对
Apriori
算法进行了多方
面的改进,
希望能够找出一个
高效、可靠的挖掘频繁项集的算法
。这些算法大多是以
Apriori
为核心,或是其变体,或是
其扩展。如增量更新算法、并行算法等
下面是使用
Java
语言实现的
Apriori
算法,实现了
p>
AprioriAlgorithm
类,包含了频繁项集的
挖掘过程和频繁关联规则的挖掘过程。
另外
,有一个辅助类
ProperSubsetCombination
用于计算一个频繁项集的真子集,采用组合
原理,基于数值编码原理实现的组合求解
集合的真子集。
算法实现
(一)核心类
Apriori
算法的核心实现类为
AprioriAlgorithm
,实现的
Java
代码如下所示:
< br>
package ation;
import p;
import t;
import or;
import
import
import p;
public
class AprioriAlgorithm {
private
Map
事务数据库
private
Float minSup; //
最小支持度
private Float minConf; //
最小置信度
private
Integer txDatabaseCount; //
事务数据库中的事务数
private Map
频繁项集集合
private Map
频繁关联规则集合
public
AprioriAlgorithm(Map
{
base =
txDatabase;
= minSup;
f = minConf;
baseCount = ();
freqItemSet
= new TreeMap
assiciationRules = new
HashMap
}
public
Map
Map
Map
Iterator<
while(t()) {
//
计算支持度
Float supported = new Float(ue().toString())/new
Float(txDatabaseCount);
if(supported>=minSup) {
((), supported);
}
}
return
freq1ItemSetMap;
}
public Map
Map
Iterator<
//
统计支持数,生成候选频繁
1-
项集
while(t()) {
Set
for(String item : itemSet) {
Set
(());
if(!nsKey(key)) {
Integer value = 1;
(key, value);
}
else {
Integer value = 1+(key);
(key, value);
}
}
}
return candFreq1ItemSetMap;
}
public
Set
Set
Iterator
Set
while(t()) {
originalItemSet =
();
Iterator
while(t()) {
Set
两个项集相同元素的集合
(
集合的
交运算
)
(originalItemSet);
Set
All(set); // identicalSet
中剩下的元素是
identicalSet
与
set
< br>集合中公有的
元素
if(() == m-1) { // (k-1)-
项集中
k-2
个相同
Set
两个项集不同元素的集合
(
集合
的差运算
)
(originalItemSet);
All(set); //
因为有
k-2
个相同,
则
differentSet
中一定剩下一个元素,
即
differentSet
大小为
1
(set); //
构造候选
k-
项
集的一个元素
(set
大小为
k-1,
differentSet
大小
为
k)
(differentSet); //
< br>加入候选
k-
项集集合
}
}
}
return
candFreqKItemSet;
}
private Iterator
{
Iterator
while(t()) {
if((())) {
break;
}
}
return it;
}
public
Map
Map
//
调用
aprioriGen
方法,得到候选频繁
k-
项集
Set
//
扫描事务数据库
Iterator<
//
统计支持数
while(t())
{
Iterator
while(t()) {
Set
Set
(kSet);
All(ue()); //
候选频繁
k-
项集与事务数据库中元素做差元算
if(y()) { //
如果拷贝
set
为空,支持数加
1
if((kSet) == null) {
Integer
value = 1;
(kSet, value);
}
else {
Integer value =
1+(kSet);
(kSet, value);
}
}
}
}
//
计算支持度,生成频繁
k-
p>
项集,并返回
return
support(candFreqKItemSetMap);
}
-
-
-
-
-
-
-
-
-
上一篇:【冷知识】几乎所有食物的英文翻译
下一篇:防爆挠性管的连接方式及其分类