Apriori算法+FP-Growth算法

Apriori算法

一、关联分析

关联分析是在大规模数据集中寻找有趣关系的任务,有两种形式:频繁项集(frequent item sets)和关联规则(association rules)。频繁项集是经常出现在一块儿的物品的集合,关联规则暗示两种物品之间可能存在很强的关系。

 

1、一个项集的支持度(support被定义数据集中包含该项集的记录所占的比例。

支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小值尺度的项集。

sup({A,B})={A,B}同时出现的记录数/总的记录数

 

2、可信度置信度(confidence是针对关联规则来定义的。规则{尿布}->{啤酒}的可信度被定义为"支持度({尿布,啤酒})/支持度({尿布})",由于{尿布,啤酒}的支持度为3/5,尿布的支持度为4/5,所以"尿布->啤酒"的可信度为3/4。这意味着对于包含"尿布"的所有记录,我们的规则对其中75%的记录都适用。

可信度类似于贝叶斯公式,con(A->B)=sup({A,B})/sup({A})   【P(B|A)=P(AB)/P(A)】

 

二、Apriori原理

按照关联分析中支持度的计算方法,需要遍历每条记录并检查是否包含指定项集,对于包含N中物品的数据集共有2^N−1种项集组合,重复上述计算过程是不现实的。

 

因此为减少计算量,引入Apriori原理:

(1)如果某个项集是频繁的,那么它的所有子集也是频繁的

(2)如果一个项集是非频繁的,那么它的所有超集也是非频繁的。

 

三、Apriori算法

(一)发现频繁项集

Apriori算法的两个输入参数分别是最小支持度和数据集。步骤:

1、首先会生成所有单个元素的项集列表。接着扫描数据集,计算每个项集的支持度,根据最小支持度要求删除那些不满足的集合。得到单个元素的频繁项集。

2、然后由单个元素的频繁项集生成包含2个元素的项集列表。接着扫描数据集,计算每个项集的支持度,根据最小支持度要求删除那些不满足的集合。得到2个元素的频繁项集。

……

该过程重复进行直到所有项集都被去掉。

伪代码????

 

(二)产生关联规则

一旦找出了频繁项集,就可以直接由它们产生强关联规则

1、对于每个频繁项集,产生其所有非空子集;

2、对于每个非空子集,如果con(l->S)>=min_con,则输出。其中min_conf是最小置信度阈值。

 

四、python实现

Apriori.py。

 

FP-Growth算法 

FP-growth用于挖掘频繁项集,只需要对数据集扫描两次,而Apriori算法对于每个潜在的频繁项集都会扫描数据集继而判定给定模式是否为频繁项集,因此FP-growth算法的速度要比Apriori算法快。

1、基本过程:(1)构建FP树;(2)从FP树中挖掘频繁项集。

2、优点:一般要快于Apriori

3、缺点:实现比较困难,在某些数据集上性能会下降

4、适用数据类型:离散型数据

一、FP树(Frequent Pattern Tree)

FP-growth算法将数据存储在一中成为FP树的紧凑数据结构中。

一棵FP树看上去与计算机科学中的其他树结构类似,但是它通过链接(link)来连接相似元素,被连起来的元素项可以看成一个链表。

但是与树不同的是,一个元素项可以在一棵FP树中出现多次。存在相似元素的集合会共享树的一部分。只有当集合之间完全不同时,树才会分叉。

FP树的树节点上会存储单个元素、及其在数据集中的出现频率,而每个项集会以路径的方式存储在树中,且可以通过该路径最末尾的树节点上元素的频率来判断该路径的出现次数

 

相似项(即相似节点,指值相同的节点)之间的链接称为节点链接(node link),用于快速发现相似项的位置。

 

二、FP-growth算法

(一)构建FP树

需要构建一个专门的数据类,用于存放FP树。

FP树其实是一棵前缀树,按支持度降序排列,支持度越高的频繁项离根节点越近,从而使得更多的频繁项可以共享前缀。

这里的支持度是指单个元素在数据集中的出现次数。????如果一条记录中同一元素出现多次,如何计算???

 

首先,对该事务型数据库进行一次扫描,计算每一行记录中各种物品的支持度,然后按照支持度降序排列,仅保留频繁项集,剔除那些低于支持度阈值的项。

然后,建立一张项的头表(header table)。这张表的第一列是按照降序排列的频繁项。第二列是指向该频繁项在FP-tree中节点位置的指针。FP-tree中每一个节点还有一个指针,用于指向相同名称的节点。——python中,头表使用字典类型,除存放指针外,还可以用来保存FP树中每类元素的总数。

最后,对事务型数据库进行第二次扫描,根据每条记录,构建路径。在构建时,读取每个项集并将其添加到一条已经存在的路径中。如果该路径不存在,则创建一条新路径。

 

(二)挖掘频繁项集

思路与Apriori相类似,从单元素项集开始,在此基础上逐步构建更大的集合

基本步骤:

(1)从FP树中获得条件模式基

(2)利用条件模式基,构建一个条件FP树

(3)迭代重复步骤(1)、(2),直到树包含一个元素项为止

 

1、条件模式基(conditional pattern base)

条件模式基是以“所查找的元素项”为结尾的路径集合。每一条路径其实都是前缀路径(prefix path)。一条前缀路径是指介于所查找的元素项与树根节点之间的所有内容

为得到这些前缀路径,可以对树进行穷举式搜素;也可以利用头指针链表进行查找。因为头指针表包含相同类型元素链表的起始指针。一旦到达每一个元素项,就可以上溯这棵树直到根节点为止。

2、构建条件FP树

对于每个频繁项,可以使用条件模式基作为输入数据,利用创建FP树的代码构建一个条件FP

存在某个元素,属于频繁项,但在条件FP树中并不是频繁项。

 

posted @ 2018-12-15 18:29  balabalaeight  阅读(1492)  评论(0编辑  收藏  举报