目录
1、回顾Apriori算法
2、FP-growth算法框架
3、举例解释
4、FP-growth算法与Apriori算法对比
5、FP-growth现有改进之一
1、回顾Apriori算法
之前已经讨论了使用Apriori算法进行关联分析。简单回顾如下:
关联分析是一种在大规模数据集中寻找有趣关系(葡萄酒,尿布)的任务。完成这个任务可以有两个步骤:
1.发现频繁项集:发现经常出现在一块的物品的集合
2.挖掘关联规则:挖掘两种物品之间可能存在的关系
对于步骤1,之前讨论的是利用Apriori算法来发现频繁项集,为了使大家对FP-growth算法的优点有更深刻的认识,下面先回顾一下Apriori算法,然后由Apriori算法引出FP-growth算法。
对于步骤2,本次实验使用同一个挖掘关联规则算法,这里不做回顾。
对于步骤1,之前讨论的是利用Apriori算法来发现频繁项集,那么什么是频繁项集呢?
频繁项集:经常出现在一块的物品的集合。如下例子:
其中{葡萄酒,尿布}、{豆奶,莴苣}就是频繁项,由这些频繁项组成的集合就是频繁项集
知道了频繁项集之后,怎样发现频繁项集呢?
回顾Apriori算法发现频繁项集:
1、首先回顾一下Apriori算法的原理:
如果某个项集是频繁的,那么它的所有子集也是频繁的,换句话说,如果一个项集是非频繁集,那么它的所有超集也是非频繁的。
回顾Apriori算法流程
Apriori算法分析
对于候选项集中的所有频繁项,Apriori算法都会重新扫描整个数据集来统计频繁项对应的支持度,从而筛选出满足支持度要求的频繁项,形成频繁项集。
当数据集很大时,Apriori算法的时间大部分消耗在扫描数据集上了。这将显著降低频繁项集发现的速度。
接下来讲解的FP-growth算法,和Apriori算法相比,该算法只需要对数据集进行两次扫描,能够显著加快发现频繁项集的速度。
下面重点讲解FP-growth算法
2、FP-growth算法
FP-growth(FP:Frequent Pattern)算法只需扫描数据集两次,该算法发现频繁项集的基本过程如下:
1、构建FP树
第一次扫描数据——统计每个频繁项的支持度
第二次扫描数据——建树
2、从FP树中挖掘频繁项集
(a):从FP树中获得条件模式基;
(b):利用条件模式基,构建一个条件FP树;
(c):迭代重复步骤(a)和(b),直到树包含一个元素项为止。
3、举例说明
对于如下商品数据集,求出该数据集的频繁项集。
第一步:构建FP树
第一次遍历数据集:获得每个元素的出现频数。接下来,过滤掉不满足最小支持度(假设为:3)要求的元素项,得到频繁1项集。
第二次遍历数据集:1.根据过滤后的有序元素集合(频繁1项集)对每张发票上的商品进行排序
得到过滤及重新排序后的发票商品清单如下:
第二次遍历数据集:2.根据过滤及重新排序后的商品构建FP树。从空集开始,将每张发票上的商品依次过滤及排序后添加到树中,如果树中已存在现有元素,则增加现有元素值;如果现有元素不存在,则向树添加一个分枝。
接下来用下图说明此过程:
从空集开始,依次添加{z , r }、{z , x , y , s , t}、{z}、{x , s , r }、{z , x , y , r , t}、{z , x , y , s , t}.如下图所示:
完整的FP树如下图所示:
除了FP树之外,还需要一个头指针表来指向给定类型的第一个实例。利用头指针表,可以快速访问FP树中一个给定类型的所有元素。下图为带头指针表的FP树:
第二步:从FP树中挖掘频繁项集
1.从FP树中获取条件模式基:
条件模式基:是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前缀路径。简而言之,一条前缀路径就是介于所查找元素项与树根节点之间的所有内容
首先从已经保存在头指针表中的单个频繁元素项开始。对于每个元素项,获得其对应的条件模式基。
每个频繁项的前缀路径如下:
2.创建条件FP树:
对于每一个频繁项,都要创建一颗条件树。为(z,x,..,t