Apriori算法是我的第一个数据挖掘算法,算处女作吧,哈哈哈。在这之前我对数据挖掘算法恐惧,觉得太难了,只是大致看了下原理,然后在clementine上拖几个控件跑下demo,运行的结果很好但是总觉得技术含量不高,我不知道为什么要这么做,为什么那些参数要那么设置,更糟糕的是发现那些算法过一段时间都忘记了。没办法,不入虎穴焉得虎子,我逼迫自己根据书上提供的讲解和伪码,琢磨着用什么数据结构保存数据?怎么把算法用程序实现?。。。。。。。万事开头难,好在我还是把这个算法写出来了,我获得了自信,使得我真正喜欢上了数据挖掘,现在看看自己写的那个算法,觉得有好多地方不成熟,哈哈哈。
Apriori算法属于关联分析,是Agrawal在1993提出来的。它的功能是找出频繁项集,例如:超市购物中,那些商品总是同时被购买,如啤酒和尿不湿总是被同时购买,这时商家就可以把他们放在一起使得啤酒和尿不湿的销量更多,哈哈哈。其核心是:先找频繁项集是1的元素,在这基础上找频繁项集时2的元素,,,,,,,在频繁项集是K的元素中找频繁项集是K+1的元素。如有如下数据:
每一行表示一条交易,共有9行,既9笔交易,左边表示交易ID,右边表示商品名称。最小支持度是22%,那么每件商品至少要出现9*22%=2次才算频繁。第一次扫描数据库,使得在每条交易中,按商品名称递增排序。第二次扫描数据,找频繁项集为1的元素有:
左边表示商品名称,右边表示出现的次数,都大于阈值2。在此基础上找频繁项集是2的元素,方法是两两任意组合,第三次扫描数据得到它们出现的次数:
这里{I1,I4},{I3,I4},{I3,I5},{I4,I5}出现的次数都小于2,过滤掉,实际频繁项集为2的元素有:
在这基础上找频繁项集为3的元素,此时就有规律性了,在频繁项集为K的元素上找频繁项集为K+1的元素的方法是:在频繁项集为K的项目(每行记录)中,假如共有N行,两两组合,满足两两中前K-1个元素相同,只后一个元素要求前一条记录的商品名称小于后一条记录的商品名称,这样是为了避免重复组合,求它们的并集得到长度为K+1的准频繁项集,那么最多共有种可能的组合,有:
想想如果N很大的话,是一个多么庞大的数字,这时就要用到Apriori的核心了:如果K+1个元素构成频繁项集,那么它的任意K个元素的子集也是频繁项集。然后将每组K+1个元素的所有长度为K的子集,有中组合,在频繁项集为K的项集中匹配,没有找到则删除,用第一条记录{I1,I2,I3}它的长度为2的频繁项集有:分别是:{I1,I2},{I1,I3},{I2,I3}种情况,幸好这三种情况在频繁项集为2的项集中都找到了。通过这步过滤,得到的依旧是准频繁项集,它们是:,此时第四次扫描数据库,得到真正长度为3的频繁项集是
因为{I1,I2,I4}只出现了1次,小于最小支持度2,删除。就这个例子而言,它的最大频繁项集只有3,就是{I1,I2,I3}和{I1,I2,I5},我想不用我多说大家都明白了。
可见--Apriori算法有个最大的问题就是要产生大量准频繁项集或者说候选集,效率不高,并且要多次扫描数据库,在后面的PF_growth算法将避免了这两个个问题。