关联分析:Apriori算法

      Apriori算法是寻找关联规则的最早算法之一,比较经典的算法。下面从5个方面对该算法进行说明

    1.任务

      对于关联分析来说,任务就是描述变量之间的关联关系(这里一定要注意区分关联关系与因果关系,关联并不一定导致因果),目前常见到的应用场景可能就是商品销售了,比如有名的“尿布与啤酒”案例,Apriori算法的任务就是找出具有一定关联度的变量。

    2.结构

      关联规则是形如X\rightarrow Y的表达式,XY是样本数据属性集A=\left \{ a_{1},a_{2},...a_{k} \right \}的两个非空子集, Apriori算法的结构就是用概率的形式表示关联规则。在Apriori算法中,有两个基于概率的参数:支持度(support)和置信度(confidence),支持度表示的是X,Y同时出现在数据项中的频繁程度,置信度指的是Y出现在包含X的数据项中的频繁程序。以一个简单的例子说明支持度和置信度的定义形式,现有样本集如下所示,要计算X\left \{ Bread \right \}Y\left \{ Milk,Diaper \right \}的支持度与置信度

                                                                                  

                                                               s(X\rightarrow Y)=\frac{N(X,Y)}{N}=\frac{2}{5}=0.4

                                                               c(X\rightarrow Y)=\frac{N(Y|X)}{N(X)}=\frac{N(X,Y)}{N(X)}=\frac{2}{4}=0.5

     N(Y|X), N(X,Y):同时包含X,Y的数据项个数

     N(X):包含X的数据项个数

     N:数据项总数

    3.评分函数

      关联分析属于模式的探索,而模式一般无法像模型那样有比较客观的评分函数,模式的评分函数带有较强的主观性,就像贝叶斯理论那样。在Apriori算法中,可以用支持度和置信度的阈值作为一个评价指标,对于0.5的支持度/置信度和0.7的支持度/置信度两种情况,不能说0.7的一定比0.5的更好,支持度/置信度过高容易遗漏部分的关联变量,过低则容易引入噪声,支持度和置信度阈值的选择就存在着较强的主观性。

    4.搜索方法  

      基于“用概率表示关联规则”的结构以及“支持度和置信度的阈值这样的评分函数,该使用怎样的搜索方法来建立这样的关联模式呢?在一般的关联分析中,搜索过程主要分为两步:

  •        产生频繁项集:寻找大于支持度阈值的项集,该项集即称为频繁项集
  •        生成规则:在频繁项集中寻找大于置信度阈值的项集,生成关联规则

       对于有p个属性的样本集,所有可能的关联规则数量为p2^{p-1},如果使用贪婪的搜索方法,计算量将是指数级的,大数据环境中p一般能达到几十个,计算量非常可怕。当p=5时,整个规则的搜索过程如下图所示

                                    

      R. Agrawal 和 R. Srikant于1994年提出了Apriori(Apriori一词即为先验的)算法,优化了这种搜索过程。R. Agrawal 和 R. Srikant提出了两条先验原理

  • 如果一个项集是频繁项集,那么其子集也是频繁项集
  • 如果一个项集不是频繁项集,那么其所有超集都不是频繁项集

    这两原理的证明及理解都比较容易,基于这两条原理,Apriori算法中计算频繁集的具体过程如下,先看一下原著中的描述

  • Let k=1
  • Generate frequent itemsets of length k
  • Repeat until no new frequent itemsets are identified
    • Generate length (k+1) candidate itemsets from length k frequent itemsets
    • Prune candidate itemsets containing subsets of length k+1 that are infrequent
    • Count the support of each candidate by scanning the DB
    • Eliminate candidates that are infrequent, leaving only those that are frequent

    基于自己的理解,Apriori算法计算频繁集的具体执行步骤可描述如下。设数据集中属性集为A=\left \{ a_{1},a_{2},...a_{p} \right \}X_{k}为包含k个变量的属性子集,其数量为C_{p}^{k}X^{\sigma }_{k}表示X_{k}中的频繁项集

  • k=1
  • 计算X_{1}中的频繁项集X^{\sigma }_{k}
  • for  k=2:p
  • X^{\sigma }_{k-1}中产生X_{k}
  • 计算X_{k}中的频繁项集X^{\sigma }_{k} (该步中使用了第一条及第二条先验原理)
  • end

   这个过程可以用下图来简易描述

                               

   得到频繁集后,可以利用超过置信度阈值的频繁项集生成关联规则,不过此时有个问题,在第2节的公式

                                                       c(X\rightarrow Y)=\frac{N(Y|X)}{N(X)}=\frac{N(X,Y)}{N(X)}=\frac{2}{4}=0.5

    中,分母为N(X)而不是N(Y),从语义上理解可以理解为:XY有关联,而不是YX有关联。很显然,在多数情况下分母为N(X)和分母为N(Y)的计算结果是不同的,当置信度阈值为某个值时,这有可能导致X\rightarrow Y或者Y\rightarrow X中的某条规则被丢弃。在实际商品销售中,考虑一下这二者的区别

  • 当关联规则X\rightarrow Y成立、Y\rightarrow X不成立时,可以在销售商品X(这里简单的以X代替商品)时打折销售商品Y
  • 当关联规则Y\rightarrow X成立、X\rightarrow Y不成立时,可以在销售商品Y时打折销售商品X
  • 当关联规则Y\rightarrow X成立、X\rightarrow Y也成立时,可以商品XY一起打折销售

   5.数据管理技术

     Apriori算法在数据库中采用的是多重线性扫描的方式,在不同的k值下都需要对数据库扫描一次,判断哪些项集是频繁项集,但是相对于贪婪式的搜索方法,Apriori算法已能大大减小数据库扫描次数了。在关联规则算法中,很多算法中搜索和数据管理部分是算法的关键部分,特别的,关联规则使用广度优先、一般到特殊的系统搜索方法,以尽可能使数据库的扫描次数减少到最小。

    (PS:文中所有的图表均引用自博客https://blog.csdn.net/baimafujinji/article/details/53456931

猜你喜欢

转载自blog.csdn.net/huguozhiengr/article/details/82869591