weka实战002:apriori关联规则算法

原创
2017/01/17 09:46
阅读数 99

关联规则算法最出名的例子就是啤酒和尿布放一起卖。


假如我们去超市买东西,付款后,会拿到一张购物清单。这个清单就是一个Transaction。对关联规则算法来说,每个产品的购买数量是无意义的,不参与计算。


许许多多的人买东西,生成了N个购物清单,也就是N个Transaction。


那么,这些Transaction上的货物之间有什么有用的关系呢?这些关系可以用什么方式表达出来呢?这就是关联规则算法要解决的问题。


下面,我们用一个具体的例子解释这个问题:


1. 假设有三个Transaction分别是:

t1 = {'a', 'b', 'c', 'd'}

t2 = {'a', 'c', 'e'};

t3 = {'b', 'c', 'f'}

其中,abcdef都是货物的ID,简写是为了方便理解。


2. 我们看一下,就知道只要买了'a',就可能会买'c',或者说,只要买了'c'就很可能买了'a',而且,在2个Transaction上都出现了。这个规律可以表达成:

  'c' ==> 'a'(66.67%)

后面的66.67%叫支持度,也就是'a'和'c'在一起出现的次数,处以c的次数,也就2/3=66.67%。


3. 这就是关联规则,各种关联规则算法要解决的是在样本数据很大或者样本数量很多的情况下计算关联规则,以及减少内存,提高计算速度。


4. 那么,apriori算法是如何做的呢?算法流程是这样的:

    4.1 先从所有的transaction遍历出所有货物id,也就{'a', 'b', 'c', 'd', 'e', 'f'}

    4.2 再计算每个货物id在所有transaction上出现次数总和,也就是{'a':2, 'b':2, 'c':3, 'd':1, 'e':1, 'f':1}

    4.3 有经验的同学可以知道上述两个步骤用HashMap能一次性搞定

    4.4 对4.2的结果,将出现次数少于一个最小支持数阈值的货物id删除,如果阈值是1,则剩下的结果就是{'a':2, 'b':2, 'c':3}

    4.5 对4.4的结果,生成一项频繁集,也就是{{'a'}, {'b'}, {'c'}}

    4.6 到这里为止,就得到了apriori算法的核心,频繁集,以后的所有计算都是在频繁集上进行:

        4.6.1 根据一项频繁集,生成二项频繁集,也就是{{'a','b'}, {'a','c'}, {'b','c'}},也就是任意两个一项频繁集的组合。

        4.6.2 计算二项频繁集的货物id同时在所有transaction上的出现次数:{{'a','b'}:1, {'a','c'}:2, {'b','c'}:2}

        4.6.3 根据最小支持数阈值=1,删除4.6.2的低值二项频繁集,其结果就是{{'a','c'}:2, {'b','c'}:2}

        4.6.4 根据二项频繁集合计算关联规则:

                  'c' ==> 'a'(66.67%)

                  'c' ==> 'b'(66.67%)

         4.6.5 根据二项频繁集,计算三项频繁集以及在三项频繁集上的关联规则,其步骤类似4.6.1~4.6.4。

         4.6.6 上述计算步骤,可以写成一个while循环,计算到高次频繁集为空,也就是不在有新规则产生为止。然后输出所有的规则。算法结束。


5. 几个问题

    5.1 关联规则不能处理连续值属性,所有要将连续值属性转化成nominal属性进行计算。

    5.2. 如果样本的属性值很多,或者transaction总数很多,apriori算法会很慢,因为每一轮计算都需要查询整个数据库。为此,学者们提出很多优化算法,剪切,并行,fp-growth等等。







展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部