`
wbj0110
  • 浏览: 1604131 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

关联规则FpGrowth算法

阅读更多

Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。今天我们介绍一个新的算法挖掘频繁项集,效率比Aprori算法高很多。

  FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。我们还是以上一篇中用的数据集为例:

一、构造FpTree

  FpTree是一种树结构,树结构定义如下:

public class FpNode {
     
    String idName;// id号
    List<FpNode> children;// 孩子结点
    FpNode parent;// 父结点
    FpNode next;// 下一个id号相同的结点
    long count;// 出现次数
}

树的每一个结点代表一个项,这里我们先不着急看树的结构,我们演示一下FpTree的构造过程,FpTree构造好后自然明白了树的结构。假设我们的最小绝对支持度是3。

  Step 1:扫描数据记录,生成一级频繁项集,并按出现次数由多到少排序,如下所示:

可以看到,鸡蛋和可乐没有出现在上表中,因为可乐只出现2次,鸡蛋只出现1次,小于最小支持度,因此不是频繁项集,根据Apriori定理,非频繁项集的超集一定不是频繁项集,所以可乐和鸡蛋不需要再考虑。

  Step 2:再次扫描数据记录,对每条记录中出现在Step 1产生的表中的项,按表中的顺序排序。初始时,新建一个根结点,标记为null;

  1)第一条记录:{牛奶,面包},按Step 1表过滤排序得到依然为{牛奶,面包},新建一个结点,idName为{牛奶},将其插入到根节点下,并设置count为1,然后新建一个{面包}结点,插入到{牛奶}结点下面,插入后如下所示:

  2)第二条记录:{面包,尿布,啤酒,鸡蛋},过滤并排序后为:{面包,尿布,啤酒},发现根结点没有包含{面包}的儿子(有一个{面包}孙子但不是儿子),因此新建一个{面包}结点,插在根结点下面,这样根结点就有了两个孩子,随后新建{尿布}结点插在{面包}结点下面,新建{啤酒}结点插在{尿布}下面,插入后如下所示:

  3)第三条记录:{牛奶,尿布,啤酒,可乐},过滤并排序后为:{牛奶,尿布,啤酒},这时候发现根结点有儿子{牛奶},因此不需要新建结点,只需将原来的{牛奶}结点的count加1即可,往下发现{牛奶}结点有一个儿子{尿布},于是新建{尿布}结点,并插入到{牛奶}结点下面,随后新建{啤酒}结点插入到{尿布}结点后面。插入后如下图所示:

  4)第四条记录:{面包,牛奶,尿布,啤酒},过滤并排序后为:{牛奶,面包,尿布,啤酒},这时候发现根结点有儿子{牛奶},因此不需要新建结点,只需将原来的{牛奶}结点的count加1即可,往下发现{牛奶}结点有一个儿子{面包},于是也不需要新建{面包}结点,只需将原来{面包}结点的count加1,由于这个{面包}结点没有儿子,此时需新建{尿布}结点,插在{面包}结点下面,随后新建{啤酒}结点,插在{尿布}结点下面,插入后如下图所示:

  

  5)第五条记录:{面包,牛奶,尿布,可乐},过滤并排序后为:{牛奶,面包,尿布},检查发现根结点有{牛奶}儿子,{牛奶}结点有{面包}儿子,{面包}结点有{尿布}儿子,本次插入不需要新建结点只需更新count即可,示意图如下:

  

 

  按照上面的步骤,我们已经基本构造了一棵FpTree(Frequent Pattern Tree),树中每天路径代表一个项集,因为许多项集有公共项,而且出现次数越多的项越可能是公公项,因此按出现次数由多到少的顺序可以节省空间,实现压缩存储,另外我们需要一个表头和对每一个idName相同的结点做一个线索,方便后面使用,线索的构造也是在建树过程形成的,但为了简化FpTree的生成过程,我没有在上面提到,这个在代码有体现的,添加线索和表头的Fptree如下:

  至此,整个FpTree就构造好了,在下面的挖掘过程中我们会看到表头和线索的作用。

二、利用FpTree挖掘频繁项集

  FpTree建好后,就可以进行频繁项集的挖掘,挖掘算法称为FpGrowth(Frequent Pattern Growth)算法,挖掘从表头header的最后一个项开始。

  1)此处即从{啤酒}开始,根据{啤酒}的线索链找到所有{啤酒}结点,然后找出每个{啤酒}结点的分支:{牛奶,面包,尿布,啤酒:1},{牛奶,尿布,啤酒:1},{面包,尿布,啤酒:1},其中的“1”表示出现1次,注意,虽然{牛奶}出现4次,但{牛奶,面包,尿布,啤酒}只同时出现1次,因此分支的count是由后缀结点{啤酒}的count决定的,除去{啤酒},我们得到对应的前缀路径{牛奶,面包,尿布:1},{牛奶,尿布:1},{面包,尿布:1},根据前缀路径我们可以生成一颗条件FpTree,构造方式跟之前一样,此处的数据记录变为:

绝对支持度依然是3,构造得到的FpTree为:

构造好条件树后,对条件树进行递归挖掘,当条件树只有一条路径时,路径的所有组合即为条件频繁集,假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},即{啤酒}的频繁集一定有相同的后缀{啤酒},此处的条件频繁集为:{{},{尿布}},于是{啤酒}的频繁集为{{啤酒}{尿布,啤酒}}。

  2)接下来找header表头的倒数第二个项{尿布}的频繁集,同上可以得到{尿布}的前缀路径为:{面包:1},{牛奶:1},{牛奶,面包:2},条件FpTree的数据集为:

 

注意{牛奶,面包:2},即{牛奶,面包}的count为2,所以在{牛奶,面包}重复了两次,这样做的目的是可以利用之前构造FpTree的算法来构造条件Fptree,不过这样效率会降低,试想如果{牛奶,面包}的count为20000,那么就需要展开成20000条记录,然后进行20000次count更新,而事实上只需要对count更新一次到20000即可。这是实现上的优化细节,实践中当注意。构造的条件FpTree为:


  这颗条件树已经是单一路径,路径上的所有组合即为条件频繁集:{{},{牛奶},{面包},{牛奶,面包}},加上{尿布}后,又得到一组频繁项集{{尿布},{牛奶,尿布},{面包,尿布},{牛奶,面包,尿布}},这组频繁项集一定包含一个相同的后缀:{尿布},并且不包含{啤酒},因此这一组频繁项集与上一组不会重复。

  重复以上步骤,对header表头的每个项进行挖掘,即可得到整个频繁项集,可以证明(严谨的算法和证明可见参考文献[1]),频繁项集即不重复也不遗漏。

 程序的实现代码还是放在我的github上,这里看一下运行结果:

绝对支持度: 3
频繁项集: 
面包 尿布     3
尿布 牛奶     3
牛奶     4
面包 牛奶     3
尿布 啤酒     3
面包     4

另外我下载了一个购物篮的数据集,数据量较大,测试了一下FpGrowth的效率还是不错的。FpGrowth算法的平均效率远高于Apriori算法,但是它并不能保证高效率,它的效率依赖于数据集,当数据集中的频繁项集的没有公共项时,所有的项集都挂在根结点上,不能实现压缩存储,而且Fptree还需要其他的开销,需要存储空间更大,使用FpGrowth算法前,对数据分析一下,看是否适合用FpGrowth算法。

 

http://tech.ddvip.com/2013-11/1384962380206276.html

分享到:
评论

相关推荐

    图解FPGrowth 算法

    FPGrowth算法是一种用于关联规则挖掘的高效数据挖掘技术,尤其适用于处理大规模数据集。它由Hua Fan和Zhi-Hua Zhou在2000年提出,旨在解决Apriori算法在处理大量数据时的效率问题。本文将通过图解的方式深入解析FP...

    FP-growth 算法(Python语言实现)

    FP-growth算法是一种高效的数据挖掘方法,主要用于在大型数据库中发现频繁项集和关联规则。在Python环境中,我们可以使用各种库来实现FP-growth,其中最常见的是`mlxtend`和`apyori`库。本文将深入探讨FP-growth算法...

    关联规则FP-Growth算法

    **关联规则FP-Growth算法详解** 关联规则学习是数据挖掘中的一个重要领域,它旨在发现数据库中项集之间的有趣关系,例如“如果顾客购买了尿布,那么他们也可能会购买啤酒”。FP-Growth算法是一种高效的关联规则挖掘...

    机器学习-FPGROWTH算法(PPT56页).ppt

    FPGrowth算法是一种常用的关联规则挖掘算法,用于发现频繁项集和关联规则。 在FPGrowth算法中,项集是指一组商品的组合。k项集是指k件商品的组合,不关心商品件数,仅商品的种类。频繁项集是指项集的相对支持度满足...

    FP_Growth算法案例讲解和演示

    FP_Growth算法是一种高效的数据挖掘方法,主要用于关联规则学习,特别是在大规模数据集上。这个算法以其高效率和节省内存的特点而被广泛应用于交易数据库中的频繁项集挖掘。在这个压缩包中,你将找到一系列资源来...

    FPGrowth的代码

    总结,FPGrowth算法以其高效的性能和灵活的适应性,在大数据关联规则挖掘中占据了重要地位。理解其原理并能实际编写代码,对于数据挖掘从业者来说,是提升数据分析能力的关键一步。通过实践和不断优化,我们可以更好...

    基于关联规则的Apriori和FP-growth算法.ipynb

    基于关联规则的Apriori和FP-growth算法.ipynb

    关联规则挖掘之FP-growth算法实现

    在提供的Python实现`fp-growth-0.1.3`中,可能包含了FP-growth算法的Python代码库,用于在实际项目中进行关联规则挖掘。这个库通常会提供函数,如`fp_growth`,用于构建FP树、挖掘频繁项集以及生成关联规则。用户...

    关联规则fpgrowthc、c#和matlab算法附讲解文档

    关联规则挖掘是一种在数据挖掘领域广泛应用的技术,它用于发现数据集中项集之间的有趣关系,比如“如果用户购买了牛奶,那么他们很可能也会购买面包”。FP-growth(频繁模式树)算法是这种挖掘方法的一种高效实现,...

    关联分析:FP-Growth算法.pdf

    关联分析:FP-Growth算法

    C++版的fp-growth算法

    FP-Growth算法是一种高效的数据挖掘技术,主要用于关联规则学习,即在大规模数据集中发现频繁项集。这个算法在处理大数据量时表现出了较高的性能,因为它避免了构建和搜索全频繁项集的候选集。在C++中实现FP-Growth...

    FP Growth算法的Python实现,新颖简单_python_代码_下载

    FP Growth(频繁项集挖掘)算法是一种在大数据集中高效发现频繁项集的算法,它主要用于关联规则学习。在这个Python实现中,我们关注的是如何利用Python编程语言来有效地执行这个算法。下面将详细介绍FP Growth算法的...

    FP-Growth算法代码

    FP-Growth算法是一种在数据挖掘领域广泛使用的关联规则学习算法,尤其适用于处理大规模交易数据集。这个算法的主要优点是高效性和内存效率,它避免了频繁的全数据库扫描,通过构建一个高效的FP树(Frequent Pattern ...

    C语言实现的FP-growth算法

    FP-growth算法是一种高效的数据挖掘方法,用于找出数据库中频繁出现的项集。在这个场景中,我们关注的是C语言实现的FP-growth算法。C语言以其高效性和灵活性,成为实现这种算法的理想选择,尤其是在处理大数据量时。...

    fpgrowth的python实现

    总之,Python中的FPGrowth算法提供了一种实用的方式来挖掘数据中的频繁项集,进而发现潜在的关联规则。通过结合实际的交易数据,我们可以更好地理解消费者的购买行为,为企业决策提供有价值的洞察。在实践中,根据...

    数据挖掘之关联规则挖掘FP-Growth算法

    **关联规则挖掘与FP-Growth算法** 关联规则挖掘是数据挖掘领域的一个重要组成部分,它旨在发现数据集中项集之间的有趣关系。例如,在超市购物数据中,可能会发现“购买尿布”的顾客往往也会“购买啤酒”,这种关系...

    关联规则算法-Fp_growth

    关联规则的经典算法,fp_growth算法,利用fp_tree来将事物空间进行划分。

    fpgrowth算法java源码

    **FPGrowth算法原理:** `FPGrowth`(Frequent Pattern Growth)算法由Hao Chen和Jiawei Han等人于2000年提出,它的主要创新在于避免了频繁项集生成过程中大量的候选集生成和测试,从而提高了效率。`FPGrowth`通过...

    FP.rar_FPgrowth _FP算法代码java_关联规则_关联规则代码

    总的来说,FP-growth算法在Java中的实现,不仅能够有效地处理大数据集,还为关联规则的挖掘提供了高效且灵活的解决方案。通过对FP树和条件模式基的巧妙运用,FP-growth算法在实际应用中展现了其强大的性能和实用性。...

Global site tag (gtag.js) - Google Analytics