关联规则
继上一讲数据仓库与数据挖掘 6(上)我们讲述了关联规则的一些基本原理,本讲将介绍一下关联规则的一些实现算法。
两个重要的基本理论
定理1(频繁集性质1):如果X是频繁集,则它的任何非空子集X’也是频繁项集。
即频繁集的子集必是频繁集。
定理2(频繁集性质2):如果X是非频繁集,那么它的所有超集都是非频繁集。
即非频繁集的超集也是非频繁集。
这两点是比较显然的,在数学的证明上也比较简单,举个简单的例子解释:
如果在超市的交易数据集中 , 买 {泡面} 的次数一定比 买 {泡面,火腿} 次数多,因为人们有可能单买泡面,而不买火腿,也就是买 {泡面} 的订单包含了 买 {泡面,火腿} 的订单。换一种说法,项越多,约束条件越多,出现的次数就越少。
所以,若 {泡面,火腿} 为频繁集,那么它的子集 {泡面} 也一定是频繁集。
若 {泡面} 不是频繁集,那么它的超集 {泡面,火腿} 也一定不是频繁集(出现的次数更少了)。
关联规则挖掘问题两个子问题:
第一步是找出事务数据库中所有大于等于用户指定的最小支持度的数据项集;
第二步是利用频繁项集生成所需要的关联规则,根据用户设定的最小置信度进行取舍,最后得到强关联规则。
识别或发现所有频繁项目集是关联规则发现算法的核心。
上一讲说到,强关联规则必须满足最小支持度和最小置信度要求,所以第一步先挖掘频繁项,再在其中产生关联规则。
基于以上理论,我们有第一个算法:
Apriori 算法
算法原理
发现频繁项集的过程主要分为:连接(self-joining)和剪枝(pruning)两步。
修正原则: 如果有任何非频繁的项集,
则它的子集就用不生成/检验。
方法:
- 起初,扫描事务数据库得到频繁1项集
- 连接:从长度K的频繁集生成长度为(K+1)的候选集
- 剪枝:在事务数据库中检验候选频繁集
- 当没有频繁或候选集生成时就终止
举个栗子
左上的第一个表格是交易数据集,一行就是一个交易。
- 扫描交易数据集,得到 1-项集所构成的候选集 C1,并统计出每个1候选集在交易中出现的次数。例如 1-项集{A}在交易10和交易30中出现了,也就是2次。
- 比较C1各个项集的支持数(支持度*交易总数,即为出现的次数)是否大于等于最小支持数,删除小于最小支出数的项集(非频繁集,且包含它的超集也不会是频繁集),得到1-频繁集 L1.
- 连接:在L1的基础上,因为都是1-项集,也就只有一项不同,那么两两进行组合连接,生成新的 2-候选集 C2。(最好按照字典顺序连接),因为C2的子集都在L1中不需要剪枝(空子集不需要考虑)。
- 扫描交易数据集,得到C2的每个项的支持数,删除不满足最小支持数的项,得到L2频繁集。
- 连接剪枝:在L2的基础上,连接只有一项不一样的项,从而产生C3。这里有两点必须注意:i)只连接一项不一样的项,因为如果有两项都不一样那么连接生成的是4-项集。ii)连接后考虑它的所有子集,若不在L1,L2中那么需要剪枝,也就是子集不频繁,那么它作为超集也绝对不频繁,就没要往后了。
例如:i){A,C}和{B,E}就不能连接,因为连接生成的是{A,B,C,E} 4-项集;
ii){A,C} 和{B,C}连接生成{A,B,C},虽然是3-项集,但是他的子集 { A , B } ∉ L 2 \{A,B\} \notin L2 {A,B}∈/L2,故剪枝。 - 扫描交易数据集,得到C3的每个项的支持数,删除不满足最小支持数的项,得到L3频繁集。
- 因为L3只有一项,没办法继续连接,到此结束
得到的所有频繁集为 L 1 ∪ L 2 ∪ L 3 L1 \cup L2 \cup L3 L1∪L2∪L3
特点总结
1.Apriori算法是一个迭代算法
2. 对于由𝐿_(𝑘−1)生成的𝐶_𝑘,从𝐶_𝑘中删除明显不是频繁项集的项集,这称为剪枝操作。这里𝐿_(𝑘−1)包含所有的(k-1)-频繁项集,也就是说,若某个(k-1)-项集不在𝐿_(𝑘−1)中,则它一定不是频繁的。
3. 每一次都需要扫描交易数据库,当数据量较大时,速度慢。
4. 当没有新的候选集生成时,算法结束
算法伪代码回顾
python实现
更详细的代码实现请 参考
python包实现 efficient-apriori 1.0.0
用法介绍点击查看描述
from efficient_apriori import apriorit
ransactions=[('eggs','bacon','soup'),('eggs','bacon','apple'),('soup','bacon','banana')]
itemsets,rules=apriori(transactions,min_support=0.5,min_confidence=1)
print(rules)
[{eggs} -> {bacon}, {soup} -> {bacon}]
参考
陈志泊 主编. 数据仓库与数据挖掘(第二版). 清华大学出版社,2019
https://pypi.org/project/efficient-apriori/