关联分析(association analysis) 用于发现隐藏在大型数据集中有意义的联系,所发现的联系可以用关联规则或者频繁项集的形式表示
以购物篮数据集为例
TID | 面包 | 牛奶 | 尿布 | … |
---|---|---|---|---|
1 | 1 | 1 | 0 | … |
2 | 1 | 0 | 1 | … |
… | ||||
5 | 1 | 1 | 1 | … |
令 I = { i 1 , i 2 , … , i d } I=\{i_1,i_2,\ldots,i_d\} I={i1,i2,…,id}表示所有项的集合, T = { t 1 , … , t N } T=\{t_1,\ldots,t_N\} T={t1,…,tN}表示所有事务的集合。在关联分析中包含0个或多个项的集合被称为项集(itemset).如果一个项集包含k个项,则称他为k-项集。事物的宽度定义为事务中出现的项的个数。项集的另一个重要性质是支持度系数,即包含特定项集的事务数,可以表示为: σ ( X ) = ∣ { t i ∣ X ⊆ t i , t i ∈ T } ∣ \sigma(X)=|\{t_i|X \subseteq t_i,t_i\in T\}| σ(X)=∣{ti∣X⊆ti,ti∈T}∣其中|·|表示为集合中元素的个数。
关联规则是形如 X → Y X\to Y X→Y的蕴含表达式,其中X和Y是不相交的项集。关联规则的强度可以用支持度(support)和置信度(confince)度量.支持度可以用于给定数据集的频繁程度,而置信度确定Y在包含X的事务中出现的频繁程度。 s ( X → Y ) = σ ( X ∪ Y ) N c ( X → Y ) = σ ( X ∪ Y ) σ ( X ) s(X\to Y)=\frac{\sigma(X\cup Y)}{N}\\ c(X\to Y)=\frac{\sigma(X\cup Y)}{\sigma(X)} s(X→Y)=Nσ(X∪Y)c(X→Y)=σ(X)σ(X∪Y)支持度低的规则可能是偶然出现的,置信度低的规则Y,在出现X的事务中出现的可能性较低。
关联规则挖掘任务分解为两个子任务
通过格结构(lattice structure)来枚举可能的项集,经过每个候补项集与事务进行比较筛选出频繁项集。
为了减少频繁项集的计算复杂度:
如果一个项集是频繁的,那么他的所有子集一定也是频繁的。相反如果一个项集是非频繁的,那么他的超集一定也是非频繁的。
一旦发现一个项集是非频繁的,整个包含它的超集的子图可以被立刻剪枝。这种基于支持度度量剪枝的策略称为基于支持度的剪枝。这种策略依赖于一个关键性质,即一个项集的支持度绝不会超过它的子集的支持度
| k = 1 k=1 k=1
| F k = { i ∣ i ∈ I ∧ σ { i } ≥ N × m i n s u p } F_k=\{i|i\in I\land\sigma\{i\}\ge N\times minsup\} Fk={i∣i∈I∧σ{i}≥N×minsup} ( 发 现 所 有 的 频 繁 1 − ∣ 项 集 ) (发现所有的频繁1-|项集) (发现所有的频繁1−∣项集)
| r e p e a t repeat repeat
| k = k + 1 \quad k=k+1 k=k+1
| C k = a p r i o r i − g e n ( F k − 1 ) \quad C_k=apriori-gen(F_{k-1}) Ck=apriori−gen(Fk−1) ( 产 生 候 选 项 集 ) (产生候选项集) (产生候选项集)
| f o r 每 个 事 务 t ∈ T d o \quad for 每个事务t∈T do for每个事务t∈Tdo
| C i = s u b j e c t ( C k , t ) \qquad C_i=subject(C_k,t) Ci=subject(Ck,t) ( 识 别 属 于 t 值 的 所 有 候 选 ) (识别属于t值的所有候选) (识别属于t值的所有候选)
| f o r 每 个 候 选 项 集 c ∈ C t \qquad for 每个候选项集c \in C_t for每个候选项集c∈Ct do
| σ ( c ) = σ ( c ) + 1 \qquad \sigma(c)=\sigma(c)+1 σ(c)=σ(c)+1 ( 支 持 度 计 数 增 值 ) (支持度计数增值) (支持度计数增值)
| e n d f o r \qquad end\ for end for
| e n d f o r \quad end\ for end for
| F k = { c ∣ c ∈ C k ∧ σ ( c ) ≥ N × m i n s u p } ( 提 取 频 繁 k − 项 集 ) \quad F_k=\{c|c\in C_k \land \sigma(c)\ge N \times minsup\}(提取频繁k-项集) Fk={c∣c∈Ck∧σ(c)≥N×minsup}(提取频繁k−项集)
| u n t i l F k = ϕ until\ F_k=\phi until Fk=ϕ
| R e s u l e t = ∪ F k Resulet =\cup F_k Resulet=∪Fk
上述算法中有一个apriori-gen函数,它通过如下两个步骤产生候选项集
我们可以让每一个项集与每一个事务比较并更新支持度计数,但这样计算量太大,因此我们有另一种方法。
枚举每个事务所包含的项集,并利用他们更新对应的候选项集的支持度
枚举只需要按次序逐层进行即可。下面我们讨论一种支持度计数的方法
在apriori算法中,把候选项集划分为不同的桶,并存放在Hash树中。树的每个内部节点都用哈希函数来确定应当沿着当前节点的那个分支向下。因此,树的叶节点存放的是候选项集。然后呢,我们再把一个事务按照哈希函数散列下去,这样事务所包含的k-项集也落入了各个桶中。在各个桶内,把候选项集与事务散列下去的项集进行比较,如果是该事物的子集,就增加它的**支持度计数。**注意这种方法不是将事务中每个项集与所有的候选项集进行比较,而是将它与同一桶内的候选项集进行匹配。
可以粗浅的理解为,事务子集与候选项集按照统一规则沿不同分支向下,最终得以完全匹配比较。建议读者对Hash树的原理进行学习,这里不做进一步讲解
Apriori算法的计算复杂度受到如下因素影响。
支持度阈值:支持度阈值越低,频繁项集越多
项数(维度):随着项数的增加,需要更多的空间来存储项的支持度计数。频繁项集也更多
事务数:算法扫描数据集次数
事物的平均宽度:频繁项集的最大长度随之增大而增大,其次随着事务宽度的增加,事务中包含更多项集,这将增加支持度计数时Hash树遍历次数
下面分析算法的时间复杂度
1-频繁项集的产生:假定w是事物的平均宽度,则该操作所需要的 时间为O(Nw),其中N为事务总数。
候选的产生:为了产生候选k-项集,需要合并一对频繁k-1项集,确定他们是否有k-2个项相同。每次合并至多需要k-2次相等比较。合并的总开销为 ∑ k = 2 w ( k − 2 ) ∣ C k ∣ < 合 并 开 销 < ∑ k = 2 w ( k − 2 ) ∣ F k − 1 ∣ 2 \sum_{k=2}^w(k-2)|C_k|\lt 合并开销 \lt \sum_{k=2}^{w}(k-2)|F_{k-1}|^2 k=2∑w(k−2)∣Ck∣<合并开销<k=2∑w(k−2)∣Fk−1∣2因为最坏的情况下,第一个项集与前k-2个项集比较后都不匹配,当匹配到第k-1个时匹配,k-1个项集中的每个项集都匹配k-1次
Hash树在候选产生时构造,以存放候选集。由于Hash树最大深度为k,将候选项集散列到Has树的开销为 O ( ∑ k = 2 w k ∣ C k ∣ ) O(\sum_{k=2}^{w}k|C_k|) O(∑k=2wk∣Ck∣).由于在Hash树上查找一个候选的花费是 O ( k ) O(k) O(k),在候选项剪枝过程中,需要检验每个候选k-项集的k-2个子集是否频繁。因此,候选剪枝需要的时间是:
O ( ∑ k = 2 w k ( k − 2 ) ∣ C k ∣ ) O(\sum_{k=2}^wk(k-2)|C_k|) O(k=2∑wk(k−2)∣Ck∣)
支持度计数:支持度计数的总开销为 O ( N ∑ k C w k α k ) O(N\sum_kC_w^k\alpha_k) O(N∑kCwkαk),其中w是事物的最大宽度, α k \alpha_k αk是更新哈希树中一个候选k-项集的支持度计数的开销
本节介绍如何有效地从给定的频繁项集中提取关联规则。关联规则提取的方式之一是:把频繁项集一分为二,使得X→Y-X满足置信度阈值
定理:如果规则X→Y-X不满足置信度阈值,那么X’→Y-X’也不满足,其中X‘是X的一个子集。
A p r i p r i 算 法 中 规 则 的 产 生 Apripri 算法中规则的产生 Apripri算法中规则的产生
f o r 每 一 个 频 繁 k − 项 集 f k , k ≥ 2 , d o for\ 每一个频繁k-项集f_k,k\ge2,do for 每一个频繁k−项集fk,k≥2,do
H i = { i ∣ i ∈ f k } { 规 则 的 1 − 项 后 件 } \quad H_i=\{i|i\in f_k\}\qquad \{规则的1-项后件\} Hi={i∣i∈fk}{规则的1−项后件}
c a l l a p − g e n r u l e s ( f k , H 1 ) \quad call\ ap-genrules(f_k,H_1) call ap−genrules(fk,H1)
e n d f o r end for endfor
a p − g e n r u l e s ( f k , H m ) 函 数 步 骤 ap-genrules(f_k,H_m)函数步骤 ap−genrules(fk,Hm)函数步骤
k = ∣ f k ∣ { 频 繁 项 集 的 大 小 } k=|f_k| \qquad\{频繁项集的大小\} k=∣fk∣{频繁项集的大小}
m = ∣ H m ∣ { 规 则 后 件 的 大 小 } m=|H_m|\qquad \{规则后件的大小\} m=∣Hm∣{规则后件的大小}
i f k > m + 1 t h e n if\ k\gt m+1\ then if k>m+1 then
H m + 1 = a p r i o r i − g e n ( H m ) { 候 选 项 集 产 生 } \quad H_{m+1}=apriori-gen(H_m)\qquad\{候选项集产生\} Hm+1=apriori−gen(Hm){候选项集产生}
f o r 每 个 h m + 1 ∈ H m + 1 d o \quad for\ 每个h_{m+1}\in H_{m+1} do for 每个hm+1∈Hm+1do
c o n f = σ ( f k ) / σ ( f k − h m + 1 ) \qquad conf=\sigma(f_k)/\sigma(f_k-h_{m+1}) conf=σ(fk)/σ(fk−hm+1)
i f c o n f ≥ m i n c o n f t h e n \qquad if\ conf\ge minconf\ then if conf≥minconf then
o u t p u t : 规 则 ( f k − h m + 1 ) → h m + 1 \qquad \quad output:规则(f_k-h_{m+1})\to h_{m+1} output:规则(fk−hm+1)→hm+1
e l s e \qquad else else
从 H m + 1 d e l e t e h m + 1 \qquad \quad 从H_{m+1}\ delete\ h_{m+1} 从Hm+1 delete hm+1
e n d i f \qquad end\ if end if
e n d f o r \quad end for endfor
c a l l a p − g e n r u l e s ( f k , H m + 1 ) \quad call ap-genrules(f_k,H_{m+1}) callap−genrules(fk,Hm+1)
e n d i f end\ if end if
定义:极大频繁项集(maximal frequent itemset)的直接超集都不是频繁的。
极大频繁项集形成了所有频繁项集的最小的项集的集合。它提供了频繁项集的边界。如果我们找到一种算法,可以直接发现极大频繁项集而不需要枚举它所有的子集,那么它能极大的减少计算量,事实证明我们可以找到,在后文将会提到。
定义:闭项集(closed itemset),它的直接超集都不具有和它相同的支持度计数。换句话说,如果至少存在一个X的直接超集,其支持度计数与X相同,X就不是闭的。
定义:闭频繁项集指一个项集是闭的而且支持度大于等于最小支持度阈值。
我们可以使用闭频繁项集来进行”从特殊到一般“的支持度计数。
下面给出伪代码
设 C 是 闭 频 繁 项 集 的 的 集 合 设C是闭频繁项集的的集合 设C是闭频繁项集的的集合
设 k m a x 是 闭 频 繁 项 集 的 最 大 长 度 设k_{max}是闭频繁项集的最大长度 设kmax是闭频繁项集的最大长度
F k m a x = { f ∣ f ∈ C , ∣ f ∣ = k m a x } % { 找 出 长 度 为 k m a x 的 所 有 频 繁 项 集 , 从 特 殊 到 一 般 } F_{k_{max}}=\{f|f\in C,|f|=k_{max} \}\\\%\{找出长度为k_{max}的所有频繁项集,从特殊到一般\} Fkmax={f∣f∈C,∣f∣=kmax}%{找出长度为kmax的所有频繁项集,从特殊到一般}
f o r k = k m a x − 1 d o w n t o 1 d o for\ k=k_{max}-1\ downto\ 1\ do for k=kmax−1 downto 1 do
F k = { f ∣ f ⊂ F k + 1 , ∣ f ∣ = k } % { 找 出 长 度 为 k 的 所 有 频 繁 项 集 } \quad F_k=\{f|f\subset F_{k+1},|f|=k\}\\\quad\%\{找出长度为k的所有频繁项集\} Fk={f∣f⊂Fk+1,∣f∣=k}%{找出长度为k的所有频繁项集}
每 个 f ∈ F k d o \quad 每个f\in F_k\ do 每个f∈Fk do
i f f ∉ C t h e n \qquad if\ f\notin C\ then if f∈/C then
f . s u p p o r t = m a x { f ′ . s u p p o r t ∣ f ′ ∈ F k + 1 , f ⊂ f ′ } \qquad \quad f.support=max\{f'.support|f' \in F_{k+1},f\subset f'\} f.support=max{f′.support∣f′∈Fk+1,f⊂f′}
% { 非 闭 频 繁 项 集 的 支 持 度 一 定 等 于 它 的 超 集 的 最 大 支 持 度 } \qquad \quad\%\{非闭频繁项集的支持度一定等于它的超集的最大支持度\} %{非闭频繁项集的支持度一定等于它的超集的最大支持度}
e n d i f \qquad end\ if end if
e n d f o r \quad end for endfor
e n d f o r end for endfor
值得一提的是,如果使用闭频繁集产生规则,则不会产生冗余规则。
冗余规则:对于关联规则X’→Y’,如果和另一个规则X→Y的支持度和置信度都相同,其中X‘是X的子集,Y’是Y的子集,我们称关联规则X→Y是荣誉的。
最后我们总结出一个包含关系。
频繁项集包括闭频繁项集包括极大频繁项集
对于稠密数据集,由于事务和数据宽度增加,Apriori算法性能显著降低。我们下面简略描述一些替代方法
项集格遍历:概念上我们可以把频繁项集的搜索看做遍历项集格。根据频繁项集在格中的布局,我们需要灵活采取不同的搜索策略。
该算法不同于Apriori算法,它使用一种称作FP树的紧凑数据结构组织数据,并从该结构中提取频繁项集。
FP树是一种输入数据的压缩表示,他通过逐个读入事务,并把事务映射到FP树中的一条路径来构造。由于不同的事务有相同的项,因此路径可能重叠,重叠越多,压缩的效果越好。如果FP树足够小,能够存放到内存中,就可以直接从这个内存中的结构提取频繁项集,而不必重复的扫描存放在硬盘上的数据。
FP增长是一种自底向上方式探索树。这种用于发现以某一个特定项结尾的频繁项集的自底向上策略等价于6.5节介绍的基于后缀的方法。
由于每个事务都映射到FP树中的一条路径,因而通过仅考察特定节点(比如e)的路径,就可以发现以e结尾的频繁项集。使用与e结点相关联的指针,可以快速访问这些路径。
FP增长采用的分治策略将一个问题分解为较小的子问题,从而发现以某个特定后缀结尾的所有频繁项集。
以考察所有以e结尾的频繁项为例
这解释了FP增长算法中的分治方法,每一次递归都要通过更新前缀路径中的支持度计数和删除非频繁的项来构建条件FP树。
FP树增长是一个有趣的算法,他展示了如何使用事务数据集的压缩表示来有效地产生频繁项集。压缩的越狠算法越快,它可能比Apriori算法快好几个数量级。
仅凭借支持度和置信度可以产生合乎标准的模式数以千计,因此我们需要更有用的评估标准来筛选优质的模式。
第一组标准可以通过统计论据建立。涉及相互独立的项或覆盖少量事务的模式被认为是不令人感兴趣的,因为他们可能反映数据中的伪联系。这些模式可以使用客观兴趣度量来排除,比如支持度、置信度和相关性
第二组标准可以通过主观论据建立。即模式被主观的认为是无趣的,除非他能够结实料想不到的信息。
比如通过 可视化、基于模板的方法、主观兴趣度度量等方法
客观度量常常基于相依表中列出的频度来计算
B B B | B ˉ \bar{B} Bˉ | ||
---|---|---|---|
A A A | f 11 f_{11} f11 | f 10 f_{10} f10 | f 1 + f_{1+} f1+ |
A ˉ \bar{A} Aˉ | f 01 f_{01} f01 | f 00 f_{00} f00 | f 0 + f_{0+} f0+ |
f + 1 f_{+1} f+1 | f + 0 f_{+0} f+0 | N |
置信度的缺点,就是置信度度量忽略了规则后件中项集的支持度
为了避免支持度置信度框架的局限性,我们介绍一些其他的度量;
兴趣因子为解决置信度度量忽略了规则后件中出现的项集的支持度,高置信度规则可能出现误导的问题。引入一种称作提升度(lift)的度量:
l i f t ( A → B ) = c ( A → B ) s ( B ) lift(A\to B)=\frac{c(A\to B)}{s(B)} lift(A→B)=s(B)c(A→B)它计算规则置信度和规则后件中项集的支持度之间的比率。对于二元变量,提升度等价于另一种称作兴趣因子的客观度量定义如下: I ( A , B ) = s ( A , B ) s ( A ) × s ( B ) = N f 11 f 1 + f + 1 I(A,B)=\frac{s(A,B)}{s(A)\times s(B)}=\frac{Nf_{11}}{f_{1+}f_{+1}} I(A,B)=s(A)×s(B)s(A,B)=f1+f+1Nf11兴趣因子比较模式的频率与统计假定下计算的基线频率。对于两相互个独立的变量,基线频率为:
f 11 N = f 1 + N × f + 1 N \frac{f_{11}}{N}=\frac{f_{1+}}{N}\times \frac{f_{+1}}{N} Nf11=Nf1+×Nf+1该算式从使用简单比例作为概率估计的标准方法得到。左边是联合概率P(A,B)的估计,右边分别是P(A),P(B)的估计。兴趣因子可做如下解释:如果 I ( A , B ) I(A,B) I(A,B)等于1则是独立的,大于1是正相关的,小于1是负相关的。
相关分析:对于二元变量,相关度可以用 ϕ \phi ϕ系数度量 ϕ = f 11 f 00 − f 01 f 10 f 1 + f + 1 f 0 + f + 0 \phi=\frac{f_{11}f_{00}-f_{01}f_{10}}{\sqrt{f_{1+}f_{+1}f_{0+}f_{+0}}} ϕ=f1+f+1f0+f+0f11f00−f01f10
相关分析的局限性在于它把项在事务中同时出现和同时不出现看做同等重要。
IS度量同于处理非对称二元变量。度量定义如下:
I S ( A , B ) = I ( A , B ) × s ( A , B ) = s ( A , B ) s ( A ) s ( B ) IS(A,B)=\sqrt{I(A,B)\times s(A,B)}=\frac{s(A,B)}{\sqrt{s(A)s(B)}} IS(A,B)=I(A,B)×s(A,B)=s(A)s(B)s(A,B)当模式的兴趣因子和模式支持度都很大时IS也很大。
可以证明IS在数学上等价与二元变量的余弦度量。也可以表示为从一对二元变量中提取出的关联规则的置信度的几何均值:
I S ( A , B ) = s ( A , B ) s ( A ) × s ( A , B ) s ( B ) = c ( A → B ) × c ( B → A ) IS(A,B)=\sqrt{ \frac{s(A,B)}{s(A)}\times \frac{s(A,B)}{s(B)}}=\sqrt{c(A\to B)\times c(B\to A)} IS(A,B)=s(A)s(A,B)×s(B)s(A,B)=c(A→B)×c(B→A)
IS度量的局限性:一对相互独立的A,B及时不相关或负相关的模式,IS值也有可能很大。
对同一组实例,不同的度量值可能会有不同的秩
反演性:客观度量M在反演操作下是不变的。反演指反转位向量。
零加性:客观度量M在零加操作下是不变的,如果增加 f 00 f_{00} f00而保持相依表中所有其他频度不变并不影响M值。
缩放不变性:客观度量M在行、列缩放操作下是不变的。
不同的度量值具有某种性质,在应用是要注意讨论,选择最适合的度量值。
辛普森悖论:在某些情况下,隐藏的变量可能会导致观察到的一对变量之间的联系出现不一样的结果(即没有对条件考虑全面);数据需要适当的分层,考虑到更现实的条件才能得到正确的结论
倾斜支持度对关联分析算法的性能和提取模式的质量有重要影响。
倾斜支持度分布:但大多数项具有低频率,少数项具有很高的频率
规则也是对项的一种相关关系的度量
交叉支持模式:高频项和低频项相关联的虚假模式,其间的相关关系很小,但是支持度阈值的降低使其模式被挖掘;置信度很难区别从是否为交叉支持模式中提取的规则
支持度模式是一个项集X={i1,i2,…ik} r ( X ) = m i n [ s ( i 1 ) , . . . , s ( i k ) ] m a x [ s ( i 1 ) , . . . , s ( i k ) ] r(X)=\frac{min[s(i_1),...,s(i_k)]}{max[s(i_1),...,s(i_k)]} r(X)=max[s(i1),...,s(ik)]min[s(i1),...,s(ik)]小于值得的阈值 h c h_c hc
我们可以通过检查由给定项集提取的最低置信度规则来检测交叉支持模式。从频繁项集得到的最低置信度为:
s ( i 1 , … , i k ) m a x [ s ( i 1 ) , … , s ( i k ) ] \frac{s({i_1,\ldots,i_k})}{max[s(i_1),\ldots,s(i_k)]} max[s(i1),…,s(ik)]s(i1,…,ik)这个表达式又称h置信度或全置信度,通过确保模式的h置信度超过 h c h_c hc就可以消除交叉支持模式,此外,h置信度能够去报项集中的项之间是强关联的。