Weka数据挖掘——关联

挫折感很大、觉得很难熬的时候,可以闭上眼睛,想像自己已经是十年之后的自己,置身一段距离之外,转头去看正在遭遇的那些事。 练习这样做,心情可能会平静些,知道眼前这一切,都会过去。——蔡康永
别太嚣张,对自己没好处。——李秘书
你今天泼给我的冷水,我定要烧开了给你泼回去。——宋晓峰
小人别得地,得地就起屁。 ——刘能

目录

1 关联规则概述

关联规则挖掘是数据挖掘的热点之一。关联规则反映一个对象与其他对象之间的相互依赖性,如果多个对象之间存在一定的关系,那么一个对象就能够通过其他对象来进行预测。
关联规则可以采用与分类规则相同的方式产生。由于得到的关联规则的数量庞大,通常需要通过使用覆盖率和准确率进行修剪,覆盖率也称为支持度,指的是应用规则之后预测正确的实例数量。准确率也称为置信度,表示为支持度数值应用规则后的数量比例。
相关术语:
支持度: P(AB),即A和B这两个项集在事务集D中同时出现的概率。
置信度: P(BA),即在出现项集A的事务集D中,项集B也同时出现的概率。
频繁项集:指经常出现在一块的物品的集合。 关联规则暗示两种物品之间存在很强的关系。(这里我们事先定义阀值,超过该阀值,证明两者之间存在很强的关系).

2 关联算法的介绍

2-1 Apriori算法

算法介绍
Apriori算法利用了两个重要的性质,用于压缩搜索的空间。
【1】若X为频繁项目集,则X的所有子集都是频繁项目集。
【2】若X为非频繁项目集,则X的所有超集均为非频繁项目集。
Apriori算法的处理流程为:宽度优先搜索整个项集空间,从k=0开始,迭代产生长度为k+1的候选项集的集合Ck+1。候选项集是其所有子集都是频繁项集的项集(初始化C1由I0中所有的项构成),在第k层产生所有长度为k+1的项集。

由两步完成:

第一步,Fk自连接。将Fk中具有相同(k-1)-前缀的项集连接成长度为k的候选项集。
第二步是剪枝,如果项集的所有长度为k的子集都在Fk中,该项集才能作为候选项集被加入Ck+1中。为了计算所有长度为k的候选项集的支持度,在数据库水平表示方式下,需要扫描数据库一遍。在每次扫描中,对数据库中的每条交易记录,为其中所包含的所有候选k-项集的支持度计数加1。所有频繁的k-项集被加入Fk中。

此过程直至Ck+1等于空集时结束。


算法  Apriori
Input:          Transaction DataBase D,Minimum support threshold minsup。
Output:      Frequent pattern L
(1) L1=search_frequent_1-itemsets( D );///生成频繁一项集
(2) for(k=2;Lk-1≠φ;k++) do
(3) begin
(4)    Ck=apriori-gen(Lk-1);//生成候选k项集
(5)    for all transactions t D do /// 扫描数据库中的每一个事务t
(6)    begin
(7)      Ct=subset(Ck,t);//识别属于t的所有候选项集
(8)      for all candidates c Ct do
(9)        c.count++;
(10)    end
(11)    Lk ={c Ck|c.count≥minsup}  //根据支持度来提取频繁k项集
(12) end
(13) Answer L=∪kLk;
Procedure Search_frequent_1-itemsets( D )
(1) begin
(2)  for all transactions t D do
(3)  begin
(4)    for each item ik t do
(5)      ik.count++;
(6)  end
(7)  L1 ={ i I | i.count≥minsup}
(8)  return L1;
(9) end
Procedure apriori_gen(Lk)
(1) begin
(2)   for each itemset l1 Lk do
(3)     for each itemset l2 Lk do
(4)     begin
(5)       if ( l1[1]=l2[1]) ( l1[2]=l2[2])( l1[k-1]=l2[k-1]) ( l1[k]<l2[k]) then
(6)       begin
(7)          c= l1 l2;//连接步
(8)          if Is_include_infrenquent_subset(c,Lk) then
(9)             delete c; //剪枝步
(10)         else add c to Ck+1 ;
(11)       end
(12)      end
(13)    return Ck+1 ;
(14) end
Procedure Is_include_infrenquent_subset(c,Lk)
(1)begin
(2)  for each k-subset s of c
(3)     if s Lk then
(4)       return TURE;
(5)  return FALSE ;
(6)end

在主程序中,第一步首先扫描整个交易数据库D,统计每个项目(item)的支持数,计算其支持度,将支持度大于等于最小支持度minsup的项目构成的集合放入到L1 中;从第2步到第11步,用k-1频繁项集构成的Lk-1生成候选集的集合Ck,以便从中生成Lk,其中apriori_gen函数(第4步)用来从Lk-1中生成Ck,然后对数据库进行扫描(第5步),对于数据库中的每一个交易,subset函数用来发现此交易包含的所有候选集(第7步),并为这些候选集的计数器加1(第8-9步)。最后满足minsup的候选集被放入到Lk中。
apriori_gen 过程完成两种操作:并(join)和剪枝(prune)。在并运算步骤中,Lk-1 与Lk-1 进行并运算生成潜在的候选集(2-7步),条件l1[k-1]

2-2 FP-Growth算法

FP-Growth(频繁模式增长)算法是韩家炜老师在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-Tree),但仍保留项集关联信息;该算法和Apriori算法最大的不同有两点:第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率。

算法伪代码

算法:FP-增长。使用FP-树,通过模式段增长,挖掘频繁模式。

输入:事务数据库D;最小支持度阈值min_sup。

输出:频繁模式的完全集。

1. 按以下步骤构造FP-树:

(a) 扫描事务数据库D 一次。收集频繁项的集合F 和它们的支持度。对F 按支持度降序排序,结果为频繁项表L。

(b) 创建FP-树的根结点,以“null”标记它。对于D 中每个事务Trans,执行:选择 Trans 中的频繁项,并按L 中的次序排序。设排序后的频繁项表为[p | P],其中,p 是第一个元素,而P 是剩余元素的表。调用insert_tree([p | P], T)。该过程执行情况如下。如果T 有子女N 使得N.item-name = p.item-name,则N 的计数增加1;否则创建一个新结点N,将其计数设置为1,链接到它的父结点T,并且通过结点链结构将其链接到具有相同item-name 的结点。如果P 非空,递归地调用insert_tree(P, N)。
procedure FP_growth(Tree, a)
if Tree 含单个路径P then{
         for 路径P中结点的每个组合(记作b)
         产生模式b U a,其支持度support = b 中结点的最小支持度;
} else {
         for each a i 在Tree的头部(按照支持度由低到高顺序进行扫描){
                  产生一个模式b = ai U a,其支持度support = ai .support;
                  构造b的条件模式基,然后构造b的条件FP-树Treeb;
                  if Treeb 不为空 then
                            调用 FP_growth (Treeb, b);
           }
}
FP-growth是整个算法的核心,再多啰嗦几句。
FP-growth函数的输入:tree是指原始的FPTree或者是某个模式的条件FPTree,a是指模式的后缀(在第一次调用时a=NULL,在之后的递归调用中a是模式后缀)
FP-growth函数的输出:在递归调用过程中输出所有的模式及其支持度(比如{I1,I2,I3}的支持度为2)。每一次调用FP_growth输出结果的模式中一定包含FP_growth函数输入的模式后缀。

参考这里

3 关联算法Weka实现

3-1 Apriori关联规则挖掘

对天气的标称数据进行Apriori关联规则挖掘。

=== Run information ===

Scheme:       weka.associations.Apriori -N 10 -T 0 -C 0.9 -D 0.05 -U 1.0 -M 0.1 -S -1.0 -c -1
Relation:     weather.symbolic
Instances:    14
Attributes:   5
              outlook
              temperature
              humidity
              windy
              play
=== Associator model (full training set) ===


Apriori
=======

Minimum support: 0.15 (2 instances)
Minimum metric <confidence>: 0.9
Number of cycles performed: 17

Generated sets of large itemsets:
Size of set of large itemsets L(1): 12
Size of set of large itemsets L(2): 47
Size of set of large itemsets L(3): 39
Size of set of large itemsets L(4): 6

Best rules found:

 1. outlook=overcast 4 ==> play=yes 4    <conf:(1)> lift:(1.56) lev:(0.1) [1] conv:(1.43)
 2. temperature=cool 4 ==> humidity=normal 4    <conf:(1)> lift:(2) lev:(0.14) [2] conv:(2)
 3. humidity=normal windy=FALSE 4 ==> play=yes 4    <conf:(1)> lift:(1.56) lev:(0.1) [1] conv:(1.43)
 4. outlook=sunny play=no 3 ==> humidity=high 3    <conf:(1)> lift:(2) lev:(0.11) [1] conv:(1.5)
 5. outlook=sunny humidity=high 3 ==> play=no 3    <conf:(1)> lift:(2.8) lev:(0.14) [1] conv:(1.93)
 6. outlook=rainy play=yes 3 ==> windy=FALSE 3    <conf:(1)> lift:(1.75) lev:(0.09) [1] conv:(1.29)
 7. outlook=rainy windy=FALSE 3 ==> play=yes 3    <conf:(1)> lift:(1.56) lev:(0.08) [1] conv:(1.07)
 8. temperature=cool play=yes 3 ==> humidity=normal 3    <conf:(1)> lift:(2) lev:(0.11) [1] conv:(1.5)
 9. outlook=sunny temperature=hot 2 ==> humidity=high 2    <conf:(1)> lift:(2) lev:(0.07) [1] conv:(1)
10. temperature=hot play=no 2 ==> outlook=sunny 2    <conf:(1)> lift:(2.8) lev:(0.09) [1] conv:(1.29)

posted @ 2016-01-23 11:06  snowwolf101  阅读(878)  评论(0编辑  收藏  举报