关联规则
参考书:陈志泊 数据仓库与数据挖掘 清华大学出版社 2009.5
P89
1993年R.Agrawal等人首先提出关联规则,并设计了一个基本算法。
关联规则最早是由R.Agrawal等人针对超市购物篮分析问题提出的,其目的是发现超市交易数据库中不同商品之间的关联关系。
关联规则体现了顾客购物的行为模式,这可以为经营决策、市场预测和策划等方面提供依据。关联规则挖掘系统已经被成功应用于市场营销、银行业、零售业、保险业、电信业和公司经营管理等各个方面。关联规则还可以应用于文本挖掘、商品广告有机分析和网络故障分析等领域。
经典的关联规则挖掘算法包括Apriori算法和FP-growth算法(J.Han等人提出)。前者多次扫描数据库,每次利用候选频繁集产生频繁集;后者则利用树形结构直接得到频繁集,减少了扫描数据库的次数,从而提高了算法的效率。但是前者的扩展性好,可用于并行计算等领域。
Apriori算法 R.Agrawal等人
“产生候选集”
首先产生1-频繁集L1,然后连接、修剪产生2-频繁集L2,重复此过程,直到无法产生新的频繁集为止。
输入:数据库,最小支持度supmin
输出:可产生规则的所有频繁集Lk
1) 扫描数据库,产生1-候选集C1,并计算C1中各个项目的支持度。
2) 去除支持度小于supmin的项集,形成1-频繁集L1。
3) 将L1中的各个项目组合连接,产生2-候选集C2,扫描C2以计算各个项集的支持度。
4) 去除支持度小于supmin的项集,形成2-频繁集L2
5) 重复3)和4)直到候选集为Ck空
FP-growth算法 J.Han等人
“不产生候选集”
第一次扫描数据库之后,利用一颗频繁模式树(FP-tree)表示频繁集,从而产生条件模式库,再生成规则。
分为两部分:
第一部分:根据数据库建立一棵FP-tree
输入:数据库,最小支持度supmin
输出:FP-tree
1) 扫描数据库,得到频繁项的集合F和每个频繁项的支持度。
2) 将频繁项的集合F按照支持度降序排列,得到L。
3) 将数据库中的项目按照L中的顺序表示出来。
4) 创建树的根节点,标记为null。
5) 扫描数据库中的项目,若树的节点含有此项目,则count++;否则,创建该项目节点,并设count为1。
6) 重复步骤5)直到数据库扫描结束。
第二部分:根据FP-tree产生频繁集
输入:FP-tree
输出:所有的频繁集
1) 从下向上依次找到包含各个项目的频繁集。
示例:
假定某超市销售的商品包括bread、beer、cake、cream、milk和tea共六种,超市的每笔交易数据如下:
交易号TID | 顾客购买商品Items |
T1 | bread cream milk tea |
T2 | bread cream milk |
T3 | cake milk |
T4 | milk tea |
T5 | bread cake milk |
T6 | bread tea |
T7 | beer milk tea |
T8 | bread tea |
T9 | bread cream milk tea |
T10 | bread milk tea |
方法一:使用Apriori算法
扫描数据库,产生1-候选集C1,并计算C1中各个项目的支持度。
去除支持度小于supmin的项集,形成1-频繁集L1。
将L1中的各个项目组合连接,产生2-候选集C2,扫描C2以计算各个项集的支持度。
去除支持度小于supmin的项集,形成2-频繁集L2
重复3)和4)直到候选集为Ck空
(1-候选集)项目Item | 支持度sup supmin=2 |
bread | 7 |
beer | 1 |
cake | 2 |
cream | 3 |
milk | 8 |
tea | 7 |
6选1 初始,什么都不去除
(1-频繁集)项目Item | 支持度sup supmin=2 |
bread | 7 |
cream | 3 |
milk | 8 |
tea | 7 |
不能有beer
不能有cake
余下4个长度为1的项目集
种类=4
(2-候选集)项目Item 4选2 | 支持度sup supmin=2 |
bread cream | 3 |
bread milk | 5 |
bread tea | 5 |
cream milk | 3 |
cream tea | 2 |
milk tea | 5 |
(2-频繁集)项目Item cream和tea不能同时存在 余下5个长度为2的项目集 种类=4 | 支持度sup supmin=2 |
bread cream | 3 |
bread milk | 5 |
bread tea | 5 |
cream milk | 3 |
milk tea | 5 |
(3-候选集)项目Item 4选3 | 支持度sup supmin=2 |
bread cream milk | 3 |
bread cream tea | 2 |
bread milk tea | 3 |
cream milk tea | 2 |
总结:
计算集合中元素的总个数n
分别计算C1n C2nC3n……以及各个组合的支持度
按照支持度排序C1n,去除小于supmin的,即得到条件1
按照支持度排序C2n,去除小于supmin的,即得到条件2
按照支持度排序C3n,去除小于supmin的,即得到条件3
……
在所有组合中,根据条件1,条件2,条件3,……,去除组合,最后得到的就是需要的
方法二:使用FP-growth算法
扫描数据库,得到频繁项的集合F和每个频繁项的支持度。
将频繁项的集合F按照支持度降序排列,得到L。
将数据库中的项目按照L中的顺序表示出来。
创建树的根节点,标记为null。
扫描数据库中的项目,若树的节点含有此项目,则count++;否则,创建该项目节点,并设count为1。
重复步骤5)直到数据库扫描结束。
按照支持度排序项目
项目Item | 支持度sup |
milk | 8 |
bread | 7 |
tea | 7 |
cream | 3 |
cake | 2 |
beer | 1 |
按照项目名称排序原始数据库
交易号TID | 顾客购买商品Items |
T1 | milk bread tea cream |
T2 | milk bread cream |
T3 | milk cake |
T4 | milk tea |
T5 | milk bread cake |
T6 | bread tea |
T7 | milk tea beer |
T8 | bread tea |
T9 | milk bread tea cream |
T10 | milk bread tea |
总结:
两次排序,一次构造树。
从叶子沿着枝干向上找频繁集