MachinLearning_Apriori

一.Apriori

从大规模数据集中寻找物品间的隐含关系被称作关联分析(association analysis)或者关联规则学习(association rule learning)。

那么什么是关联分析呢?关联分析是一种在大规模数据集中寻找有趣关系的任务。这些任务包括两项:发现频繁项集和从频繁项集中发现关联规则。

  • 频繁项集(frequent item sets):是经常出现在一块的物品的集合,例如香烟和打火机。

  • 关联规则(association rules):暗示两种物品之间可能存在很强的关系,通常表示物品之间的“如果…那么”关系,例如“如果购买香烟,那么有很大概率会购买打火机”。
    那么如何定量地衡量一物品集合是否频繁的呢?以及如何定量地衡量两种物品之间的关系?在这里就需要引入一些新的概念:

  • 项集:项的集合,项可以是商品,那么项集就是商品的集合。

  • 支持度:数据集中包含该项集的记录所占的比例,也就是该项集在数据集中的出现频率,用以衡量项集的频繁程度。

  • 可信度:又称置信度,是针对关联规则来定义的,表示某项集在指定条件下的出现概率,用以衡量物品之间的关系。
    下面我们结合实例来说明如何进行关联分析。
    【示例】:杂货店的交易清单。

交易号码商品
0豆奶,莴苣
1莴苣,尿布,葡萄酒,甜菜
2豆奶,尿布,葡萄酒,橙汁
3莴苣,豆奶,尿布,葡萄酒
4莴苣,豆奶,尿布,橙汁

从数据集中可以得到,{豆奶} 分别在交易号码(以下简称编号 0、2、3、4)中出现,根据支持度的定义“数据集中包含该项集的记录所占的比例”,数据集中包含 {豆奶} 的记录共有 4 条,总数据数为 5 ,因此可求出 {豆奶} 的支持度为 0.8。同理,我们可求出 {甜菜} 的支持度为 0.2。

我们已经计算出 {豆奶} 和 {甜菜} 这两个项集的支持度,那么它们都是频繁的吗?这时候就需要我们设置一个阈值,如果项集的支持度大于等于该阈值,则我们认为该项集是一个频繁项集,例如设置阈值为 0.6,那么 {豆奶} 就是一个频繁项集,而 {甜菜} 就不是频繁项集。上面我们设置的阈值通常被称为最小支持度。有了最小支持度之后,我们就可以保留满足最小支持度要求的项集。

在最小支持度为 0.6 的前提下,项集 {尿布,葡萄酒} 是一个频繁项集,我们可以根据该频繁项集找出关联规则,例如 {尿布}->{葡萄酒}。根据可信度的定义“表示某项集在指定条件下的出现概率”,在这里“指定条件”指的是 {尿布} 的支持度,那么这条规则的可信度可被定义为“支持度 {尿布,葡萄酒} / 支持度 {尿布}”。从数据集中可以看到,{尿布,葡萄酒} 的支持度为 0.6,尿布的支持度为 0.8,所以 {尿布->葡萄酒} 的可信度度为 0.75。这意味着对于包含“尿布”的所有记录,我们的规则对其中 75% 的记录都适用,也就是说如果有人买了尿布,那么他很可能也会买葡萄酒。

使用频繁项集和关联规则,商家就可以更好地理解他们的顾客。

通过上面的分析可以知道,支持度和可信度是用来量化关联分析是否成功的方法。假设想找到支持度大于 0.8 的所有项集,应该如何去做?一个办法是生成一个物品所有可能组合的清单,然后对每一种组合统计它出现的频繁程度,但当物品成千上万时,上述做法非常非常慢,且所需的计算代价很高,蛮力搜索方法并不能解决这个问题,所以需要用更智能的方法在合理的时间范围内找到频繁项集。此时可采用 Apriori 原理,以减少关联规则学习时所需的计算量。

Apriori 原理

假设我们在经营一家商品种类并不多的杂货店,我们对那些经常在一起被购买的商品非常感兴趣。我们只有 4 种商品:商品 0,商品 1,商品 2 和商品 3。我们不关系客户购买某一件商品多少件,我们只关心客户购买不同种类商品。

下图显示了物品之间所有可能的组合。图中从上往下的第一个集合是空集,表示不包含任何物品的集合。物品集合之间的连线表明两个或者更多集合可以组合形成一个更大的集合。
在这里插入图片描述
在计算项集支持度时,我们需要遍历每条记录并检查该记录是否包含项集中的元素。在扫描完所有数据之后,使用统计得到的项集的记录总数除以总的交易记录数,就可以得到该项集的支持度。观察上图可以发现,即使对于仅有 4 种物品的集合,也需要遍历数据 15 次。而随着物品数目的增加遍历次数会急剧增长。对于包含 N 种物品的数据集共有 2 N − 1 2^N - 1 2N1种项集组合。当物品的数量增加时,可能的项集组合也随着称指数级增长,对于现代的计算机而言,需要很长的时间才能完成运算。

为了降低所需的计算时间,研究人员发现一种所谓的 Apriori 原理,该原理可以帮我们减少可能感兴趣的项集。

  • 如果某个项集是频繁的,那么它的所有子集也是频繁的,见上图左图;
  • 如果某个项集是非频繁的,那么它的所有超集也是非频繁的,见上图右图。

该原理是如何推导得出的?

  • 假设项集 {1,2,3} 为频繁项集,支持度为 S。
    P ( 123 ) ≥ S P ( 12 ) ≥ P ( 123 ) = P ( 12 ) P ( 3 ∣ 12 ) → P ( 12 ) ≥ S P(123)\geq S \quad P(12)\geq P(123)=P(12)P(3|12)\rightarrow P(12)\geq S P(123)SP(12)P(123)=P(12)P(312)P(12)S
  • 假设项集 {2,3} 为非频繁项集,支持度为 S。
    P ( 23 ) < S P ( 123 ) = P ( 23 ) P ( 1 ∣ 23 ) ≤ P ( 23 ) → P ( 123 ) ≥ S P(23)<S \quad P(123)=P(23)P(1|23)\leq P(23)\rightarrow P(123)\geq S P(23)<SP(123)=P(23)P(123)P(23)P(123)S

根据该原理,假设知道项集 {2,3} 是非频繁的,那么后续的项集 {0, 2, 3}、{1,2,3} 以及 {0,1,2,3} 都是非频繁的。也就是说,一旦计算出 {2,3} 的支持度,知道它是非频繁的之后,就不需要再计算项集 {0, 2, 3}、{1,2,3} 以及 {0,1,2,3} 的支持度,因为我们知道这些集合不会满足我们的要求。使用该原理就可以避免项集数目的指数增长,从而在合理时间内计算出频繁项集。
这就是取名为 Apriori 算法的原因。Apriori 在拉丁语中指“来自以前”。当定义问题时,通常会使用先验知识或者假设,这被称作“一个先验”(a priori)。先验知识可能来自领域知识,先前的一些测量结果等等。在关联分析中,我们运用先验知识去判断后续的项集是否频繁。

Apriori 工作过程

如何将 Apriori 原理应用于算法中?难点在于我们该如何根据已有的项集去组合新的项集。
在这里插入图片描述

  • C1,C2,…,Ck 分别表示 1-项集,2-项集,…,k-项集;
  • L1,L2,…,Lk 分别表示对应项集经过“过滤”后的频繁项集;
  • Scan:表示数据项扫描函数,该函数过滤不满足最小支持度的项集。

观察上面的 Apriori 算法的工作流程我们可以发现,Apriori 算法首先扫描一遍数据集,从中生成 1-项集 C1。接着调用 Scan 函数扫描 C1,过滤不满足最小支持度的项集,最后留下的项集就是频繁项集 L1。根据 Apriori 原理可知,非频繁项集的所有超集也都是非频繁的,那么我们就没有必要球这些非频繁项集的组合。因此,第二轮迭代中,只需要对上一轮迭代产生的频繁项集进行新的组合即可,然后接着调用 Scan 函数检查新组合的支持度是否满足最小支持度要求,将不满足的新组合给过滤。如此循环,直到没有新组合可生成为止。

  • 连接步:分为两种情况,第一是从数据集中生成 C1,第二是根据 L k − 1 L_{k-1} Lk1生成 C k C_k Ck。简单地说,连接步就是产生项集的过程。
  • 剪枝步:剔除不满足最小支持度的项集。从图中来看就是从 C k C_k Ck L k L_k Lk 的过程。
    示例说明
    假设现在数据库中有 4 条交易记录,其中有 5 件不同种类的商品,分别用编号 1、2、3、4、5 表示,最小支持度为 0.5。
TIDItems
1001 3 4
2002 3 4
3001 2 3 5
4002 5
  • 第一轮:先从数据库中扫描,生成 1-项集 C1。
Itemssupport
{1}0.50
{2}0.75
{3}0.75
{4}0.25
{5}0.75
  • 第一轮:调用 Scan 函数,过滤支持度小于 0.5 的项集。可以看到上表中商品 4 的支持度小于 0.5,因此将 {4} 过滤,得到 L1。
Itemssupport
{1}0.50
{2}0.75
{3}0.75
{5}0.75
  • 第二轮:根据 L1,生成 2-项集 C2。
Itemssupport
{1,2}0.25
{1,3}0.50
{1,5}0.25
{2,3}0.50
{2,5}0.75
{3,5}0.50
  • 第二轮:调用 Scan 函数,过滤支持度小于 0.5 的项集,可以看到项集 {1, 2} 和 {1, 5} 不满足最小支持度要求,因此得到 L2。
Itemssupport
{1,3}0.50
{2,3}0.50
{2,5}0.75
{3,5}0.50
  • 第三轮:根据 L2,生成 3-项集 C3。
Itemssupport
{1,2,3}0.25
{1,2,5}0.25
{1,3,5}0.25
{2,3,5}0.50
  • 第三轮:调用 Scan 函数,只有项集 {2, 3, 5} 满足要求,得到 L3。
Itemssupport
{2,3,5}0.50
  • 第四轮:根据 L3 生成 C4,此时 L3 也不能产生新的组合,循环结束。

从上面的过程中我们可以发现,Apriori 算法工作过程中的连接步,在每次执行时都需要扫描一遍数据库,来计算每个新组合(项集)的支持度。借此,我们可以发现 Apriori 算法的优缺点以及适用的数据类型。

  • 优点:易编码实现;
  • 缺点:在大数据集上可能较慢;
  • 适用数据类型:数值型或者标称型数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值