FP-Growth算法理解
基本概念
FP-Growth 全称: Frequent Pattern Growth—-频繁模式增长
在整个算法执行过程中,只需要遍历数据集2次,就可完成频繁模式的发现
FP-growth算法简介
一种非常好的发现频繁项集的算法那
基于Apriori算法构建但是数据结构不同,使用叫做FP树的数据结构来存储集合
算法核心思想
基于数据构建FP树
从FP树中挖掘频繁项集
FP树介绍—-以树结构存储频繁项集
FP树的节点结构如下:
节点名称
节点出现次数
不同项集的相同项通过nodelink链接在一起
指向父节点
存储叶子节点
构建FP树
基于数据构建FP树
步骤1:
1.遍历所有的数据集集合,计算所有项的支持度
2.丢弃非频繁项
3.基于支持度 降序排序所有的项
4.所有数据集合按照得到的顺序重新整理
5.重新整理完成后,丢弃每个集合末尾非频繁的项步骤2:
6.读取每个集合插入FP树中,同时用一个头部链表数据结构维护不同集合的相同项- 步骤3:
1.对头部链表进行降序排序
2.对头部链表节点从小到大变量,得到条件模型基,同时获得一个频繁项集
FP树:用于编码数据集的有效方式
FP代表: Frequent Pattern 一个FP树看上去与计算机科学中的其他树节后类似
但是它通过连接(link)来连接相似元素,被连起来的元素项可以看成一个链表
与搜索树不同的是:一个元素项可以在FP树中出现多次,FP树会存储项集的出现频率,
而每个项集会以路径的方式存储在树中,相似元素的集合会共享树的一部分
只有当集合之间完全不同时,树才会分叉,树节点上给出集合中的单个元素及其在序列中
出现次数,路径会给出该序列的出现次数
相似项之间的链接称为节点链接,用于快速发现相似项的位置
核心思想
遍历两次数据集:
第一次:遍历数据集, 创建头指针表
第二次:遍历数据集, 依据头指针表 — 创建FP树(难点)
具体实现
第一次遍历,头部指针,dict{item,count} 单个项集与其支持度
第二次变量,找出每个事物中同项集与其对应的支持度,根据该支持度,逐一对事务进行排序,
然后再进行FP树构建
class tree_node(object):
def __init__(self, name_value, num_occur, parent_node):
self.name = name_value # 节点名称
self.count = num_occur # 节点出现次数
self.node_link = None # 不同项集的相同项通过node_link连接在一起
# needs to be updated
self.parent = parent_node # 指向父节点
self.children = {} # 存储叶子节点
def increase(self, num_occur):
"""
increase 对count变量增加给定定值
:param num_occur:
:return:
"""
self.count += num_occur
def display(self, ind=1):
"""
display 用于将树以文本形式显示
:param ind:
:return:
"""
print(' '*ind, self.name, ' ', self.count)
for child in self.children.values():
child.display(ind+1)
def load_data():
data_set = [['r', 'z', 'h', 'j', 'p'],
['z', 'y', 'x', 'w', 'v', 'u', 't', 's'],