关联规则之FPGrowth
一、原理:
与Apriori相比,只需要扫描两个数据库。
第一次扫描:
得到每个元素出现的次数,去除低于阈值的项,并排序。再对不同的项,按次序的高低排序
第二次扫描:
构建FP-TREE树,从FP树中找到关联规则。
二、算法流程步骤:
FP Tree算法包括三步:
1)扫描数据,得到所有频繁一项集的的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。
2)扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。
3)读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。
4)从项头表的底部项依次向上找到项头表项对应的条件模式基。从条件模式基递归挖掘得到项头表项项的频繁项集。
5)如果不限制频繁项集的项数,则返回步骤4所有的频繁项集,否则只返回满足项数要求的频繁项集。
三、核心步骤:
1.FP tree的构造
对FP树的构建包含了:名字,计数,指向下一个相同节点,父节点,子节点
name:节点元素名称,在构造时初始化为给定值
count:出现次数,在构造时初始化为给定值
nodeLink:指向下一个相似节点的指针,默认为None(指向下一个相同节点)
parent:指向父节点的指针,在构造时初始化为给定值
children:指向子节点的字典,以子节点的元素名称为键,指向子节点的指针为值,初始化为空字典
2.项头表的建立:
指的是相对字符进行排序,去除低于阈值的项,再对每项值进行排序
3 FP Tree的建立
把上面的项头表的每一项的值,一项一项的插入到FP tree中。
插第一个
插第二个:
依次插入。
4.FP Tree的挖掘
要从项头表的底部项依次向上挖掘。对于项头表对应于FP树的每一项,我们要找到它的条件模式基。所谓条件模式基是以我们要挖掘的节点作为叶子节点所对应的FP子树。得到这个FP子树,我们将子树中每个节点的的计数设置为叶子节点的计数,并删除计数低于支持度的节点。从这个条件模式基,我们就可以递归挖掘得到频繁项集了。
根据第三步,最终的FP 树为:
(1)从F往上求条件模式基。
对于F的条件模式基:
通过它,我们很容易得到F的频繁2项集为{A:2,F:2}, {C:2,F:2}, {E:2,F:2}, {B:2,F:2}。递归合并二项集,得到频繁三项集为{A:2,C:2,F:2},{A:2,E:2,F:2},…还有一些频繁三项集,就不写了。当然一直递归下去,最大的频繁项集为频繁5项集,为{A:2,C:2,E:2,B:2,F:2}
(2)对于D的条件模式基:
D节点比F节点复杂一些,因为它有两个叶子节点,因此首先得到的FP子树如下图左。我们接着将所有的祖先节点计数设置为叶子节点的计数,即变成{A:2, C:2,E:1 G:1,D:1, D:1}此时E节点和G节点由于在条件模式基里面的支持度低于阈值,被我们删除,最终在去除低支持度节点并不包括叶子节点后D的条件模式基为{A:2, C:2}。通过它,我们很容易得到D的频繁2项集为{A:2,D:2}, {C:2,D:2}。递归合并二项集,得到频繁三项集为{A:2,C:2,D:2}。D对应的最大的频繁项集为频繁3项集。