最近由于项目的原因,需要对伴随车辆进行检查,因此了解和掌握了关联分析,现在抽空进行整理,本文将以简单例子开始,一步一步讲述关联分析的概念,过程及方法。
- 购物篮分析
- 关联分析
- Aprior算法
- FPGrowth算法
购物篮分析
关联分析中最为经典的用法:某超市通过对大量用户购物清单数据进行分析后发现:购买尿布的顾客,往往都会购买啤酒。因此重新调整尿布和啤酒的位置,结果使得两个商品的销量大增。
下面是购物清单示例:
单号 | 商品 |
---|---|
001 | 尿布,啤酒,鸡蛋 |
002 | 可乐,火腿 |
003 | 尿布,啤酒,火腿 |
004 | 尿布,啤酒,可乐 |
对此清单进行关联分析,发现关联规则 {尿布} –> {啤酒},就意味着“购买尿布的顾客,有很大的可能购买啤酒”,虽然这并不是必然的,但存在很大的可能性。
关联分析
在了解关联分析前,先了解下面的一些名词定义:
- 事务: 每一项交易就是一个事务,上图中有4个事务。
- 项: 交易中的每个元素就是一个项,如“尿布”就是项。
- 项集: 包含至少一个项的集合,如{尿布},{尿布,啤酒}
- K-项集: 包括K个项的集合,如{尿布}是1-项集,{尿布,啤酒}是2-项集
- 支持度计数:某个项集出现在N个事务中,则其支持度计数为N,如{尿布,啤酒}的支持度计数为3
- 支持度: 某个项集的支持度计数除以总事务数,则为支持度,如项集{尿布,啤酒}的支持度为 3/4 = 75%
- 频繁项集:设定支持度阈值为N,那么支持度大于等于N的项集为频繁项集,假设阈值为50%,那么项集{尿布,啤酒}的支持度 75% > 50%,则该项集为频繁项集。
- 前件和后件:对于规则{尿布} –> {啤酒},{尿布}是前件,{啤酒}是后件。
- 置信度:对于规则{尿布} –> {啤酒},项集{尿布,啤酒}的支持度计数为N,项集{尿布}的支持度为M,则N/M为该规则的置信度。
- 关联规则:设定一个置信度阈值N,置信度大于等于N的规则即为关联规则。
关联分析的主要目的是找到关联规则,主要分为两个步骤:
1. 设定支持度阈值,从数据集中找到所有的频繁项集。
2. 设定置信度阈值,从频繁项集中提取关联规则。
相信大家看完上面的介绍,应该基本了解关联分析的一些概念及原理了,下面介绍两种频繁集挖掘算法。
频繁项集挖掘
要从大量数据中挖掘出频繁项集来,光靠蛮力是不行的,数据挖掘届已经有了一些经典的算法,当前只介绍两个最经典的算法Aprior和FPGrowth,不过在介绍算法前,先介绍两个较为重要的规则:
- 频繁项集的子集,肯定也是频繁项集。
- 非频繁项集的超集,肯定也是非频繁项集。
Aprior算法
Aprior算法的思路是先找到候选集,然后在其中筛选出频繁集。它采用了分层迭代的方法,简单描述如下:
先找到1-项集作为候选集A1,然后在其中筛选出1-项集的频繁集B1;再根据B1选定2-项集的候选集A2,然后在A2中筛选出2-项集的频繁集B2,…….如此迭代下去。
由于Aprior算法需要频繁扫描数据集,因此在数据量较大的时候,该算法的效率较差。
FPGrowth算法
FPGrowth算法的思路是扫描数据集,将其映射成FP-Tree,然后从FP-Tree里面筛选出频繁集来。
FPGrowth需要扫描两次数据集,后续操作均在内存中,因此效率较高,但也存在问题是当数据量大到一定程度时,内存可能成为瓶颈,好在目前Spark的MLLib模块支持FPGrowth算法,我们可以利用Spark进行分布式并行计算。
说明
对于APrior算法和FPGrowth算法细节,后续有时间补上。
对于关联规则的提取方式,后续有时间补上。