Apriori算法是我的第一个数据挖掘算法,算处女作吧,哈哈哈。在这之前我对数据挖掘 算法恐惧,觉得太难了,只是大致看了下原理,然后在clementine上拖几个控件跑下demo,运行的结果很好但是总觉得技术含量不高,我不知道为什 么要这么做,为什么那些参数要那么设置,更糟糕的是发现那些算法过一段时间都忘记了。没办法,不入虎穴焉得虎子,我逼迫自己根据书上提供的讲解和伪码,琢 磨着用什么数据结构保存数据?怎么把算法用程序实现?。。。。。。。万事开头难,好在我还是把这个算法写出来了,我获得了自信,使得我真正喜欢上了数据挖 掘,现在看看自己写的那个算法,觉得有好多地方不成熟,哈哈哈。
在这基础上找频繁项集为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算法将避免了这两个个问题。
每一行表示一条交易,共有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},我想不用我多说大家都明白了。
来源:http://blog.sina.com.cn/s/blog_6e85bf420100ogn2.html