• Apriori学习笔记


     

    Apriori算法是一种挖掘关联规则的频繁项集算法,是由Rakesh AgrawalRamakrishnan Srikant两位在1994年提出的布尔关联规则的频繁项集挖掘算法。算法的名字"Apriori "的由来是因为算法基于先验知识(prior knowledge)。算法核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。

    1. 算法引入

    关联规则挖掘的一个典型例子是购物篮分析。市场分析员要从大量的数据中发现顾客放入其购物篮中的不同商品之间的关系。如果顾客买牛奶,他也购买面包的可能性有多大?什么商品组或集合顾客多半会在一次购物时同时购买?例如,买牛奶的顾客有80%也同时买面包,或买铁锤的顾客中有70%的人同时也买铁钉,这就是从购物篮数据中提取的关联规则。分析结果可以帮助经理设计不同的商店布局。一种策略是:经常一块购买的商品可以放近一些,以便进一步刺激这些商品一起销售,例如,如果顾客购买计算机又倾向于同时购买财务软件,那么将硬件摆放离软件陈列近一点,可能有助于增加两者的销售。另一种策略是:将硬件和软件放在商店的两端,可能诱发购买这些商品的顾客一路挑选其他商品。

    2. 术语定义

    项集:项的集合称为项集。包含k个元素的项集为k项集。

    事务:数据库中的记录。

    支持度:数据项集A的支持度support(A)是数据库D中包含A的事务数量与D的总事务数量之比,supportA= PA)。有时为了表示方便,数据项集A的支持度是用数据库D中包含A的数量来表示。

    最小支持度 minsupport,用户指定的一个阈值,取值为0-1

    频繁项集:如果k项集A满足最小支持度阈值,称为频繁k项集

    候选项集:用于产生频繁项集的集合。

    关联规则:关联规则是形如AàB的蕴涵式,表示通过A可以推导"得到"B 

    关联规则支持度:关联规则AàB支持度support=P(AB),指的是事件A和事件B同时发生的概率。

    关联规则置信度置信度confidence=P(B|A)=P(AB)/P(A),指的是发生事件A的基础上发生事件B的概率。最小置信度阈值mincontinence表示规则的最低可靠性。

    举例说明:在规则Computer à antivirus_software , 其中 support=2%, confidence=60%中,就表示的意思是所有的商品交易中有2%的顾客同时买了电脑和杀毒软件,并且购买电脑的顾客中有60%也购买了杀毒软件。

    3. 算法流程

    整个算法过程分为两个步骤:第一步通过迭代,检索出事务数据库中的所有频繁项集,即支持度不低于用户设定的阈值的项集;第二步利用频繁项集构造出满足用户最小信任度的规则。具体做法就是:首先找出频繁1-项集,记为L1;然后利用L1来产生候选项集C2,对C2中的项进行判定挖掘出L2,即频繁2-项集;不断如此循环下去直到无法发现更多的频繁k-项集为止。每挖掘一层Lk就需要扫描整个数据库一遍。

    算法利用到了一个重要性质:Apriori 性质。

    Apriori 性质:任一频繁项集的所有非空子集也必须是频繁的。意思就是说,生成一个k-itemset的候选项时,如果这个候选项有子集不在(k-1)-itemset(已经确定是frequent)中时,那么这个候选项就不用拿去和支持度判断了,直接删除。具体而言:

    1连接步

    为找出Lk(所有的频繁k项集的集合),通过将Lk-1(所有的频繁k-1项集的集合)与自身连接产生候选k项集的集合。候选集合记作Ck。设l1l2Lk-1中的成员。记li[j]表示li中的第j项。假设Apriori算法对事务或项集中的项按字典次序排序,即对于(k-1)项集lili[1]<li[2]<……….<li[k-1]。将Lk-1与自身连接,如果(l1[1]=l2[1])&&( l1[2]=l2[2])&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1]),那认为l1l2是可连接。连接l1l2 产生的结果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}

    2剪枝步

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

    4. 算法流程图

    5. 具体案例

    一个超级市场的销售系统记录了顾客购物的情况。表1-1中记录了5个顾客的购物单。

    记录号

    所购物品清单

    1

    啤酒、尿布,婴儿爽身粉,面包,雨伞

    2

    尿布,婴儿爽身粉

    3

    啤酒、尿布,牛奶

    4

    尿布,啤酒,洗衣粉

    5

    啤酒,牛奶,可乐饮料

    1-1

    双项统计

    支持度

    {啤酒,尿布}

    3/5

    {啤酒,牛奶}

    2/5

    {尿布,婴儿爽身粉}

    2/5

    超市经理想知道商品之间的关联,要求列出那些同时购买的、且支持度≥40%(即在5行中至少出现两次)的商品名称。 KDD系统通过特定算法(例如著名的Apriori(验证)算法及或改进算法)多次扫描数据库,依次得出如表2和表3。其中支持度<2/5的项,如单项的{面包}{雨伞}双项中的 {尿布,牛奶}等等已经略去,三项统计为空,其中只有 {啤酒,尿布,牛奶}出现了一次(3-13号记录),支持度小于40%,略去。

    1-2 1-3

    单项统计

    支持度

    {啤酒}

    4/5

    {尿布}

    4/5

    {婴儿爽身粉}

    2/5

    {牛奶}

    2/5

    从单项统计中看出80%的顾客买了啤酒、80%的顾客买了尿布。从双项统计中看出,60%的顾客同时买了啤酒和尿布,40%的顾客买了啤酒和牛奶,40%的顾客买了尿布和爽身粉。还可观察到买了啤酒顾客中又买了尿布的占0.6{啤酒,尿布}/0.8{啤酒}=75% (称为置信度)。于是可得出下列六条规则,其中:s为支持度,c为置信度。
    R1
    :啤酒尿布,S=60%C=0.6/0.8=75%
    R2
    :尿布啤酒,S=60%C=0.6/0.8=75%
    R3
    :牛奶啤酒, S=40%C=0.4/0.4=100%
    R4
    :啤酒牛奶, S=40%C=0.4/0.8=50%
    R5
    :尿布爽身粉。S=40%C=0.4/0.8=50%
    R6
    :婴儿爽身粉尿布。S=40%C=0.4/0.4=100%

    规则反映了物品之间的表面联系,不一定是现实世界的因果关系。规则是死的,人是活的,运用之妙成乎于人。例如,R6"婴儿爽身粉尿布"有很高的置信度,是合理可理解的,R3有很高的置信度将提示进一步的调查分析,本例中是因为训练资料太少引起的失真。

     

    6. 性能分析

    研究几个跟Apriori算法性能相关的几个参数:

    1minSup:最小支持度

    从图1中可以看出,改变minconf对算法运行时间没有太大影响;

    而当minsup减小,运行时间呈指数趋势增长。

     

    2minConf:最小置信度

    2显示了挖掘的关联规则数量与minsupminconf的关系,结果上图显示的运行类似。这是因为频繁集的数量随着minsup的减小呈指数趋势增加。

    minsup减小,频繁集的数量指数趋势增加

    3dataSize:数据大小

    随着事务数量的增加,算法运行时间线性增加。

    总的来说,对于Apriori算法而言,对特定的数据集,minsup是比minconf和事务数量更为重要的性能影响因素。

     

    7. 算法缺点

    从以上的算法执行过程可以看到Apriori算法的缺点:

    第一:在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;

    第二:每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加现出几何级数的增加。

     

    8. 总结

    Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。

     

    Apriori演算法所使用的前置统计量包括了:

        最大规则物件数:规则中物件组所包含的最大物件数量

        最小支援:规则中物件或是物件组必顸符合的最低案例数

        最小信心水准:计算规则所必须符合的最低信心水准门槛

      该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。

      可能产生大量的候选集,以及可能需要重复扫描数据库,是Apriori算法的两大缺点。

     

    参考资料:

    [1]百度百科Apriori词条:http://baike.baidu.com/link?url=ojdG-dUjb_6xTAA3-VoFnRF0yIV1ElijaBlXERTGhnSpq-JKAlU6d0vRUDzVGpuwZ8VnYeCaNLJcRSa9uzTf2K

    [2] 颜雪松、蔡之华一种基于Apriori的高效关联规则挖掘算法的研究计算机工程与应用 2002.10 1002-8331(2002) 10-0209-03 209-211

    [3] 李绪成,王保保挖掘关联规则中Apriori算法的一种改进计算机工程 2002.7 28 104-105

    [4] 毛秉毅一种新的关联规则发现算法及应用研究计算机应用与工程 2002.22

  • 相关阅读:
    SpringBoot中如何优雅的使用多线程
    ASP.NET MVC经典项目ProDinner项目解析(5)
    ASP.NET MVC经典项目ProDinner项目解析(4)
    ASP.NET MVC经典项目ProDinner项目解析(1)
    ASP.NET MVC经典项目ProDinner项目解析文章索引
    致我们工作中的设计模式之备忘录模式
    致我们工作中的设计模式之适配器模式
    ASP.NET MVC经典项目ProDinner项目解析(3)
    童话进行中的Silverlight
    致我们工作中的设计模式之基本原则职责单一原则
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/4364685.html
Copyright © 2020-2023  润新知