上篇介绍了如何构建FP树,FP树的每条路径都满足最小支持度,我们需要做的是在一条路径上寻找到更多的关联关系。

抽取条件模式基

  首先从FP树头指针表中的单个频繁元素项开始。对于每一个元素项,获得其对应的条件模式基(conditional pattern base),单个元素项的条件模式基也就是元素项的关键字。条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前辍路径(perfix path)。简而言之,一条前缀路径是介于所査找元素项与树根节点之间的所有内容。

  下图是以{s:2}或{r:1}为元素项的前缀路径:

  {s}的条件模式基,即前缀路径集合共有两个:{{z,x,y,t}, {x}};{r}的条件模式基共三个:{{z}, {z,x,y,t}, {x,s}}。

  寻找条件模式基的过程实际上是从FP树的每个叶子节点回溯到根节点的过程。我们可以通过头指针列表headTable开始,通过指针的连接快速访问到所有根节点。下表是上图FP树的所有条件模式基:

创建条件FP树

  为了发现更多的频繁项集,对于每一个频繁项,都要创建一棵条件FP树。可以使用刚才发现的条件模式基作为输入数据,并通过相同的建树代码来构建这些树。然后,递归地发现频繁项、发现条件模式基,以及发现另外的条件树。

  以频繁项r为例,构建关于r的条件FP树。r的三个前缀路径分别是{z},{z,x,y,t},{x,s},设最小支持度minSupport=2,则y,t,s被过滤掉,剩下{z},{z,x},{x}。y,s,t虽然是条件模式基的一部分,但是并不属于条件FP树,即对于r来说,它们不是频繁的。如下图所示,y→t→r和s→r的全局支持度都为1,所以y,t,s对于r的条件树来说是不频繁的。

  过滤后的r条件树如下:

  重复上面步骤,r的条件模式基是{z,x},{x},已经没有能够满足最小支持度的路径, 所以r的条件树仅有一个。需要注意的是,虽然{z,x},{x}中共存在两个x,但{z,x}中,z是x的父节点,在构造条件FP树时不能直接将父节点移除,仅能从子节点开始逐级移除。

  代码如下:

 1 def ascendTree(leafNode, prefixPath):
 2     if leafNode.parent != None:
 3         prefixPath.append(leafNode.name)
 4         ascendTree(leafNode.parent, prefixPath)
 5
 6 def findPrefixPath(basePat, headTable):
 7     condPats = {}
 8     treeNode = headTable[basePat][1]
 9     while treeNode != None:
10         prefixPath = []
11         ascendTree(treeNode, prefixPath)
12         if len(prefixPath) > 1:
13             condPats[frozenset(prefixPath[1:])] = treeNode.count
14         treeNode = treeNode.nodeLink
15     return condPats
16
17 def mineTree(inTree, headerTable, minSup=1, preFix=set([]), freqItemList=[]):
18     # order by minSup asc, value asc
19     bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: (p[1][0],p[0]))]
20     for basePat in bigL:
21         newFreqSet = preFix.copy()
22         newFreqSet.add(basePat)
23         freqItemList.append(newFreqSet)
24         # 通过条件模式基找到的频繁项集
25         condPattBases = findPrefixPath(basePat, headerTable)
26         myCondTree, myHead = createTree(condPattBases, minSup)
27         if myHead != None:
28             print('condPattBases: ', basePat, condPattBases)
29             myCondTree.disp()
30             print('*' * 30)
31
32             mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)
33
34 simpDat = loadSimpDat()
35 dictDat = createInitSet(simpDat)
36 myFPTree,myheader = createTree(dictDat, 3)
37 myFPTree.disp()
38 condPats = findPrefixPath('z', myheader)
39 print('z', condPats)
40 condPats = findPrefixPath('x', myheader)
41 print('x', condPats)
42 condPats = findPrefixPath('y', myheader)
43 print('y', condPats)
44 condPats = findPrefixPath('t', myheader)
45 print('t', condPats)
46 condPats = findPrefixPath('s', myheader)
47 print('s', condPats)
48 condPats = findPrefixPath('r', myheader)
49 print('r', condPats)
50
51 mineTree(myFPTree, myheader, 2)

  控制台信息:

  本例可以发现两个频繁项集{z,x}和{x}。

  取得频繁项集后,可以根据置信度发现关联规则,这一步较为简单,可参考上篇的相关内容,不在赘述。


参考文献:《机器学习实战》

作者:我是8位的

出处:http://www.cnblogs.com/bigmonkey

本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!

FP-growth算法发现频繁项集(二)——发现频繁项集相关推荐

  1. Frequent Pattern 挖掘之二(FP Growth算法)(转)

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...

  2. FP Growth算法

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法 ...

  3. FP Growth算法详解

    看了n多资料,就这篇说的比较详细,适合初学者 FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对 ...

  4. MapReduce框架下的FP Growth算法详解

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebk.html Sharding 这一步没什么好讲的,将数据库分成连续的大小相等的几个块,放置在不同的 ...

  5. MapReduce框架下的FP Growth算法概述

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebi.html 前面的博客分析了关联分析中非常重要的一个算法-FP Growth.该算法根据数据库在内 ...

  6. FP Tree算法原理总结(转)

    FP Tree算法原理总结 转自: https://www.cnblogs.com/zhengxingpeng/p/6679280.html 总结得太好了. FP Tree算法原理总结 在Aprior ...

  7. FP Tree算法原理

    作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集 ...

  8. 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则性质 | 非频繁项集超集性质 | 频繁项集子集性质 | 项集与超集支持度性质 )

    文章目录 一. 非频繁项集超集性质 二. 频繁项集子集性质 三. 项集与超集支持度性质 参考博客 : [数据挖掘]关联规则挖掘 Apriori 算法 ( 关联规则简介 | 数据集 与 事物 Trans ...

  9. 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则简介 | 数据集 与 事物 Transaction 概念 | 项 Item 概念 | 项集 Item Set | 频繁项集 | 示例解析 )

    文章目录 一. 关联规则挖掘简介 二. 数据集 与 事物 ( Transaction ) 概念 三.项 ( Item ) 概念 四.项集 ( Item Set ) 概念 五.频繁项集 六.数据集.事物 ...

  10. java频繁项集挖掘数据关联_数据挖掘之关联分析二(频繁项集的产生)

    频繁项集的产生 格结构(lattice structure)常常用来表示所有可能的项集. 发现频繁项集的一个原始方法是确定格结构中每个候选项集的支持度.但是工作量比较大.另外有几种方法可以降低产生频繁 ...

最新文章

  1. [问题]DotNet 项目如何实现在构建时 Build 号自动增加?
  2. posix_memalign
  3. php elasticsearch ik,elasticsearch 中文分词(elasticsearch-analysis-ik)安装
  4. python专科就业难吗-python好就业吗
  5. ajaxfileupload带参数上传文件
  6. C++ throw:抛出自己的异常
  7. pypi.python.org_在Pypi上发布自己的Python包
  8. Js判断是否在微信浏览器中打开和微信版本号
  9. Coins(HDU2844)
  10. 15+在线网页按钮生成器工具
  11. 歌声合成理论教程(1)
  12. Verilog学习笔记(7)Modelsim仿真_三角波发生器
  13. SC-Lego-LOAM解析(下)
  14. Gitlab-runner 构建失败问题排查
  15. Echarts -盒须图的使用说明
  16. android layout_gravity center,android: layout_gravity与gravity区别及动态设置
  17. [cesium] | 视频融合 | 自定义视频投放
  18. windows和Linux未来,一家之言:Windows系统的未来就是变成Linux的一部分
  19. 带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714
  20. atm c语言流程图_C语言 ATM自动存取款机全套代码

热门文章

  1. 从零教你写专利之开宗明义篇
  2. 大带宽服务器是什么?大带宽服务器网络卡顿是什么原因?
  3. Pulsar 和 Kafka 基准测试报告(完整版)
  4. Echarts Y轴数值(正负数)转化成 万 亿 单位 (原本的转化有问题,且代码太多,已优化)
  5. javascript – 从页面停用浏览器打印选项(页眉,页脚,页边距)?
  6. 哥好鸟 哥啊鸟 哥回鸟
  7. 图片格式转换成eps格式
  8. 一股脑追中台就好比没看完阴阳师拍了晴雅集
  9. MIMX8MD6CVAHZAB I.MX 8MDUAL Cortex-A53 - 微处理器
  10. 命令行快速开启应用程序