fp-growth

机器学习——FP-growth算法

别说谁变了你拦得住时间么 提交于 2020-01-30 09:55:47
FP-growth算法 1.原理 相较于Apriori算法,FP-growth算法在发现频繁项集上有更快的速度。 FP-growth算法将数据存储在FP树的紧凑数据结构中。与搜索树不同的是,一个元素可以在FP树中出现多次。FP树会储存项集的出现频率,每个项集以路径的方式储存在树中,并通过link连接相似元素。 构建FP树需要对原始数据集扫描两遍。第一次遍历数据集会获得每个元素项的出现频率,去除不满足最小支持率的元素项。第二次扫描只需要考虑频繁元素构建FP树。构建树时,将每个项集根据元素项的绝对出现频率进行排序,之后读入每个项集并将其添加到已存在的路径中,若该路径不存在则创建新路径。 2.代码 (1)创建FP树 # 用于保存树的节点 class TreeNode : def __init__ ( self , nameValue , occurNum , parentNode ) : self . name = nameValue # 节点名字 self . count = occurNum # 计数值 self . nodeLink = None # 链接相似的元素 self . parent = parentNode # 当前节点的父节点 self . children = { } # 当前节点的所有子节点 def increase ( self , occurNum ) :

机器学习(九)—FP-growth算法

本小妞迷上赌 提交于 2020-01-13 13:01:02
  本来老师是想让我学Hadoop的,也装了Ubuntu,配置了Hadoop,一时间却不知从何学起,加之自己还是想先看点自己喜欢的算法,学习Hadoop也就暂且搁置了,不过还是想问一下园子里的朋友有什么学习Hadoop好点的资料,求推荐~言归正传,继Apriori算法之后,今天来学习FP-growth算法。   和Apriori算法相比,FP-growth算法只需要对数据库进行两次遍历,从而高效发现频繁项集。对于搜索引擎公司而言,他们需要通过查看互联网上的用词来找出经常在一块出现的词对,因此这些公司就需要能够高效的发现频繁项集的方法,今天要学习的FP-growth算法就可以完成此重任。 一 FP-growth算法 1.概述   FP-growth算法是基于Apriori原理的,通过将数据集存储在FP(Frequent Pattern)树上发现频繁项集,但不能发现数据之间的关联规则。FP-growth算法只需要对数据库进行两次扫描,而Apriori算法在求每个潜在的频繁项集时都需要扫描一次数据集,所以说Apriori算法是高效的。其中算法发现频繁项集的过程是: (1)构建FP树; (2)从FP树中挖掘频繁项集。 2. 构建FP树   FP表示的是频繁模式,其通过链接来连接相似元素,被连起来的元素可以看成是一个链表。将事务数据表中的各个事务对应的数据项按照支持度排序后

频繁项集挖掘之apriori和fp-growth

匿名 (未验证) 提交于 2019-12-03 00:22:01
要弄好这件事不仅需要有效减小搜索空间,而且对每个可能的搜索都必须快速完成。所以频繁项集挖掘在算法实践和编码实现上就要有非常强的技巧。我们就来深入学习apriori和fp-growth中的搜索方式和技巧。这两个算法很容易找到完整的步骤,这里会更注重里面一些精彩之处,但是可能书写不会那么规范,建议和完整算法对照来读。 算法过程如下: 输入:数据集D,支持度minsup 发现 1-项集 (D); c 可以通过一张截图来演示一下apriori的过程: 对应第一张图,连接步是从第k层的项集,向下扩展一层的候选项集,剪枝步能够通过apriori性质过滤掉那些肯定非频繁的项集。 剪枝步也需要对每个k-候选项集的k-1子集都进行一次检测,也很耗费时间;统计频繁次数是必须的,因此需要扫描数据库,经历I/O。那么有必要剪枝,直接统计会不会更好呢,虽然没有试验过,但我估计还是剪枝以后减少候选集的统计更划算。而这两个耗时的步骤在实现上如果能使用到技巧,对算法时间影响最直接。比如剪枝步中k-1候选项集需要逐一向已有的k-1频繁项集查询,这用什么数据结构最好?又如扫描数据库的时候是否能过进行一些压缩,相同的记录进行合并减少遍历次数,以及过滤掉对统计没用的记录? 面对apriori的问题,感觉Fp-growth突然间就冒出来了,它是一个挖掘方式和apriori完全不一样的算法