Apriori算法——关联规则挖掘
前言:
首先,关联规则挖掘的目的是找出事物之间存在的隐藏的关系,比如经典的案例啤酒和尿布的的故事,用我们人的思维来思考的话,男性在买尿布的时候会买几瓶啤酒,这二者并没有什么因果关系。然而通过对海量数据进行关联分析,却能够发现这个有趣的知识,在超市调整货架后,明显的提升了超市啤酒尿布的销量。
基本概念:
1.关联规则的表示: 泡面 => 火腿 [support=2%;confidence=70%] 。这个就是关联规则的表示方法,其中支持度(support)和 (置信度)confidence是两个衡量这个规则是否有趣的度量标准。
2.支持度:按照上面的例子来讲,已知了支持度是2%,意味着所有事务的2%显示同时买了泡面和火腿。如果这个有疑惑大可不必着急,这个在还会在后续的例子里面具体阐述。
3.置信度:例如上述的置信度为70%,意味着所有买泡面的顾客,70%的顾客都买了火腿。
4.项集:项集就是项的集合,例如:{矿泉水,泡面,火腿} 这是一个3项集,项集的出现频度是包含项集的事务数,把它记作支持度计数,通俗的来说,假设有三个顾客分别买了{矿泉水,泡面,火腿}、{矿泉水,泡面,火腿、牛栏山}、{矿泉水,火腿}。那么这个3项集的支持度计数就是2。
5.频繁项集:如果我们预定义的支持度计数是2,也就是此时的支持度计数阈值为2,而上述的3项集的支持度计数是2,所以该3项集是频繁项集。
6.置信度计算公式:confidence( 泡面 => 火腿 ) = P(火腿 | 泡面) =
=
所以想求置信度,核心是求频繁项集。关联规则挖掘的步骤分两步:1.找所有的频繁项集。2.根据频繁项集生产强关联规则
Apriori算法举例:
接下来用一个例子用apriori算法来走一遍关联规则的流程(本例子预定义的支持度为2),下图是事物数据,9个顾客分别买了不同的商品列表(我们假定I1表示泡面,I2表示矿泉水,I3表示牛栏山,I4表示雪碧,I5表示火腿)。
首先我们要做的是第一次迭代,扫描所有的事物,对每个项进行计数得到候选项集,得到如下图所示的结果,记为C1。
此时,我们要对支持度计数和支持度的阈值进行比较,剔除小于支持度阈值的项集,显而易见,在本例中C1的项集都达到了阈值。我们便可以得出频繁1项集记作L1
接下来我们要进行第二次迭代,目的是得出频繁2项集,所以要使用连接来产生候选项集2项集。L1 L1 得出
连接这一步,我们把它叫做连接步,连接得到C2后,接下来做的是剪枝步,就是剪掉项集中包含不频繁项的项集,在本例中1项集全部都是频繁项集,例如{I1,I2}中没有不频繁项集,此项集不剪,{I1,I3}中没有不频繁项集,同理不剪,以此类推。所以C2中所有的项集都不需要剪掉。到此连接步、剪枝步全部完成。(这里值得注意的是剪枝是必须的一步,不能省略)最后再计一下数得出最终的C2。如下图所示。
将支持度计数小于阈值2的全部剔除,得出频繁2项集L2,如下图所示。
现在开始进行第三次迭代,L2 L2 得出候选项集C3,如下图所示。
在这一步同样是经过了连接步和剪枝步。L2自连接得到
然而除了之外。中都含有不频繁项集,第一个{I3,I5}不是L2的元素所以要剪枝,后面以此类推,最终得到上图的C3。(再重视一下,这个剪枝不能省略)。最后记一下数,得出最终的候选项集C3。
得到候选项集C3后与支持度阈值比较,得出频繁3项集L3。
现在继续第四次迭代,L3 自连接得到 {I1,I2,I3,I5} ,接下来剪枝,因为这个项集中{I2,I3,I5}不属于L3,所以剪掉,C4为空了,所以算法到此结束,现在得出了所有的频繁项集。
到此为止,我们做完了第一步:找出所有的频繁项集。接下来要做的便是输出强关联规则。
现在我们拿X = {I1,I2,I5}为例,输出关联规则。X的非空子集为{I1,I2}、{I1,I5}、{I2,I5}、{I1}、{I2}、{I5}。所以组合一下关联规则如下:
置信度我们根据上文提到的公式来算,拿第一个{I1,I2} => I5为例。confidence = P(I5 | {I1,I2})
= support_count({I2 , I1, I5}) / support_count({I1,I2})
通过查找L3,{I1,I2,I5}的支持度计数为2,通过查L2,{I1,I2}的支持度计数为4。即最终可以计算出confidence = = 50%。剩下的以此类推,假定我们预定义70%的置信度。在这些规则中,我们可以输出强关联规则的只有三个。即三个100%置信度的规则。那么我们可以得到买泡面和火腿的一定会买矿泉水,买矿泉水和火腿的一定会买泡面,买火腿的一定会买泡面和矿泉水这三个关联规则。
算法评价:
到此为止,用apriori算法实现关联规则挖掘的流程全部结束,可以看出的是,apriori算法要生成大量的候选项集,每生成频繁项集都要生成候选项集。其次要一直迭代重复的扫描事物数据来计算支持度。所以带来的问题很明显,这会导致效率会比较低下。所以apriori算法也有其他的变形优化,这个我们之后再谈。
参考:
本篇文章的例子出自韩家炜教授主编的《数据挖掘概念与技术》(第三版)的第六章。