如果一个集合是频繁的,那么在同一个最小sup值下,它的子集也是频繁的。算法的核心思想是:首先找到所有的1项代表集C1,根据sup过滤得到频繁集合F1,从F1中得到代表集C2,C2的自己如果有不在F1中的,就删掉【这个过程称为剪枝】,然后遍历数据集,当C2中的数据在原始数据集中是频繁的时候,得到频繁集F2,依次往复。
对于一个很大的数据库来说,分区之后,如果某一项是频繁的,意味着至少存在一个分区,它也是频繁的,所以,第一次扫描数据库,先把当前分区的数据全部收入内存,然后计算出当前分区的所有频繁集,然后把所有的频繁集统一收作全局代表。再过滤出全局频繁的,整个过程只有两次扫描数据库【有点小把戏,把数据缩小到内存中能放下,在内存中算】
此时,当前项的频率就是ID列表的大小,如果要看两个项的频率就是求IDlist的交集。 这种存储具备如下的特征:如果idlist一模一样,代表这两项肯定是一起出现;如果x的ID列表是Y的ID列表的子集,那么拥有X项的记录必定拥有Y
对所有k集频繁项做hash计算,hash表中存储计算结果为同一个hash值的个数【可以在具体的分区做】,如果这个数值小于support值,那么当前hash桶中的所有项都不是频繁的,就不会当做代表集频繁模式挖掘-DHP算法详解 | I am Busy
大致思路是:同一个hash值的肯定会进同一个地方,如果一项出现多个,那么他们必定是进同一个hash桶,也就是说这个的hash桶的个数会很多,如果个数少,说明这个hash桶中的数据都不是频繁的
FP-tree(frequent pattern tree)定义:
FP-tree挖掘的步骤:
经过FP定义构建好FP-tree之后,这时它的跟节点是root,可以称作全局树,然后根据header table给定的顺序,从末尾的项,选择一个元素P,以它为条件,构建FP-tree,称作P条件先的FP-tree,构建策略是从P开始往上寻找父节点,count值则是以P为基础,构建结果后,一直到最终只剩下一个元素,挖掘结束