机器学习十大算法之Apriori

一、概述

Apriori算法是常用的挖掘数据关联规则的算法,该算法用来找出数据值中频繁出现的数据集合,通过找出这些集合的模式来帮助我们做一些决策。

二、相关问题

1、首先通过一个例子来讲解Apriori算法。

购物篮分析:引发性例子

Question:哪组商品顾客可能会在一次购物时同时购买?

关联分析
Solutions:
    1):经常同时购买的商品可以摆近一点,以便进一步刺激这些商品一起销售。
    2):规划哪些附属商品可以降价销售,以便刺激主体商品的捆绑销售。

示例1:如下是一个超市几名顾客的交易信息。

TID    Items
001    Cola, Egg, Ham
002    Cola, Diaper, Beer
003    Cola, Diaper, Beer, Ham
004    Diaper, Beer

2、各种定义

1、事务:每一条交易称为一个事务,示例1中的数据集就包含四个事务。 
2、项:交易的每一个物品称为一个项,例如Cola、Egg等。 
3、项集:包含零个或多个项的集合叫做项集,例如{Cola, Egg, Ham}。 
4、k−项集:包含k个项的项集叫做k-项集,例如{Cola}叫做1-项集,{Cola, Egg}叫做2-项集。 
5、支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几。例如{Diaper, Beer}出现在事务002、003和004中,所以它的支持度计数是3。 
6、支持度:支持度计数除于总的事务数。例如上例中总的事务数为4,{Diaper, Beer}的支持度计数为3,所以它的支持度是3÷4=75%,说明有75%的人同时买了Diaper和Beer。关联规则A->B的支持度support=P(AB) ,指的是事件A和事件B同时发生的概率。
7、频繁项集:支持度大于或等于某个阈值的项集就叫做频繁项集。例如阈值设为50%时,因为{Diaper, Beer}的支持度是75%,所以它是频繁项集。 
8、前件和后件:对于规则{Diaper}→{Beer},{Diaper}叫做前件,{Beer}叫做后件。 
9、置信度:对于规则{Diaper}→{Beer},{Diaper, Beer}的支持度计数除于{Diaper}的支持度计数,为这个规则的置信度。例如规则{Diaper}→{Beer}的置信度为3÷3=100%。说明买了Diaper的人100%也买了Beer。 置信度confidence=P(B|A)=P(AB)/P(A),指的是发生事件A的基础上发生事件B的概率。
10、强关联规则:大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则。关联分析的最终目标就是要找出强关联规则。

我们可以看出,如果一个项集是频繁项集,则它的子集也是频繁项集。如果一个项集是非频繁项集,则它的超集也是非频繁项集。例如{Diaper, Beer}是频繁项集,则{Diaper}、{Beer}也是频繁项集。{Egg}是非频繁项集,则{Cola, Egg}也是非频繁项集。

 三、算法

Apriori算法分为两个步骤:

第一步通过迭代,检索出事务数据库中的所有频繁项集,即支持度不低于用户设定的阈值的项集;

第二步利用频繁项集构造出满足用户最小信任度的规则。

具体做法就是:

首先找出频繁1-项集,记为L1;然后利用L1来产生候选项集C2,对C2中的项进行判定挖掘出L2,即频繁2-项集;不断如此循环下去直到无法发现更多的频繁k-项集为止。每挖掘一层Lk就需要扫描整个数据库一遍。具体来说分为如下两步:

1) 连接步

为找出Lk(所有的频繁k项集的集合),通过将Lk-1(所有的频繁k-1项集的集合)与自身连接产生候选k项集的集合。候选集合记作Ck。设l1和l2是Lk-1中的成员。记li[j]表示li中的第j项。假设Apriori算法对事务或项集中的项按字典次序排序,即对于(k-1)项集li,li[1]

2) 剪枝步

CK是LK的超集,也就是说,CK的成员可能是也可能不是频繁的。通过扫描所有的事务(交易),确定CK中每个候选的计数,判断是否小于最小支持度计数,如果不是,则认为该候选是频繁的。为了压缩Ck,可以利用Apriori性质:任一频繁项集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。

总结:

Apriori算法具有简单、易理解、数据要求低的优点,但在每一步产生候选项集时循环产生的组合过多,未排除不应该参与组合的元素;每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。

四、改进算法

方法1:基于hash表的项集计数
将每个项集通过相应的hash函数映射到hash表中的不同的桶中,这样可以通过将桶中的项集技术跟最小支持计数相比较先淘汰一部分项集。
方法2:事务压缩(压缩进一步迭代的事务数)
不包含任何k-项集的事务不可能包含任何(k+1)-项集,这种事务在下一步的计算中可以加上标记或删除

方法3:划分
挖掘频繁项集只需要两次数据扫描
D中的任何频繁项集必须作为局部频繁项集至少出现在一个部分中。
第一次扫描:将数据划分为多个部分并找到局部频繁项集
第二次扫描:评估每个候选项集的实际支持度,以确定全局频繁项集。
方法4:选样(在给定数据的一个子集挖掘)
基本思想:选择原始数据的一个样本,在这个样本上用Apriori算法挖掘频繁模式
通过牺牲精确度来减少算法开销,为了提高效率,样本大小应该以可以放在内存中为宜,可以适当降低最小支持度来减少遗漏的频繁模式
可以通过一次全局扫描来验证从样本中发现的模式
可以通过第二此全局扫描来找到遗漏的模式
方法5:动态项集计数
在扫描的不同点添加候选项集,这样,如果一个候选项集已经满足最少支持度,则在可以直接将它添加到频繁项集,而不必在这次扫描的以后对比中继续计算

五、举例

这里列举博客https://blog.csdn.net/u011067360/article/details/24810415中的例子加以说明。

 

参考:

https://blog.csdn.net/u011067360/article/details/24810415

https://blog.csdn.net/bone_ace/article/details/46648965

你可能感兴趣的:(机器学习)