关联规则挖掘的的目标是寻找达到某种程度联系的事物集合,再由其产生相关的关联规则。它并不考虑事物发生的先后顺序。
先作出下述定义:
I ={
i1, i2, …, im}是若干项目集合,包含k个项目的集合称为k项集;T = (t1, t2, …, tn)是若干事务集合。其中ti ⊆ I。
一个关联规则可表述成如下蕴含式形式:
X → Y,其中X ⊂ I, Y ⊂ I且X ∩ Y = ∅。 X、Y被称作项集,X为前件,Y为后件。
如果ti ∈ T是X的一个超集,则称ti 包含X,T中包含X的事务总数被称作支持计数(support count),可表示为X.count。
针对先前定义的I和T,下面定义规则支持度和规则可信度(规则为X → Y):
支持度(support):
其中n为事物级T中的事务总数。
可信度(confidence):
可信度表示在
项集X发生的前提下
项集Y发生的条件概率。可以由此推测在X出现的同时Y出现的可能性大小。
为了使获得的关联规则有价值,设置了最小支持度(minsup)和最小可信度(minconf),当某个关联规则
X → Y的支持度和可信度均不于
minsup和minconf时,则其为强关联规则。
关联规则挖掘则是找出当前事务集T中的全部强关联规则。当给定事务集T、minsup和minconf后,T中的全部强关联规则是唯一确定的。
注:minsup和minconf的值应可以根据经验设置
2.2 Apriori 算法
Apriori算法主要包含两个步骤,第一步生成全部频繁项集(支持度高于minsup的项集),第二步在频繁项集中生成所有的强关联规则(规则可信度不小于minconf)。
算法中出现的任一项集中项目按字典排序。
第一步
生成全部频繁项集算法如下:
Algorithm Apriori(T)
1 C1 ← init-pass(T);
2 F1 ← { f | f ∈ C1, f.count/n ≥ minsup};
3 for (k = 2; Fk−1 ≠ ∅; k++) do
4 Ck ← candidate-gen(Fk−1);
5 for each transaction t ∈ T do
6 for each candidate c ∈ Ck do
7 if c is contained in t then
8 c.count++;
9 endfor
10 endfor
11 Fk ← { c ∈ Ck | c.count/n ≥ minsup}
12 endfor
13 return F ← Uk Fk;
上述生成频繁集的算法需要逐级搜索(其中需要用到候选集生成函数candidate-gen生成候选集Ck)
1 C1 ← init-pass(T);
2 F1 ← { f | f ∈ C1, f.count/n ≥ minsup};
3 for (k = 2; Fk−1 ≠ ∅; k++) do
4 Ck ← candidate-gen(Fk−1);
5 for each transaction t ∈ T do
6 for each candidate c ∈ Ck do
7 if c is contained in t then
8 c.count++;
9 endfor
10 endfor
11 Fk ← { c ∈ Ck | c.count/n ≥ minsup}
12 endfor
13 return F ← Uk Fk;
上述生成频繁集的算法需要逐级搜索(其中需要用到候选集生成函数candidate-gen生成候选集Ck)
候选集和频繁集的生成顺序依次是C1 → F1→ C2→……→Fk ……直至Fk−1=∅。
其中C1和F1 先单独生成,5-10步筛选 Ck 中支持度不小于minsup的项集c加入Fk中(可以不用将所有数据一次性加入内存,每次仅加入一个事务集中的项集,使得该算法可以适应大规模数据集合,但同时也可能间接增加了I/O的次数,使得I/O负荷增大,处理时间增多),最后将所有生成的 Fk合并到F中 ,F即为T中全部频繁集的集合。
Function candidate-gen(Fk−1)
1 Ck ← ∅;
2 forall f1, f2 ∈ Fk−1
3 with f1 = { i1, … , ik−2, ik−1}
4 and f2 = { i1, … , ik−2, i’k−1}
5 and ik−1 < i’k−1 do
6 c ← { i1, …, ik−1, i’k−1};7 Ck ← Ck ∪ {c}; 8 for each (k−1)-subset s of c do9 if (s ∉ Fk−1) then10 delete c from Ck; 11 endfor12 endfor13 return Ck;候选集Ck 的生成利用了向下封闭属性(Downward Closure Property)进行筛选,先将Fk−1中的具有3、4、5步骤形式的项集对取出合并成c并加入 C k ,而后再用一个循环取出c中的所有 k-1 项子集,检测其是否在 F k−1中,如果不存在,则在Ck 中删除项集c。
1 Ck ← ∅;
2 forall f1, f2 ∈ Fk−1
3 with f1 = { i1, … , ik−2, ik−1}
4 and f2 = { i1, … , ik−2, i’k−1}
5 and ik−1 < i’k−1 do
6 c ← { i1, …, ik−1, i’k−1};7 Ck ← Ck ∪ {c}; 8 for each (k−1)-subset s of c do9 if (s ∉ Fk−1) then10 delete c from Ck; 11 endfor12 endfor13 return Ck;候选集Ck 的生成利用了向下封闭属性(Downward Closure Property)进行筛选,先将Fk−1中的具有3、4、5步骤形式的项集对取出合并成c并加入 C k ,而后再用一个循环取出c中的所有 k-1 项子集,检测其是否在 F k−1中,如果不存在,则在Ck 中删除项集c。
向下封闭属性:若一个项集是频繁的,则其所有非空子集也是频繁的。(由T中包含某频繁集的事物必包含此频繁集的子集可证)
故易知若一个项集不是频繁的,则其超集亦不是频繁的。此时即可将Ck 中不符合条件的项集删除。
(虽然应用了向下封闭属性,但如果频繁集的数目足够多,则生成的候选集中可能会含有大量的冗余非频繁项集)
当我们只对规模较小的频繁集感兴趣,如果网上商店货物推荐,某一商品下方列表只能列出很少数量的推荐物品(可以认为推荐物品与此商品同属于一个频繁集),一方面是由于网页大小限制,另一方面照顾顾客查看的便捷性。采用逐级搜索的方式可以将频繁集的搜素限制在某个规模范围内,可以节省时间和空间。
第二步根据频繁项集生成所有的强关联规则算法如下:
Algorithm genRules(F)
1 for each frequent k-itemset fk in F, k ≥ 2 do
2 output every 1-item consequent rule of fk with confidence ≥ minconf and
support ← fk.count / n
3 H1 ←{consequents of all 1-item consequent rules derived from fk above};
4 ap-genRules(fk, H1);
5 endfor
Procedure ap-genRules(fk, Hm)
1 if (k > m + 1) AND (Hm ≠ ∅) then
2 Hm+1 ← candidate-gen(Hm);
3 for each hm+1 in Hm+1 do
4 conf ← fk.count / (fk − hm+1).count;
5 if (conf ≥ minconf) then
6 output the rule (fk − hm+1) → hm+1 with confidence = conf and
support = fk.count / n;
7 else
8 delete hm+1 from Hm+1;
9 endfor
10 ap-genRules(fk, Hm+
1 for each frequent k-itemset fk in F, k ≥ 2 do
2 output every 1-item consequent rule of fk with confidence ≥ minconf and
support ← fk.count / n
3 H1 ←{consequents of all 1-item consequent rules derived from fk above};
4 ap-genRules(fk, H1);
5 endfor
Procedure ap-genRules(fk, Hm)
1 if (k > m + 1) AND (Hm ≠ ∅) then
2 Hm+1 ← candidate-gen(Hm);
3 for each hm+1 in Hm+1 do
4 conf ← fk.count / (fk − hm+1).count;
5 if (conf ≥ minconf) then
6 output the rule (fk − hm+1) → hm+1 with confidence = conf and
support = fk.count / n;
7 else
8 delete hm+1 from Hm+1;
9 endfor
10 ap-genRules(fk, Hm+