本文为学习 https://www.cnblogs.com/pinard/p/6307064.html 的笔记
FP Tree 又叫FP Growth算法
结构
项头表和FP Tree:
项头表存储的是所有的1频繁项集,并且按照支持度递减, pointer是一个链表,串着元素相同的1频繁项集。
项头表与数据预排序
将所有的频繁1项集按照支持度排序,删除低于阈值的1项集,并将这些1项集放入项头表。将每条数据中的元素按照其单个支持度排序,大的元素放在前。
建树
根结点为null,然后一条条插入数据, 每个节点对应的数字为这条路径上该1项集出现的次数(有点像字典树)。
(1)插入ACEBF
(2)插入ACG, 因为我们之前对每条数据进行预排序了,所以利用公共的节点。
在已有的路径上进行插入,出现不能完全重合的路径就产生分支。
插入第三条数据E的时候即为null的右子树。
(3)插入ACEC
注意, 每次插入一条数据后,对应的叶节点要连在项头表链表中对应元素的后面。
挖掘
FP Tree建好以后, 对其进行挖掘。对于项头表中的每一个元素,从下往上,在FP Tree中找到以该点为叶子节点所有路径(比如下面以D结尾的路径有两条),将每条路径上每个点的计数设为叶子节点的计数,然后求出以该节点为终节点的所有1~n项集。
比如求D的频繁项集时,其FP Tree如下,因为D有两个叶子节点,所有分两次进行,
首先修改以D为叶子节点的路径上节点的计数,A和C的而都是由累加的得到的,删除该Tree中总计数频次小于阈值的节点(E和G),将其变成直线:
这样我们可以得到 A=2 --C=2–D=2的路径(两条路径合并后的结果),然后分别求以D结尾的频繁n项集。
假如E G没用被删,那么将形成 ACEGD和ACD两条路径,频率都为1,拆分成1~n项集再合并。
优点
改进了Apriori算法扫描过多次的瓶颈,该算法只需要扫描两次数据集,第一次建立项头表,第二次建数