相关概念
1.关联分析
全球零售巨头沃尔玛分析消费者购物行为时偶然发现男性顾客同时购买啤酒和尿布的比例较高,于是通过将啤酒和尿布捆绑销售的方式提高了两者的销量。这种用于发现隐藏在大型数据集中的有意义联系的分析方法即是关联分析association analysis
,所发现的规则可以用关联规则association rule
或频繁项集的形式表示:
{
尿布
}
→
{
啤酒
}
\{\text{尿布}\} \rightarrow\{\text{啤酒}\}
{尿布}→{啤酒}
2.购物篮数据
许多企业在日复一日的运营中积累了大量的数据,比如商店收银台每天收集的大量顾客购物数据。有一类数据,每一行对应着一个事务,这类数据通常被称为购物篮数据market basket transactiontcd
3.二元表示
购物篮数据可以用二元形式表示,其中每个事务中有多个项。项可以用二元变量表示,如果项在事务中出现则它的值为1,否则为0。
因为通常认为项在事务中出现比不出现更重要,所以项是非对称
asymmetric
二元变量。
典型的购物篮数据及其二元表示如下:
4.项集和支持度计数
令
I
=
{
i
1
,
i
2
,
.
.
.
,
i
d
}
I=\{i_1,i_2,...,i_d\}
I={i1,i2,...,id}是购物篮数据中所有项的集合,而
T
=
{
t
1
,
t
2
,
.
.
.
,
t
N
}
T=\{t_1,t_2,...,t_N\}
T={t1,t2,...,tN}是所有事务的集合。在关联分析中,包含
0
0
0个或多个项的集合被称为项集itemset
。如果一个项集包含
k
k
k个项则称为
k
k
k项集。
如果项集
X
X
X是事务
t
j
t_j
tj的子集,则称事务
t
j
t_j
tj包含项集
X
X
X。项集的一个重要性质就是它的支持度计数,即包含特定项集的事务个数。数学上,项集
X
X
X的支持度计数
σ
(
X
)
\sigma(X)
σ(X)表示为:
σ
(
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∣
5.关联规则:支持度与置信度
关联规则association rule
指的是形如
X
→
Y
X \rightarrow Y
X→Y的蕴涵表达式,其中$X \cap Y = \varnothing $。衡量关联规则强度可以用它的支持度support
和置信度confidence
来表示:
- 支持度:确定规则可以用于给定数据集的频繁程度
- 置信度:确定 Y Y Y在 X X X中出现的频繁程度
s ( X → Y ) = σ ( X ∪ Y ) N c ( X → Y ) = σ ( X ∪ Y ) σ ( X ) s(X \rightarrow Y) = \frac{\sigma(X \cup Y)}{N} \\ c(X \rightarrow Y) = \frac{\sigma(X \cup Y)}{\sigma(X)} s(X→Y)=Nσ(X∪Y)c(X→Y)=σ(X)σ(X∪Y)
支持度主要是用于删去无意义的规则(说明这些规则可能是偶然出现),置信度衡量推理出的规则的可靠性。对于给定的规则 X → Y X \rightarrow Y X→Y,置信度越高, Y Y Y包含在 X X X中的可能性也就越大。置信度可以估计 Y Y Y在 X X X给定情况下的条件概率。
6.关联规则发现
给定事务的集合
T
T
T,关联规则发现指的是找出支持度大于等于minsup
并且置信度大于等于minconf
的所有规则。
挖掘关联规则的原始做法是:计算每个可能规则的支持度和置信度。但是从数据集提取的规则的数目达指数级别(包含 d d d个项的数据集提取的可能规则总数为 R = 3 d − 2 d + 1 + 1 R=3^d-2^{d+1}+1 R=3d−2d+1+1),因此这种做法的代码极高。
一种可靠的提高关联规则算法性能的方法将关联规则挖掘任务拆分为如下的两个子任务:
- 频繁项集产生:发现满足最小支持度阈值的所有项集,这些项集被称为频繁项集
frequent itemset
- 规则的产生:目标是从上一步中发现的频繁项集中提取所有高置信度的规则,这些规则被称为强规则
strong rule
通常频繁相机产生所需的计算开销远大于产生规则所需的计算开销
频繁项集的产生
一般包含
k
k
k个项的数据集可能产生
2
k
−
1
2^k-1
2k−1个频繁项集(不包括空集)。当
k
k
k足够大时,需要搜索的项集空间是指数规模的。下图展示了
I
=
{
a
,
b
,
c
,
d
}
I=\{a, b, c, d\}
I={a,b,c,d}的项集格结构lattice structure
。
最笨的方法是挨个确定格结构中每个候选项集candidate itemset
的支持度计数,需要进行
O
(
N
M
w
)
\mathcal{O}(NMw)
O(NMw)次比较,其中
N
N
N表示事务数,
M
=
2
k
−
1
M=2^k -1
M=2k−1表示候选项集数,
w
w
w是事务的最大宽度。
有如下方法可以降低产生频繁项集的计算复杂度:
- 减少候选项集的数目
M
M
M,比如下文介绍的先验
apriori
原理,可以不用计算支持度值而删除某些候选项集 - 减少比较次数:替代将每个候选项集和每个事务相匹配的方法,可以使用更高级的数据结构或者存储候选项集或者压缩数据集来减少比较次数
1.先验原理
先验原理:如果一个项集是频繁的,则它的所有子集都是频繁的;如果一个项集是非频繁的,则它的所有超集也一定是非频繁的。
2.Apriori
算法的频繁项集产生
令 C k C_k Ck为候选 k k k项集的集合,而 F k F_k Fk为频繁 k k k项集集合,先验算法可表示为:
- 确定每个项的支持度,得到频繁 1 1 1项集的集合 F 1 F_1 F1
- 使用上一次迭代发现的频繁 k − 1 k-1 k−1项集产生新的候选 k k k项集
- 确定候选项的支持度计数,删去支持度计数小于
minsup
的所有候选项集 - 当没有新的频繁项集产生,即 F k = ∅ F_k = \varnothing Fk=∅时算法结束
3.计算复杂度
Apriori
算法的计算复杂度受如下因素影响:
- 支持度阈值:降低支持度阈值通常将导致更多的频繁项集,算法需要扫描数据集的次数也将增多
- 项数(维度):随着项数的增加,需要更多的空间存储箱的支持度计数
- 事务数:由于该算法需要反复扫描数据集,因此它的运行时间随着事务数增加而增加
- 事务的平均宽度:一方面频繁项集的最大长度随着事务平均宽度增加而增加,另一方面也会增加支持度计数时
Hash
树的遍历次数
规则产生
忽略前件或者后件为空的规则( ∅ → Y \varnothing \rightarrow Y ∅→Y或 Y → ∅ Y \rightarrow \varnothing Y→∅),每个频繁项集可以产生多达 2 k − 2 2^k-2 2k−2个关联规则。关联规则可以这样提取:将项集 Y Y Y划分为两个非空的子集 X X X和 Y − X Y-X Y−X,使得 X → Y − X X \rightarrow Y-X X→Y−X满足置信度阈值即可。
如果规则 X → Y − X X \rightarrow Y-X X→Y−X不满足置信度阈值,则形如 X ′ → Y − X ′ X' \rightarrow Y-X' X′→Y−X′的规则也一定不满足置信度阈值,其中 X ′ X' X′是 X X X的子集。
1.基于置信度的剪枝
定理:如果 X → Y − X X \rightarrow Y-X X→Y−X不满足置信度阈值,则形如 X ′ → Y − X ′ X' \rightarrow Y-X' X′→Y−X′的规则也一定不满足置信度阈值,其中 X ′ X' X′是 X X X的子集。
2.Apriori
算法中规则的产生
Apriori
算法采用一种逐层方法来产生关联规则,其中每层对应于规则后件中的项数。首先提取规则后件只含一个项的所有高置信度规则,使用这些规则来产生新的候选规则,如下图所示:
Reference
[1] 数据挖掘导论