Apriori算法和FP-树算法

Apriori算法

Ariori算法利用频繁项集性质的先验知识(prior knowledge),通过逐层搜索的迭代方法,即将K-项集用于探查(k+1)-项集,来穷尽数据集中的所有频繁项集。

先找到频繁1-项集集合L1,然后用L1找到频繁2-项集集合L2,接着用L2找到L3,知道找不到频繁K-项集,找每个频繁项集需要一次数据库扫面。

Apriori性质:频繁项集的所有非空子集也必须是频繁的。(A∪B模式不可能比A更频繁的出现)

Apriori算法主要有连接和剪枝两个操作。

下面看一个例子分析:

该例子中一共四条记录,我们通过对这些记录的探查来找出哪几种物品是被频繁的一起购买的(即那些物品之间存在相关性)。假设要求最小支持计数为2(50%)。

我们是计算L1,由L1得到L2,由L2得到L3,一直计算下去由Lk-1得到Lk,直到找不到频繁的K-项集为止(操作步骤依次为连接,剪枝,扫描数据库)

第一步:通过对数据库扫描,计算所有的频繁1-项集(对每个物品出现次数进行累计计数),扫描之后得到C1。其中{D}不满足最小支持计数,我们直接把{D}删除掉(因为D只出现一次,我们也知道任何包含D的集和的出现次数不可能超过一次,这也是Apriori性质)

第二步:如何由L1计算L2,我们根据Apriori算法的两个步骤,连接和剪枝来计算。首先看连接,连接需要前面的K-1个元素相同,而此时L1中每一项都只有一个元素,因此每一个元素都满足条件,于是每一个都可以互相连接(自由组合即可,其中{A,B}和{B,A}是相等的,组合结果和次序无关),可以由此得到C2;

那么C2用不用剪枝呢?剪枝的目的是检查任何K-1 个项集是不是在Lk-1当中,此时显然不需要,C2当中的K-1项集也就是1-项集肯定是来自于L1当中的。此时C2当中包含了所有频繁二项集,但不能说每一个项集都是频繁的。

我们必须通过扫描数据库来确定是否频繁。扫描之后,删掉不满足最小支持度的成员得到L2。

第三步:如何由L2得到L3,依然根据Apriori算法,首先进行连接。C3通过L2和L2中每一项进行连接得到,我们知道互相连接的条件是前面K-1个元素相同,则C3={{A,B,C},{A,C,E},{B,C,E}}。此时我们认为所有的频繁三项集都包含在C3中,但不能说每一个项集都是频繁的。在进行数据库扫描确定其是否是频繁的之前,我们先进行下满的操作(以便减少计算量)

此时我们使用Apriori性质剪枝:频繁项集的所有子集必须是频繁的,对于候选项C3,我们可以删除其子集为非频繁的选项:

  • {A,B,C}的2项子集是{A,B},{A,C},{B,C},其中{A,B}不是L2的元素,所以删除这个选项;
  • {A,C,E}的2项子集是{A,C},{A,E},{C,E},其中{A,E}不是L2的元素,所以删除这个选项;
  • {B,C,E}的2项子集是{B,C},{B,E},{C,E},它的所有2项子集都是L2的元素,因此保留这个选项。

这样剪枝后得到C3={{B,C,E}}。

接下来我们要验证,C3中是否满足最小支持度的要求,此时扫描一次数据库即可。

Apriori算法的主要挑战

  • 要对数据进行多次扫描(每次新产生一个Lk就要扫描一次);
  • 产生大量的候选项集(对于长度为100的频繁模式,会产生2^100个候选);
  • 对候选项集的支持度计算非常繁琐(通过模式匹配检查);

FP-树算法

不产生候选项集的算法

例子如下:

 

 

 PS:这里挖掘的是频繁项集,是同一类的东西(比如:黄油,面包,牛奶这些都是用户购买的东西)。还有一种多维关联规则挖掘,在这种情况下,我们进行的是频繁谓词的挖掘。例如{age,occupation,buys}这是一个3-谓词集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值