使用Apriori算法和FP-growth算法进行关联分析

本文深入探讨了关联分析的原理,重点关注Apriori算法和FP-growth算法。Apriori算法利用Apriori原理减少计算量,但需多次扫描数据集。FP-growth算法通过构建FP树和头指针表,仅需两次遍历数据,提高了效率。文章详细解析了两种算法的实现过程,包括频繁项集的挖掘和关联规则的生成,并通过示例展示了算法的运行逻辑和效果。
摘要由CSDN通过智能技术生成

1. 关联分析

关联分析是在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:

  • 频繁项集
  • 关联规则

频繁项集(frequent item sets)是经常出现在一块儿的物品的集合,关联规则(association rules)暗示两种物品之间可能存在很强的关系。

下面用一个例子来说明这两种概念:图1给出了某个杂货店的交易清单。

交易号码

商品

0

豆奶,莴苣

1

莴苣,尿布,葡萄酒,甜菜

2

豆奶,尿布,葡萄酒,橙汁

3

莴苣,豆奶,尿布,葡萄酒

4

莴苣,豆奶,尿布,橙汁

图1 某杂货店交易清单

频繁项集是指那些经常出现在一起的商品集合,图中的集合{葡萄酒,尿布,豆奶}就是频繁项集的一个例子。从这个数据集中也可以找到诸如尿布->葡萄酒的关联规则,即如果有人买了尿布,那么他很可能也会买葡萄酒。

我们用支持度和可信度来度量这些有趣的关系。一个项集的支持度(support)被定义数据集中包含该项集的记录所占的比例。如上图中,{豆奶}的支持度为4/5,{豆奶,尿布}的支持度为3/5。支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小值尺度的项集。

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

2. Apriori原理

假设我们有一家经营着4种商品(商品0,商品1,商品2和商品3)的杂货店,2图显示了所有商品之间所有的可能组合:

图2 集合{0,1,2,3,4}中所有可能的项集组合

对于单个项集的支持度,我们可以通过遍历每条记录并检查该记录是否包含该项集来计算。对于包含N中物品的数据集共有\( 2^N-1 \)种项集组合,重复上述计算过程是不现实的。

研究人员发现一种所谓的Apriori原理,可以帮助我们减少计算量。Apriori原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。更常用的是它的逆否命题,即如果一个项集是非频繁的,那么它的所有超集也是非频繁的

在图3中,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3},{1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的后,就可以紧接着排除{0,2,3}、{1,2,3}和{0,1,2,3}。

图3 图中给出了所有可能的项集,其中非频繁项集用灰色表示。

3. 使用Apriori算法来发现频繁集

前面提到,关联分析的目标包括两项:发现频繁项集和发现关联规则。首先需要找到频繁项集,然后才能获得关联规则(正如前文所讲,计算关联规则的可信度需要用到频繁项集的支持度)。

Apriori算法是发现频繁项集的一种方法。Apriori算法的两个输入参数分别是最小支持度和数据集。该算法首先会生成所有单个元素的项集列表。接着扫描数据集来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。

3.1 生成候选项集

数据集扫描的伪代码大致如下:

对数据集中的每条交易记录tran:
    对每个候选项集can:
        检查can是否是tran的子集
        如果是,则增加can的计数
对每个候选项集:
    如果其支持度不低于最小值,则保留该项集
返回所有频繁项集列表

下面看一下实际代码,建立一个apriori.py文件并加入一下代码:



其中numpy为程序中需要用到的Python库。



其中C1即为元素个数为1的项集(非频繁项集,因为还没有同最小支持度比较)。map(frozenset, C1)的语义是将C1由Python列表转换为不变集合(frozenset,Python中的数据结构)。



其中D为全部数据集,Ck为大小为k(包含k个元素)的候选项集,minSupport为设定的最小支持度。返回值中retList为在Ck中找出的频繁项集(支持度大于minSupport的),supportData记录各频繁项集的支持度。

retList.insert(0, key)一行将频繁项集插入返回列表的首部。

3.2 完整的Apriori算法

整个Apriori算法的伪代码如下:

当集合中项的个数大于0时:
    构建一个由k个项组成的候选项集的列表(k从1开始)
    计算候选项集的支持度,删除非频繁项集
    构建由k+1项组成的候选项集的列表

程序代码如下:



该函数通过频繁项集列表$ L_k $和项集个数k生成候选项集$ C_{k+1} $。

注意其生成的过程中,首选对每个项集按元素排序,然后每次比较两个项集,只有在前k-1项相同时才将这两项合并。这样做是因为函数并非要两两合并各个集合,那样生成的集合并非都是k+1项的。在限制项数为k+1的前提下,只有在前k-1项相同、最后一项不相同的情况下合并才为所需要的新候选项集。

由于Python中使用下标0表示第一个元素,因此代码中的[:k-2]的实际作用为取列表的前k-1个元素。



该函数为Apriori算法的主函数,按照前述伪代码的逻辑执行。Ck表示项数为k的候选项集,最初的C1通过createC1()函数生成。Lk表示项数为k的频繁项集,supK为其支持度,Lk和supK由scanD()函数通过Ck计算而来。

函数返回的L和supportData为所有的频繁项集及其支持度,因此在每次迭代中都要将所求得的Lk和supK添加到L和supportData中。

代码测试(在Python提示符下输入):


Apriori算法FP-Growth算法都是用于频繁项集挖掘的经典算法,它们都可以用来发现数据集中的频繁项集。 Apriori算法的基本思想是利用集合的逐层包含关系,从而发现频繁项集。该算法首先扫描数据集,计算出所有项的支持度,然后利用支持度和最小支持度阈值剪枝,得到一组频繁1项集。然后,利用频繁1项集生成所有频繁2项集,再用频繁2项集生成频繁3项集,依次类推,直到不能再生成更多的频繁项集为止。 FP-Growth算法则是一种基于树形结构的频繁项集挖掘算法。该算法首先构建一个称为FP树的数据结构,并将所有事务按照频繁项的顺序插入到FP树中。然后,利用FP树的结构和头指针表,快速地发现所有的频繁项集。与Apriori算法不同的是,FP-Growth算法不需要生成候选项集,因此可以大大减少算法的时间和空间复杂度。 相比之下,FP-Growth算法具有以下优点: 1. FP-Growth算法不需要生成候选项集,因此可以大大减少算法的时间和空间复杂度。 2. FP-Growth算法使用FP树来存储数据,可以更方便地处理数据集中的频繁项集。 3. FP-Growth算法可以处理更大规模的数据集。 但是,由于FP-Growth算法需要构建FP树,因此在处理稀疏数据集时,其效率会下降。而Apriori算法则可以更好地处理稀疏数据集。因此,在实际应用中,我们需要根据具体的问题和数据集的特点来选择合适的算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值