精华内容
下载资源
问答
  • 针对维修过程中各专业忙闲不均和协同工作效率低下等问题, 提出了一种基于改进关联规则的维修专业组合和优化方法。首先, 以均衡任务量为目标, 建立了维修专业关联度分析模型; 其次, 以功能聚合为目标, 提出了以较大...
  • 关联规则

    千次阅读 2017-11-13 20:15:55
    1. 算法简介关联规则最初提出的动机是针对购物篮分析(Market Basket Analysis)问题提出的。1993年,Agrawal等人在首先提出关联规则概念,同时给出了相应的挖掘算法AIS,但是性能较差。1994年,他们建立了项目集格...

    1. 算法简介

    关联规则最初提出的动机是针对购物篮分析(Market Basket Analysis)问题提出的。1993年,Agrawal等人在首先提出关联规则概念,同时给出了相应的挖掘算法AIS,但是性能较差。1994年,他们建立了项目集格空间理论,并依据上述两个定理,提出了著名的Apriori算法,至今Apriori仍然作为关联规则挖掘的经典算法被广泛讨论,以后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。

    假定你是AllElectronics的销售经理,当有顾客买了PC和数码相机时,你会向他推荐什么产品?你会考虑哪些问题?

    这就是关联规则要回答的问题。

    1.1 基本概念

    • 关联规则的分类

    1.按处理的变量
    布林型:买啤酒=>买尿布
    数值型:月收入5000元=>每月交通费800元

    2.按资料的抽象层次
    单层关联规则: IBM台式机=>Sony打印机,一个细节数据上的单层关联规则
    多层关联规则:台式机=>Sony打印机,较高和细节层次之间的多层关联规则

    3.按涉及到的资料维数
    单维关联规则:啤酒=>尿布,只涉及到用户的购买的物品
    多维关联规则:性别=”女”=>职业=”秘书”,涉及到两个字段的信息

    • 三个度
      关联规则的计算主要计算三个度
      支持度support
      置信度confidence
      提升度lift
      以一组具体的数据来说明“三度”

    举个例子吧说说三个度是咋回事?

    假设有10000个消费者购买了商品,其中购买尿布的有1000个,购买啤酒的2000个,购买面包的500个,同时购买尿布与啤酒的800个,同时购买尿布与面包的600个。

    支持度(support):全部事务中,{X,Y}出现的可能性,即项集中{X,Y}同时出现的概率:
    support(X=>Y)=P(X U Y)
    该指标作为建立强关联规则的第一个门槛,衡量了所考察关联规则在量上的多少,其意义在于通过最小阈值(minsup)的设定,来剔除那些“出镜率”较低的无意义的规则,而相应地保留下出现较为频繁的项集所隐含的规则。即筛选出满足:
    support(Z) >= minsup
    的项集Z,被称为频繁项集(Frequent Itemset)。
    当我们设定最小阈值为5%,由于{啤酒,尿布}的支持度为800/10000=8%,而{尿布,面包}的支持度为100/10000=1%,则{尿布,啤酒}满足了基本的数量要求,成为频繁项集,且规则啤酒=>尿布,尿布=>啤酒
    同时被保留,而{尿布,面包}对应的两条规则都被排除。

    置信度(confidence):表示在关联规则的先决条件X发生的条件下,关联结果Y发生的概率,即含有X的项集条件下,同时含有Y的可能性:

                    confidence(X=>Y) = P(Y/X)
    

    这是生成强关联规则的第二个门槛,衡量所考察关联规则在“质”上的可靠性。相似的,需要对置信度设置最小阈值(mincon)来进一步筛选,从而最终生成满足需要的强关联规则。因此,继产生频繁项集后,需从中进而选取满足:

                    confidence(X=>Y) >= mincon
    

    的规则,至此完成所需关联规则的生成。
    当设定mincon=70%,confidence(尿布=>啤酒)=800/1000=80%,confidence(啤酒=>尿布)=800/2000=40%,被剔除。至此,我们根据需要筛选出了一条强关联规则:尿布=>啤酒。

    提升度(lift):表示在含有X的条件下同时含有Y的可能性与无条件下含有Y的可能性之比。即在Y的自身出现的可能性P(Y)的基础上,X的出现对于Y的“出镜率” P(Y/X)的提升程度:

                lift(X=>Y) = P(Y/X)/P(Y) = confidence (X=>Y)/P(Y)
    

    该指标与confidence同样用来衡量规则的可靠性,可以看作置信度的一种互补指标。
    举例来说,我们考虑1000个消费者,发现有500人购买了茶叶,其中有450人同时购买了咖啡,另50人没有。由于confidence(茶叶=>咖啡)=450/500=90%,由此我们可能会认为喜欢喝茶的人往往喜欢喝咖啡。但当我们来看另外没有购买茶叶的500人,其中同样有450人购买了咖啡,同样是很高的置信度90%,由此,我们看到不爱喝茶的也爱喝咖啡。这样看来,其实是否购买咖啡,与有没有购买茶叶并没有关联,两者是相互独立的,其提升度90%/[(450+450)/1000]=1。
    由此可见,lift正是弥补了confidence的这一缺陷,if lift=1,X与Y独立,X对Y出现的可能性没有提升作用,其值越大(lift>1),则表明X对Y的提升程度越大,也表明关联性越强。

    1.2 算法原理

    Apriori算法
    是一种挖掘关联规则的算法,用于挖掘其内涵的、未知的却又实际存在的数据关系,其核心是基于两阶段频集思想的递推算法。

    Apriori算法的两个阶段:
    寻找频繁项集;
    有频繁项集找关联规则。

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    FP-growth算法,FP-growth算法详解

    这里写图片描述

    数据挖掘—关联规则—ECLAT算法

    2. 应用场景

    购物篮分析、分类设计、货存安排、捆绑销售、亏本销售分析等等。
    电子商务网站的交叉推荐销售:
    淘宝购物时,发现买了该商品的人还买了啥啥。
    看视频时,发现看了该视频的人还看了啥啥。
    浏览网页时,浏览了该网页的也浏览了啥啥。
    听音乐时,个性化音乐推荐。
    超市里货架摆放设计:
    沃尔玛通过大量的商品购物篮发现了啤酒与尿布。

    这些一系列的东东都跟推荐算法有关,关联规则也是推荐算法之一。

    3. 优缺点

    Apriori算法缺点:
    - 在每一步产生侯选项目集时循环产生的组合过多,没有排除 不应该参与组合的元素;
    - 每次计算项集的支持度时,都对数据库中的全部记录进行了一遍扫描比较,需要很大的I/O 负载。

    展开全文
  • 针对数字图书馆资源增加致使用户难以获取感兴趣图书资源的问题,提出了一种基于标签和关联规则挖掘的图书组合推荐系统模型。该模型整合了基于内容推荐和协同过滤推荐的优点,利用标签系统对图书内容进行语义分析,...
  • 基于标签和关联规则挖掘的图书组合推荐系统模型研究.pdf
  • 关联规则(AR)挖掘是一种强大的语义数据分析技术,用于从事务数据库中提取信息,并指示一组事务中的哪些项与哪些项对应。 AR 最初是为购物篮分析而开发的,其中评估购物篮中的物品组合以确定流行程度以及货架布局...
  • 关联规则常用算法

    千次阅读 2020-07-03 15:53:41
    关联规则常用算法   关联规则(Association Rules)是海量数据挖掘(Mining Massive Datasets,MMDs)非常经典的任务,其主要目标是试图从一系列事务集中挖掘出频繁项以及对应的关联规则关联规则来自于一个...

      关联规则Association Rules)是海量数据挖掘(Mining Massive Datasets,MMDs)非常经典的任务,其主要目标是试图从一系列事务集中挖掘出频繁项以及对应的关联规则。关联规则来自于一个家喻户晓的“啤酒与尿布”的故事,本文通过故事来引出关联规则的方法。

    啤酒与尿布的故事
      在一家超市里,有一个有趣的现象:尿布和啤酒赫然摆在一起出售。但是这个奇怪的举措却使尿布和啤酒的销量双双增加了。这不是一个笑话,而是发生在美国沃尔玛连锁店超市的真实案例,并一直为商家所津津乐道。沃尔玛拥有世界上最大的数据仓库系统,为了能够准确了解顾客在其门店的购买习惯,沃尔玛对其顾客的购物行为进行购物篮分析,想知道顾客经常一起购买的商品有哪些。沃尔玛数据仓库里集中了其各门店的详细原始交易数据。在这些原始交易数据的基础上,沃尔玛利用数据挖掘方法对这些数据进行分析和挖掘。一个意外的发现是:"跟尿布一起购买最多的商品竟是啤酒!经过大量实际调查和分析,揭示了一个隐藏在"尿布与啤酒"背后的美国人的一种行为模式:在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,而他们中有30%~40%的人同时也为自己买一些啤酒。产生这一现象的原因是:美国的太太们常叮嘱她们的丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒。

      关联规则是一种大数据挖掘的任务,最初的动机是针对购物篮分析(Market Basket Analysis)问题提出的,例如上述的“啤酒与尿布”的故事,如果超市能够发现一些具有相关联的商品购物行为,通过对商品的适当调整可以提高顾客的购物体验,提升超市的销售额,因此如何发现这些潜在的规律呢?

    本文首先介绍关联规则的任务,以及相关概念,其次介绍相关算法,目录索引如下:

    1、关联规则形式化描述

      设 I = { I 1 , I 2 , . . . , I m } I=\{I_1,I_2,...,I_m\} I={I1,I2,...,Im}是一个项集(Item Set), m m m为项的个数,其中 I i I_i Ii表示第 i i i个项,对应于一个个商品。事务(Transaction) t i t_i ti表示 I I I的一个子集,对应于一个个订单。事务组成的集合记做 D = { t 1 , t 2 , . . . , t n } D=\{t_1,t_2,...,t_n\} D={t1,t2,...,tn},通常也称作事务数据库。通常描述中,每一个事务都有唯一的编号,记做TID,每个事务中都包含若干个项Items。
      关联规则是形如 X → Y X→Y XY的蕴涵式,其中, X X X Y Y Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。其中,关联规则 X Y XY XY,存在支持度和置信度,定义如下:

    • 支持度( X → Y X→Y XY = 同 时 包 含 X 和 Y 的 事 务 数 量 所 有 事 务 数 量 =\frac{同时包含X和Y的事务数量}{所有事务数量} =XY,理解为某一个项出现的概率。通常设置一个阈值minsupport,当支持度不小于该值时认为是频繁项;
    • 置信度( X → Y X→Y XY = 同 时 包 含 X 和 Y 的 事 务 数 量 包 含 X 的 事 务 数 量 =\frac{同时包含X和Y的事务数量}{包含X的事务数量} =XXY,理解为在X事务的基础上,X和Y均出现的条件概率。

    例题1:分别计算3-项集“面包,牛奶,尿布”和“面包→牛奶,尿布”对应支持度和置信度。
    在这里插入图片描述
    1.可统计“面包,牛奶,尿布”同时出现的TID有4和5,所以支持度是2/5;
    2.面包出现的TID有1,2,4,5,因此支持度为2/4。

    因此关联规则实际上包含两个子任务:

    • 频繁模式发现:也称频繁模式挖掘、频繁项挖掘等,是指从一系列候选的项中选择频繁的部分,通常衡量频繁的程度可以是对每一项出现的频率,当超过某一阈值是则任务这个项是频繁的。
    • 生成关联规则:在已经发现的最大频繁项目集中,寻找置信度不小于用户给定的minconfidence的关联规则。

    2、Apriori算法

      Apriori算法是经典的关联规则算法,其主要思路如下图所示:
    在这里插入图片描述
    算法流程:

    1. 首先对数据库中进行一次扫描,统计每一个项出现的次数,形成候选1-项集;
    2. 根据minsupport阈值筛选出频繁1-项集;
    3. 将频繁1-项集进行组合,形成候选2-项集;
    4. 对数据库进行第二次扫描,为每个候选2-项集进行计数,并筛选出频繁2-项集;
    5. 重复上述流程,直到候选项集为空;
    6. 根据生成的频繁项集,通过计算相应的置信度来生成管理规则。

      其中如果项集中包含k个不同的项,称之为k-项集。候选k-项集记做 C k C_k Ck,频繁k-项集记做 L k L_k Lk

      频繁模式挖掘的基本前提是:

    • 如果一个集合是频繁项集,则它的所有子集都是频繁项集。
    • 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。

    例题2:使用Apriori算法对事务集 D D D进行频繁项挖掘,其中minsupport.count=2.
    在这里插入图片描述
      首先对事务数据库 D D D进行扫描,统计各个1-项的计数。由于最小计数阈值minsupport.count=2,因此可以筛选出频繁1-项集“ l 1 , l 2 , l 3 , l 4 , l 5 l_1,l_2,l_3,l_4,l_5 l1,l2,l3,l4,l5”。其次两两组合,形成 5 × 4 ÷ 2 = 10 5\times4\div2=10 5×4÷2=10个候选2-项集 C 2 C_2 C2,并进行第二次扫描数据库进行计数,发现 ( l 1 , l 4 ) , ( l 3 , l 4 ) , ( l 3 , l 5 ) , ( l 4 , l 5 ) (l_1,l_4),(l_3,l_4),(l_3,l_5),(l_4,l_5) (l1,l4),(l3,l4),(l3,l5),(l4,l5)低于阈值,所以剔除掉。对剩余的频繁2-项集 L 2 L_2 L2进行两两组合,去除重复的组合后形成候选3-项集 C 3 C_3 C3,以此类推,最终得到频繁3-项集为 ( l 1 , l 2 , l 3 ) , ( l 1 , l 2 , l 5 ) (l_1,l_2,l_3),(l_1,l_2,l_5) (l1,l2,l3),(l1,l2,l5)

    Apriori算法的特点:

    • 简单且易于实现,是最具代表性的关联规则挖掘算法
    • 随着数据集规模的不断增长,逐渐显现出一定的局限性:
        (1)需多次扫描数据库,很大的I/O负载,算法的执行效率较低;
        (2)产生大量的候选项目集,尤其是候选2-项集占用内存非常大,会消耗大量的内存;
        (3)对于每一趟扫描,只有当内存大小足够容纳需要进行计数的候选集时才能正确执行。如果内存不够大,要么使用一种空间复杂度更小的算法,要么只能对一个候选集进行多次扫描,否则将会出现“内存抖动”的情况,即在一趟扫描中页面频繁地移进移出内存(页面置换算法也无法避免内存抖动问题),造成运行时间的剧增。

    3、PCY算法

      为了改进Apriori算法,PCY由Park,Chen和Yu等提出,其目标是为了降低Apriori算法频繁的扫描数据库,其次降低候选项集所占用的内存。其主要创新点有:

    • 将哈希函数应用到频繁项挖掘中;
    • 第一次扫描事务数据库时,将剩余的空间存放哈希表,从而降低第二次扫描时占用的大量空间。

    在这里插入图片描述
      如上图,左边两个图表示Apriori算法的前两次扫描过程,可知第一次扫描内存空闲很大,而第二次扫描占用空间很多;右侧两个图则表示PCY算法的两次扫描,第一次扫描除了对1-项集进行计数外,额外利用一个2-项哈希表存储每个2-项的计数,再第二次扫描时则利用该哈希表对应的位图来判断是否保留该2-项,从而减少候选2-项集大小。

      PCY主要思想可总结如下:

    1. 首先第一次扫描事务数据库 D D D,并对候选1-项集 C 1 C_1 C1进行计数,根据阈值筛选出频繁1-项集 L 1 L_1 L1
    2. 在第一次扫描的同时,对事务集中每个事务中各个项进行两两组合,并通过哈希函数映射到相应的桶中,并将相应的桶计数+1;
    3. 第二次扫描之前,首先根据每个桶中的计数来判断是否为频繁桶,频繁桶是指计数不低于某个阈值的桶。频繁的桶对应的位图记做1,否则记做0;
    4. 第二次扫描事务数据库,此时根据频繁1-项集 L 1 L_1 L1生成一系列的2-项组合,分别通过哈希函数获得其桶的编号,并根据位图来判断。如果对应的位图值为1,则将其保留,否则剔除。因此最后保留的就是候选2-项集 C 2 C_2 C2,对其进行计数并筛选频繁2-项集 L 2 L_2 L2

    例题3:使用PCY算法生成频繁2-项集,其中minsupport.count=2,哈希函数为:
    在这里插入图片描述
    事务及集合 D D D
    在这里插入图片描述
    1.首先对1-项集进行计数,筛选出频繁1-项集 L 1 L_1 L1为{A},{B},{C},{E};
    2.其次根据事务集中每个事务的项两两组合,并通过哈希函数映射到7个桶中。例如 { A , C } \{A,C\} {A,C}哈希值为 ( 1 × 10 + 3 ) m o d 7 = 6 (1\times 10+3 )mod 7=6 (1×10+3)mod7=6,所以其映射到下标为6的桶中;最终形成的桶如下图所示,如果桶的计数超过不小于2,则为频繁桶,位图对应为1。所有桶的计数分别为3,1,2,0,3,1,3,位图对应为1,0,1,0,1,0,1。
    3.频繁1-项集 L 1 L_1 L1,中两两组合,并将每一个组合通过哈希函数得到对应的桶编号,如果对于的位图为1,则保留为候选2-项。最终从6个项中筛选出 { A , C } , { B , C } , { B , E } , { C , E } \{A,C\},\{B,C\},\{B,E\},\{C,E\} {A,C},{B,C},{B,E},{C,E}共4个作为候选项集 C 2 C_2 C2
    4.最后第二次扫描计数,得到对应的频繁2-项集 L 2 L_2 L2 { A , C } , { B , C } , { B , E } , { C , E } \{A,C\},\{B,C\},\{B,E\},\{C,E\} {A,C},{B,C},{B,E},{C,E}
    在这里插入图片描述

      因此总的来说,PCY算法的关键在于在第一次和第二次扫描之间通过哈希计数提前过滤掉一部分2-项集,使得候选2-项集规模变小,而这种筛选的规则则是根据频繁桶来确定。

    PCY算法特点:

    • 优点
        高效地产生频繁项集,提升了性能
        减少了数据库的扫描次数
        减少计数所需的内存空间的大小
    • 分析
        最差的情况:所有桶都是频繁桶,则第二遍扫描中PCY算法需要计算的相对数目与Apriori算法相比没有任何减少
        在寻找频繁3-项集以及更多项集时,PCY算法与Apriori算法相同
        如果桶的个数越多,每个桶内分的项数量变少
        如果不频繁的项映射到频繁的桶中,则可能不易过滤(改进:多阶段算法)

    4、多阶段算法

      事实上,PCY算法面临一个问题,即由于哈希函数的原因,有些非频繁项被映射到了频繁桶中,导致这部分非频繁项很难被过滤掉,因此多阶段算法旨在解决这个问题。其主要思路是:

    1. 在PCY的第一遍和第二遍之间插入额外的扫描过程,将2-项集哈希到另外的独立的哈希表中(使用不同的哈希函数)
    2. 在每个中间过程中,只需哈希那些在以往扫描中哈希到频繁桶的频繁项。

    如图所示:
    在这里插入图片描述

    1. 首先进行第一次扫描。该扫描与PCY第一次扫描一样,首先对1-项集计数,并将每个事务中各个项两两组合,通过第一个哈希函数映射到哈希表1中;
    2. 在第二次扫描时,使用第二个哈希表。当2-项集 { i , j } \{i,j\} {i,j}同时满足
      (1) i , j i,j i,j均为频繁项、(2) { i , j } \{i,j\} {i,j}在第一个哈希表中映射到频繁桶中;
      时,该2-项集可以映射到第二个哈希表中;
    3. 在第三次扫描时,根据频繁1-项集中各项两两组合,对于每个2-项集,当前仅当同时满足:
      (1) i , j i,j i,j均为频繁项、(2) { i , j } \{i,j\} {i,j}在第一个哈希表中映射到频繁桶中、(3) { i , j } \{i,j\} {i,j}在第二个哈希表中映射到频繁桶中;
      时,才保留其作为候选2-项集 C 2 C_2 C2
    4. 对所有候选2-项集筛选出频繁2-项集 L 2 L_2 L2

    多阶段算法特点:

    1. 因为在第二趟扫描时,不是所有的2-项集都被散列到桶中,因此桶的计数值变得比第一趟扫描时更小,最终结果是更多的桶变成非频繁桶;
    2. 由于两次扫描采用的哈希函数不同,那些在第一趟扫描时被散列到频繁桶中的非频繁2-项集很可能在第二趟扫描时被哈希到一个非频繁桶中
    3. 多阶段算法寻找频繁2-项集不只局限于使用3次扫描

    5、多哈希算法

      多哈希算法与PCY算法基本一致,不同在于PCY算法只使用一个哈希表,而多哈希算法则是使用了多个哈希表,其算法思想与PCY一致,只是在判断是否是候选2-项集时,需要同时判断多个对应位图是否均为1,如下图所示:
    在这里插入图片描述
    多哈希算法特点:

    1. 只要桶的平均计数不小于阈值,频繁桶的数目仍然比较多,这样一个非频繁2-项集同时哈希到两个哈希表的频繁桶内的概率就更低,可以减少第二遍扫描的运算量
    2. 风险:
        使用两个哈希表时,每个哈希表仅有PCY算法的一半的桶,这样每个桶上的平均计数会翻倍,必须保证大多数桶的计数不会达到阈值
        桶的平均计数可能会超过阈值
    3. 多哈希算法也不只局限于使用两个哈希表:

    6、FP-Tree算法

      先前的方法均存在一个问题,即频繁的对数据库进行扫描,而每次扫描的目的则是为了计数,因此如何只对数据库进行两次扫描便可以对所有可能的频繁项进行计数呢?FP-Tree算法巧妙的解决了这个问题。
      FP-Tree算法主要分为两个步骤:构建FP树频繁模式挖掘

    一、构建FP树算法:

    1. 对事务数据库 D D D进行一次扫描,统计所有项的计数,并根据最小支持度阈值保留频繁1-项集;
    2. 对频繁1-项集中所有的项递减顺序排列,形成对应的Head Table,其中Head Table每个元素表示频繁1-项集及其计数,指针默认为空;
    3. 创建一个根结点,扫描第二遍事务数据库 D D D,每一个事务对应的所有排序的项依次插入树中,计数默认为1,如果已存在该节点,则计数+1(同一个项在每个事务记录内排号相同时,此时两个结点是同一个,则直接+1)。若相同的项不在同一个分支时,通过指针相连。

    二、频繁模式挖掘

    1. 根据Head Table自底向上顺序依次进行频繁项挖掘,此时对于的元素作为条件模式基
    2. 在FP树中寻找相应的路径,且计数取最小值,去除掉小于阈值的项,保留不小于阈值的项;
    3. 根据条件模式基获得相同基的频繁项。

    例题4:已知最小支持度阈值为3,使用FP-Tree算法进行频繁项挖掘,事务数据库如图所示:
    在这里插入图片描述
      如图可知,事务数据库中共有9个事务,6个项。此时可知a,b,c,d,e,f的计数分别为7,6,5,5,3,1。首先第一次扫描后可过滤掉“f”,其次根据各自计数在每个事务记录内降序排列。
      根据计数生成Head Table;
      其次构建FP树,例如事务记录TID=1开始,向根结点依次插入结点(a:1),(b:1),(d:1),此时Head Table中的a,b,d指针分别指向新增的结点。当TID=2时,从根结点插入(b:1),(c:1),(d:1),需要注意的是,虽然当前也插入了b和c,但由于其层数与TID1不同,所以是在新的分支上。而对于TID=3时,第一个项是a,所以直接在(a:1)上计数,变为(a:2)。
      以此类推,即可生成如下图所示的FP-树:在这里插入图片描述
      其次进行频繁项挖掘,先以e开始,可知所有路径以e结尾的有(a:7,b:5,c:3,e:1)、(a:7,c:1,d:1,e:1),(a:7,d:1,e:1)。根据条件模式基,需要将每个结点的计数变为最小的值,即变为(a:1,b:1,c:1,e:1)、(a:1,c:1,d:1,e:1),(a:1,d:1,e:1)。此时可以发现每个项的计数有(a:3),(b:1),(c:2),(d:2),(e:3),由于阈值为3,则只保留(a:3)和(e:3)。因此可以得到频繁项有(ae:3)和(e:3)。需要注意的是,当前的基底是e,因此必须包含e,例如(a:3)不是e的条件模式基,则不能包含该项。

    FP-Tree算法特点:

    1. FP-Tree算法只需要进行两次扫描即可完成频繁模式挖掘,大大减少了I/O开销;
    2. 通过Head Table可对相同的项进行计数,省去了重复计数的时间开销,计数完全可以在内存内外存。

    7、XFP-Tree算法

      FP-Tree算法有许多可改进之处,例如如果当事务的数量非常庞大时,构建FP树会占用大量的时间,XFP-Tree算法旨在并行的构建FP树来提升效率。

      XFP-Tree算法需要创建两个数据结构,分别是XFP-Tree和位图矢量:

    1. XFP树:与FP树构建方式相同,不同点在于使用多核机制。首先对Head Table进行划分,划分的数量与内核数成整数倍,划分时尽量保证相对平均;其次在不同的分区上用不同的CPU核创建FP树,该过程是并行执行的,如下图所示(例4的示例),3个CPU核并行构建,每个颜色代表不同的CPU核,不同核构建的FP树通过指针连接。
      在这里插入图片描述
    2. 位图矢量:按照项对每个事务进行记录,例如TID1的事务只有abd三个项,所以位图为1,其他为0,即11010。位图矢量的功能是用于对项进行计数,而计数也可以通过多核机制进行并行。例如项ab,cd和e分别分配给P1,P2和P3执行计数。

    在这里插入图片描述

    8、GPApriori算法

      有相关工作对Apriori进行了改进,除了先前介绍的PCY,多阶段、多哈希外,使用GPU进行频繁模式挖掘也是一种改进之处。 GPApriori算法则使用GPU进行频繁项挖掘。

    在这里插入图片描述
      GPApriori算法主要创新点为:(1)使用字典树来保存候选项,(2)使用纵向事务列表,(3)可并行实现支持度计算;

    一、字典树
      由于许多的候选项可能有相同的前缀,例如候选3-项“1,2,4”和“1,2,5”都有相同的前缀“1,2”,因此可以使用字典树保存。
    在这里插入图片描述
    二、事务的纵向表示

      存储一个对应于每个候选集的事务id列表(tidset),每个列表也可以被表示为一个位掩码(bitset)。例如下图,左侧为传统的事务表示,右侧为纵向表示,Candidate表示候选的项集,tidset则表示对应项集包含的事务记录,其可以使用bit码表示。例如1-项集只有第1和第4个事务存在,所以bit码可以写成1001。
      之所以可以使用纵向表示,是因为:
    (1)当判断两个项的组合是否是频繁项时,直接将二者对应的bit码按位求与计算,结果中1的个数即为支持度计数值。例如判断2-项集(1,3)的计数,则直接求1001和1111的按位与,结果为1001,则说明有两个事务满足这个20项集,再例如3-项集(1,3,5),则可以表示为(1,3)的1001和(5) 的1101按位与,结果为1001,说明也有两个事务同时包含项1、3、5。
    (2)使用纵向表示法,可以并行的对支持度进行计数,这也是第三个贡献。

    在这里插入图片描述
    三、并行支持度计算
      当使用纵向表示时,可以将纵向事务表划分为多个分块,每个分块置于GPU计算节点上,最后使用并行归约法获得总计数。

    在这里插入图片描述

    参考文献
    【4】Zhang F, Zhang Y, Bakos J. Gpapriori: Gpu-accelerated frequent itemset mining[C]//Cluster Computing (CLUSTER), 2011 IEEE International Conference on. IEEE, 2011: 590-594.


      博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。

    展开全文
  • 关联规则挖掘

    千次阅读 2014-10-17 22:44:21
    关联规则是数据挖掘技术的一个活跃的研究方向之一,其反映出项目集之间有意义的关联关系。关联规则可以广泛地应用于各个领域,既可以检验行业内长期形成的知识模式,也能够发现隐藏的新规律。有效地发现、理解和运用...

     一、初步理解  

    关联规则是数据挖掘技术的一个活跃的研究方向之一,其反映出项目集之间有意义的关联关系。关联规则可以广泛地应用于各个领域,既可以检验行业内长期形成的知识模式,也能够发现隐藏的新规律。有效地发现、理解和运用关联规则是数据挖掘任务的一个重要手段。

    在处理大量数据时,很重要的一点是要理解不同实体间相互关联的规律。通常,发现这些规律是个极为复杂的过程。关联规则是一种十分简单却功能强大的、描述数据集的规则,这是因为关联规则表达了哪些实体能同时发生。

    关联规则的传统应用多见于零售业(适用于线下而非线上)。关联规则挖掘的一个典型例子是购物篮分析。该过程通过发现顾客放入其购物篮中不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商指定营销策略。例如,在同一次去超市,如果顾客购买牛奶,他也购买面包(包括什么类型的面包)的可能性有多大?通过帮助零售商有选择地经销和安排货架,这种信息可以引导销售。例如,将牛奶和面包尽可能放近一些,可以进一步的刺激一次去商店同时购买这些商品。全球最大的零售商沃尔玛(Walmart)通过对顾客购物清单的数据挖掘发现了“尿布→啤酒”的关联规则,后来沃尔玛就把尿布和啤酒摆放在一起,从而双双促进了尿布和啤酒的销量。

    关联规则的另一应用领域是健康医疗,利用关联规则找出经常同时发生的健康问题,以便诊断出患一种疾病的患者还可能进行额外的检查,从而判断该患者是否存在其他与此疾病经常连带发生的身体问题。

            其他应用领域还包括入侵检查、web日志分析、数据库访问模式、文档抄袭检测等等。

    二、关联规则的概念

    是项的集合。设任务相关的数据D是数据库事务的集合,其中每个事务T是项的集合,使得。每个事务有一个标识符,称作TID。

    2.1 相关定义

    支持度定义:假设有个支持度阀指(support threshold) s。 如果A是一个项集,A的支持度是指包含I的事务数目。或者是包含I的事务数目与总事务数的百分比。如果支持度不小于s,则称A是频繁项集(frequent itemset)。

      A的支持度(support)= 包含A的事务数 或者 包含A的事务数/总的事务数

    2.2 关联规则(association rule)定义

    关联规则的形式为A->j,其中A是一个项集,而j是一个项。该关联规则的意义为,如果A中所有项出现在某个事务中的话,那么j“有可能”也出现在这一事务中。

    这个“有可能”可以通过定义规则的可信度/置信度(confidence)来形式化的给出。

    A->j的可信度(confidence) = A∪j 的支持度/A的支持度

    但是如果包含A的购物篮中包含j的概率等于所有购物篮中包含j的概率, 比较极端的是实际上所有的购物篮(事务)都包含j,那么即使A包含j的概率为100% 也是没有意义的,为了区分出这种A对j的兴趣度衡量。

        A->j的兴趣度(interest) = A->j的可信度 - j的支持度

    当这个值很高或者是绝对值很大的负值都是具有意义的。前者意味着购物篮中A的存在在某种程度上促进了j的存在,而后者意味着A的存在会抑制j的存在。

            同时满足最小支持度阈值(min_sup)和最小置信度阈值(min_conf)的规则称作强规则。

            项的集合称为项集(itemset)。包含k个项的项集称为k-项集。集合{computer,financial_management_software}是一个2-项集。

           识别有用的关联规则并不比发现频繁项集难很多,以为他都是以支持度为基础的。实际当中,对于传统的零售商店的销售而言,“相当地高”大概相当于所有购物篮的1%左右。

    三、预选算法与数据结构的数学分析

    我们假定购物篮组成的文件太大以至于无法在内存中存放。因此,任何算法的主要时间开销都集中在将购物篮或者事务从磁盘读入内存这个过程。。

    3.2 项集计数中内存使用

       当对数据进行一遍扫描时,所有的频繁项集算法要求我们必须在内存中维护很多不同的计数值。例如,我们必须要记录每两个项咋购物篮中出现次数。如果没有足够内存来存放这些数字,那么随机对其中的一个数字加1都很有可能需要将一个页面从磁盘载入到内存,如果这样,算法就会发生内存抖动现象。从而运行速度可能会比从内存中直接找到这些数字慢好几个数量级。所以结论是,我们不能对不能放入内存的任何对象计数。因此,每个算法必须有个能处理的项数目的上限。
    例如:假定项目总数目n, 并且算法会计算所有项对的数目。因此,我们需要空间存储(n 2)及C2 20 = n的平方/2个整数,如果每个整数需要4字节,总共需要2n pow 2个字节。如果我们的机器有2GB即2 pow 31字节内存,那么必须要求n<=2pow 15。
    如果项是字符串,可以表示为1-n上的整数。如果项没有采用这种表示方法,我们就需要哈希表将他们从文件中的表示形式转化为整数。如果该项已经存在,那么就可以从哈希表中获得其对应的整数码,如果不存在,那么就将下一个可用的数字赋给它,并将项及其整数码放入到哈希表中。(当然简单一点,并且可以通过哈希函数映射到不同的连续的整数空间上,这个哈希表不需要实际的存在,因为哈希函数的规则能够正确帮助我们找到这个整数码,这个整数码也就转换为项对的存放地址)
    哈希表1 如bread-0
            apple-1
            beer -2......

    3.2.1 三角矩阵方法(triangular matrix)

        在将项都编码成整数之后,我们可以使用三角矩阵来存放计数结果,i<j,a[i,j]。对每一个对需要空间一个integer = 4 bytes

       但是这种策略会使得数组的一般元素都没有使用。一个更节省空间的方法是使用一个一维的三角数组(trangular array)
    有1<=i<=j<=n,k=(i-1)(n-i/2)+(j-i)。即{i,j}对应为a[k]。这种布局相当于将所有的项对按照字典顺序排序,即一开始是{1,2},{1,3},。。。,{1,n},{2,3},{2,4},。。。{2,n}。。。{n-1,n}。
      这种当时分配的空间是已经确定的,为n-1+n-2+.....+1

    3.2.2 三元组方法

      另一种有可能更加适合的存储计数值的方法为三元组[i,j,c],即对{i,j}对的计数值c(i<j)。对每一个对需要空间3*integer =12 bytes
    具体操作为采用类似哈希表的数据结构,其中i,j是搜索键值,这样就能确定对于给定的i,j是否存在对应的三元组,如果是则快速定位。这种方式我们称为存储数值的三元组方式(triples method)
    与三角矩阵的方式不同,如果某个项对(候选项对)的计数值为0,则三元组方式可以不用存储这个值,即只有C>0的才需要分配空间去存储。
       结论如下:
    如果所有可能出现的(n 2)个项对中有至少1/3出现在购物篮的情况下,三角矩阵方式更优。而如果出现的比例显著小于1/3,那么就要考虑使用三元组方式。

    3.2.3 二元组计数

    实际当中可能很大的计算复杂性都在二元组,可能二元组的数目更多,所以上面的方法都是用来处理二元组。

    四、A-Priori算法

     关联规则中最著名的算法当数Apriori算法。

       

    图1、Apriori算法的内存的使用情况,左边为第一步时的内存情况,右图为第二步时内存的使用情况

    五、A-Priori算法的改进

    下面具体介绍几个Apriori算法的改进算法,这些算法可以用在海量数据上的关联规则挖掘中。

    1)基于hash的方法。一个高效地产生频集的基于杂凑(hash)的算法由Park[3]提出来。通过实验可以发现寻找频集主要的计算是在生成频繁2-项集Lk上,Park等就是利用了这个性质引入杂凑技术来改进产生频繁2-项集的方法

    2)基于划分的方法。Savasere[2]设计了一个基于划分(partition)的算法. 这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频集至少在某一个分块中是频集保证的。

    3)基于采样的方法。基于前一遍扫描得到的信息,对此仔细地作组合分析,可以得到一个改进的算法,Mannila[4]先考虑了这一点,他们认为采样是发现规则的一个有效途径。

    5.1 基于hash的方法

            首先是基于哈希的算法。基于哈希的算法仍是将所有所有数据放入内存的方法。只要在计算的过程中能够满足算法对内存的大量需求,Apriori算法能够很好的执行。但在计算候选项集时特别是在计算候选项对C2时需要消耗大量内存。针对C2候选项对过大,一些算法提出用来减少C2的大小。这里我们首先考虑PCY算法,这个算法使用了在Apriori算法的第一步里大量没使用的内存。接着,我们考虑Multistage算法,这个算法使用PCY的技巧,但插入了额外的步骤来更多的减少C2的大小。

      Park,Chen,Yu(PCY)算法[3]:

            这个算法我们叫PCY算法,取自它的作者名字缩写。该算法关注在频繁项集挖掘中的第一步有许多内存空间没被利用的情况。如果有数以亿计的项,和以G计的内存,在使用关联规则的第一步里我们将会仅仅使用不到10%的内存空间,会有很多内存空闲。因为在第一步里,我们只需要两个表,一个用来保存项的名字到一个整数的映射,用这些整数值代表项,一个数组来计数这些整数,如图1PCY算法使用这些空闲的内存来保存一个整数数组。其思想显示如图2.将这个数组看做一个哈希表,表的桶中装的是整数值而不是一组key值。项对被哈希到这些桶中。在第一步扫描篮子的处理中,我们不但将这些项对加一,并且通过两步循环,我们创造出所有的项对。我们将项对哈希到哈希表中,并且将哈希到的位置加一。注意,项本身不会进入桶,项对的加入只是影响桶中的整数值。

            在第一步的结尾,每个桶中装有一个数字,这个数字表达了桶中的项对的数目。如果桶中数字大于支持度阈值s,这个桶被称为频繁桶。对于频繁桶,我们不能确定其项对是否为频繁项对,但有可能是。但是,对于阈值低于s的桶,我们知道其中的项对肯定不是频繁项对,即使项对是由两个频繁项组成。这个事实给我们在第二部处理带来很大的方便。我们可以定义候选集C2为这样的项对{i, j}

    1.      ij是频繁项

    2.      {ij}哈希到一个频繁桶

            第二个条件是PCY算法与A-Priori算法的区别所在。

            在步骤1中使用hash表可能并不能带来好处,这取决于数据大小和空闲内存大小。在最坏的情形下,所有的桶都是频繁的,PCY计算的项对与A-priori是一样的。然而,在通常的情况下,大多数的桶都是非频繁的。这种情况下,PCY算法降低了第二步内存的使用。

            假设我们有1G的内存可用来在第一步做hash表存放,并假设数据文件包含在10亿篮子,每个篮子10个项。一个桶为一个整数,通常定义为4个字节,于是我们可以保存2.5亿个桶。所有篮子的项对的数量总数为个。这个数量也是桶中计数的总和。这样,每个桶的平均计数为,或180个。所以,如果支持度阈值s180附近,或更小,可能只有很少的桶是非频繁的。然而,当s足够大,比方说1000,这样会使大部分的桶成为非频繁的。这样最大可能的频繁桶数为,或450亿个频繁桶。

            在PCY算法中,在其第二步操作前,哈希表被压缩为bitmap,在这里,每一个bit用作一个桶。若桶为频繁桶,则位置1,否则置0。这样32bit的整数被压缩为只有1bit。然后再PCY的第二步操作中,bitmap只占了原来所用空间的1/32,如图2所示。如果大部分的桶都是非频繁桶,我们可以预料,在第二步的项对计数后产生的频繁项集会更小。这样,PCY算法就能直接在内存中处理这些数据集而不会耗尽内存。

            虽然在寻找频繁项对时,PCY算法与Apriori算法相差很大,但是,在三元对和更多元时,他们的方法又为相同了。

     

    图2、使用PCY算法的内存组织形式,左图为步骤1的内存使用情况,右图为步骤2的内存使用情况

    5.2 Mutistage 算法:

            Multistage算法是在PCY算法的基础上使用一些连续的哈希表来进一步降低候选项对。相应的,Multistage需要不止两步来寻找频繁项对。Multistage算法的框图描述在图3中。

           Multistage的第一步跟PCY的第一步相同。在第一步后,频繁桶集也被压缩为bitmap,这也和PCY相同。但是在第二步,Multistage不计数候选项对。而是使用空闲主存来存放另一个哈希表,并使用另一个哈希函数。因为第一个哈希表的bitmap只占了1/32的空闲内存,第二个哈希表可以使用几乎跟第一个哈希表一样多的桶。

           Multistage的第二步,我们同样是需要遍历篮子文件。只是这步不需要再数项了,因为已经在第一步做了。但是,我必须保留那些项是频繁项的信息,因为我们需要它在第二步和第三步中。在第二步中,我们哈希哈希某些项对到第二个哈希表的桶中。一个对被哈希仅当它满足一下两条条件,即:如果ij都是频繁的且它们在第一步被哈希到频繁桶中。这样,第二个哈希表中的计数总数将比第一步明显减少。

    因此,即便是在第二步是由于第一步的bitmap占据了1/32的空闲空间,剩下的空间也照样够第二步的hash表使用。

            在第二步完成后,第二个hash表同样被压缩成bitmap。该bitmap也同样保存在内存中。这时,两个bitmap加起来也只占到不到空闲内存的1/16,还有相当的内存可用来做第三步的计算候选频繁项对的处理。一个相对{ij}C2中,当且仅当满足:

    1、  ij都是频繁项

    2、  {ij}在第一步哈希时被哈希到频繁桶中

    3、  {ij}在第二步哈希时被哈希到频繁桶中

            第三条是Multistage方法和PCY方法的主要区别。

            很显然,在算法中可用在第一步和最后一步中添加任意多的中间步骤。这里的限制就是在每一步中必须用一个bitmap来保存前一步的结果。最终这里会使得没有足够的内存来做计数。不管我们使用多少步骤,真正的频繁项对总是被哈希到一个频繁桶中,所以,这里没有方式来避免对它们计数。

     

    3Multistage算法使用额外的哈希表来减少候选项对,左图为第一步内存使用情况,中图为第二步内存使用情况,右图为第三步内存使用情况

    5.3 Multihash 算法

            有时我们从multistage算法的额外的步骤中获取好处。这个PCY的变形叫做Multihash[7]算法。不同于在连续的两个步骤中使用两个哈希表,该算法在一步中使用两个哈希算法和两个分离的哈希表。如表6.7所述。

            在同一步里使用两个hash表的危险是每个哈希表仅有PCY算法的一半的桶。只要PCY算法的桶的平均计数比支持度阈值低,我们就可以预见大部分的桶都是非频繁桶,并可以在这两个只有一半大小的哈希表上操作完成。在这种情形下,我们选择multihash方法。

            对Multihash的第二步,每个hash表也会被转换为一个bitmap。注意,在图6.7中,两个bitmap占据的空间只有PCY算法的一个bitmap的大小。项对{ij}被放入候选集C2的条件同multistageij必须是频繁的,且{ij}对在两个哈希表中必须被hash到频繁桶。

            正如Multistage算法,在Multihash算法中,我们也可以不用限制只使用两个hash表。在Multihash算法的第一步中,我们也可以使用多个hash表。不过风险是桶的平均计数会超过阈值。在这种情况下,这里会只有很少的非频繁桶在每个hash表中。即使这样,一个项对必须被hash到每个hash表的频繁桶中并计数,并且,我们会发现,一个非频繁项对作为一个候选的概率将上升,而不是下降,无利反而有害。

     

     

    图3、Multihash算法使用多个hash表在第一步中,左图为第一步处理,右图为第二步处理

           使用两个哈希表的危险是在第一步,每个哈希表仅有PCY哈希表的一半的桶容量。只要PCY桶的平均数目比支持的阈值低,我们就能操作两个一半大小的哈希表,其期望哈希表的大多数桶不是频繁的。这样,在这种情形下,我们可以选择multihash方法。

    5.4 基于采样的方法

           前面所讨论的频繁项都是在一次能处理的情况。如果数据量过大超过了主存的大小,这就不可避免的得使用k步来计算频繁项集。这里有许多应用并不需要发现所有的频繁项。比方说在超市,我们只要找到大部分的销售频繁关联项就够了,而不必找出所有的频繁项。

            在这一节,我们介绍几种算法来找到所有或大部分的项集使用两步。我们首先从使用一个简单的数据样本开始,而不是整个数据集。一个算法叫做SON,使用两步,得到精确结果,并使得它能够在map-reduce和其他并行处理的框架下运行。最后,Toivonen的算法平均使用两步获取精确结果,但是,可能但不是经常不能在给定的时间内完成。

    一个简单的随机算法

            不是使用整个文件或篮子,我们使用篮子的一个子集并加装他们是整个数据集。我们必须调整支持度的阈值来适应我们的小篮子。例如,我们针对完整数据集的支持度阈值为s,当我们选择1%的样本时,我们可以在支持度阈值为s/100的度量上测试。

            最安全的抽样方式是读入整个数据集,然后对于每个篮子,使用相同的概率p选择样品。假设这有m个篮子在整个文件中。在最后,我们需要选择的样品的数量接近pm个篮子的样品数。如果我们事先知道这些篮子本身在文件中就是随机放置的,那么我们就可以不用读入整个文件了,而是只接选择前面的pm个篮子作为样品就可以了。或在,如果文件是分布式文件系统,我们可以选择第一个随机块作为样品。

           当我们的样品选择完成,我们可以使用部分的主存来放置这些篮子。剩下的主存用来执行前面的AprioriPCYMultistageMultihash算法。当然这些算法必须运行所有的样品,在每个频繁集上,直到找不到频繁集为止。这个方法在执行读取样品时不需要磁盘操作,因为它是驻留在内存的。当每个频繁项被发现,它们就可以写到磁盘上了;这个操作和最初的读样品到内存是唯一的两次磁盘操作。当然若读入样品后剩下的内存不够执行之前所说的算法时,这种方法会失败。当然,可以选择在算法的每步完成后写到磁盘再仅从磁盘调入下步所需的数据。因为样品的数量相比与整个文件是很小的,所以,I/O操作的代价还是很小的。

     

    避免错误的抽样算法

            我们需要知道在简单抽样方法中可能出现错误。因为我们使用的是抽样,所有就可能存在是频繁项的没有放进频繁集,也存在非频繁项的放入了频繁集。

            当样本足够大时,问题变得不是那么严重了。这时,那些支持度远大于阈值的项集即使在样本中其支持度也会很高,所有误分的可能性不大。但是那些支持度在阈值附近的就不好说了。很有可能由于抽样使得支持度稍微改变而改变对其是否是频繁集的判断

            我们可以通过一遍对整个数据集的扫描,计算所有样品中频繁项集的支持度,保留那些在样品中和在数据集上支持度都高于阈值的频繁项集。以此避免非频繁项集被判为频繁项集的错误。值得注意的,这种方法不能避免那些是频繁集却被当做非频繁项集的情况。

            我们不能消除那些是频繁项集却没有在样品中找出的情况,但是我们可以减少它们的数量如果内存的数量允许。我们设想如果s是支持阈值,且样品相对于整个数据集的大小为p,这样我们可以使用ps作为支持阈值。然而我们可以使用比这个值稍微小点的值作为阈值,如0.9ps。使用更低的阈值的好处是能使更多的项进入到频繁集中,这样就可以降低这种错误,然后再以这些频繁项集到整个数据集中计算支持度,除去那些非频繁项集,这样我们就可以消除非频繁项集当成频繁项集的错误,同时最大化的减少了频繁项集被当做了非频繁项集。

    Toivonen的算法[8]

            这个算法给出另一种不同的随机抽样算法。Toivonen算法在给出足够内存的情况下,在小样本上进行一步处理,接着再整个数据上进行一步处理。这个算法不会带来false negatives,也不会带来false positives,但是这里存在一个小的概率使得算法会产生不了任何结构。这种情况下算法需要重复直至找到一个结果,虽然如此,得到最终频繁项集的处理的平均步数不会太大。

            Toivonen算法由从输入数据集中选择一个小的样品开始,并从中找到候选频繁项集,找的过程同Apriori算法,不过很重要的一点不同是阈值的设置的比样品比例的阈值小。即,当整个数据集上的支持度阈值为s,该样品所占数据集的比例为p,则该阈值可以设置为0.9ps或0.8ps。越小的阈值,就意味着在处理样本时,越多的内存在计算频繁项集时需要使用;但是也就越大的可能性避免算法不能产生结果。

            当样本的频繁项集被构造完成后,我们的下一步是构造negative border。这是样品的一个非频繁项集合,但是这些项集的任意去掉一个项后就是频繁集了。

            考虑项为{A,B,C,D,E},而且我们找到频繁项集为{A},{B},{C},{D},{B,C},{C,D}。注意,只要篮子数不比阈值小,Φ也是频繁的,但是我们忽略它。首先,{E}是在negative border中的,因为{E}本身不是频繁项集,但是从中去任意项后就变成Φ了,就成了频繁项集,所有包含在negative border中。

            还有{A,B},{A,C},{A,D}和{B,D}都在negative border中。因为它们都不是频繁项集,但是除掉一个项的子集都是频繁项集。如{A,B}的子集{A}和{B}都是频繁集。剩下的六个二元项集不在negative border中。{B,C}和{C,D}因为它们本身是频繁项集,所有就不是negative border的元素了,而其他四个虽然不是频繁项集,但是因为包含了项E,而子集{E}不是频繁项集

            没有任何三元的或更大的项集在negative border中了。例如{B,C,D}不在negative border中,因为它有一个立即子集{B,D},而{B,D}不是频繁项集。这样,negative border由下面五个集合组成:{E},{A,B},{A,C},{A,D}和{B,D}。

            为了完成Toivonen算法,我们需要一步在整个数据集上的处理,算出所有在样品中的频繁项集或negative border中的所有项集。这步会产生的可能输出为:

    1、  negative border中没有一个项集在整个数据集上计算为频繁项集。这种情况下,正确的频繁项集就为样本中的频繁项集。

    2、  某些在negative border中的项集在整个数据集中计算是频繁项集。这时,我们不能确定是否存在更大的项集,这个项集既不在样本的negative border中,也不在它的频繁项集中,但是是整个数据集的频繁项集。这样,我们在此次的抽样中得不到结果,算法只能在重新抽样,继续重复上面的步骤,直到出现满足输出情形1时停止。

    为什么Toivonen算法可以奏效

            显然 Toivonen算法不会产生false positive,因为它仅仅将在样本中是频繁项并在整个数据集上计算确实为频繁项集的项集作为频繁项集。为讨论该算法能够不产生false negative,我们需要注意,在Toivonen算法中,没有negativeborder中的项集是频繁项集。所有,无论如何,不存在在整个数据集上是频繁的,而在样本中既不出现在频繁集中,也不出现在negative border中。

            给个反例。假设这里有个集合S在数据集上是频繁项集,但是既不在样本的negative border中,也不是样本的频繁项集。那么在Toivonen算法的一步结束后,产生结果,并且结果中的频繁项集合中没有S。由频繁项集的单调性知,S的所有子集都是整个数据集的频繁项集。假设T是S的一个在样本中不属于频繁项集的最小子集。

            我们说,T一定在negative border中。当然,T满足在negative border中的条件:它自己不是样本的频繁项集。而它的直接子集是样布的频繁项集,因为若不是,则T不是S的在样本中不属于频繁项集的最小子集,产生矛盾。

            这里我们可以发现T即是数据集的频繁项集,又在样本的negative border中。所有,我们对这种情况的Toivonen算法,让其不能产生结果。

    5.5 基于划分的方法

            使用划分的方法是处理海量数据的管理规则的另一个有效的方法。不同于基于采样的方法,该方法能够对数据集上所有数据进行处理。

    Savasere,Omiecinski, and Navathe算法[2]

            我们的下一个算法同时避免了false negatives和false positives,所带来的代价是需要两个完全的步骤。该算法叫做SON算法,为三个作者名字的简称。其思想是将输入文件划分成块(chunks)。将每个文件块作为一个样本,并执行Apriori算法在其块上。同样的使用ps作为其阈值。将每个块找到的频繁项集放到磁盘上。

            一旦所有的块按此方式被处理,将那些在一个或多个块中被选中的频繁项集收集起来作为候选频繁项集。注意,如果一个项集在所有的块中都不是频繁项集,即它在每个块中的支持度都低于ps。因为块数位1/p,所以,整体的支持度也就低于(1/p)ps=s。这样,每个频繁项集必然会出现在至少一个块的频繁项集中,于是,我们可以确定,真正的频繁项一定全在候选频繁项集中,因此这里没有false negatives。

            当我们读每个块并处理它们后,我们完成一次处理。在第二步处理中,我们计算所有的候选频繁项集,选择那些支持度至少为s的作为频繁项集。

     

    SON算法与Map-Reduce

            SON算法使得它很适合在并行计算的环境下发挥功效。每个块可以并行的处理,然后每个块的频繁集合并形成候选集。我们可以将候选分配到多个处理器上,在每个处理器上,这些处理器只需要在一个“购物篮”子集处理这些发过来的候选频繁项集,最后将这些候选集合并得到最终的在整个数据集上的支持度。这个过程不必应用map-reduce,但是,这种两步处理的过程可以表达成map-reduce的处理。下面将介绍这种map-reduce-map-reduce流程。

            FirstMap Function:分配篮子子集,并在子集上使用Apriori算法找出每个项集的频繁度。将支持阈值降从s降低到ps,如果每个Map任务分得的部分占总文件的比例为p。map的输出为key-value对(F,1),这里F为该样本的频繁项集。值总是为1,这个值是无关紧要的。

            FirstReduce Function:每个reduce任务被分配为一组key,这组key实际就为项集,其中的value被忽略,reduce任务简单产生这些出现过一次或多次的项集,将其作为候选频繁项集作为输出。

            SecondMap Function:第二步的map任务将第一步的reduce的所有输出和输入文件的一部分作为输入,每个Map任务计算在分配的那块输入文件中每个候选频繁项集的出现次数。这步的输出为键值对(C,v),这里,C是一个候选集,v是其在该Map任务中的支持度。

            SecondReduce Function:此步的Reduce任务将在每个候选频繁项集各个Map中的候选集的支持度相加。相加的结果就为整个文件上的支持度,这些支持度若大于s,则保留在频繁项集中,否则剔除。

    5.6 其他的频集挖掘方法

            上面我们介绍的都是基于Apriori的频集方法。即使进行了优化,但是Apriori方法一些固有的缺陷还是无法克服:

    1. 可能产生大量的候选集。当长度为1的频集有10000个的时候,长度为2的候选集个数将会超过10M。还有就是如果要生成一个很长的规则的时候,要产生的中间元素也是巨大量的。
    2. 无法对稀有信息进行分析。由于频集使用了参数minsup,所以就无法对小于minsup的事件进行分析;而如果将minsup设成一个很低的值,那么算法的效率就成了一个很难处理的问题。

            下面将介绍两种方法,分别用于解决以上两个问题。

            针对问题一,J.Han等在[5]中提出了不产生候选挖掘频繁项集的方法:FP-树频集算法。他们采用了分而治之的策略,在经过了第一次的扫描之后,把数据库中的频集压缩进一棵频繁模式树(FP-tree),同时依然保留其中的关联信息。随后我们再将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关。然后再对这些条件库分别进行挖掘。当原始数据量很大的时候,也可以结合划分的方法,使得一个FP-tree可以放入主存中。实验表明,FP-growth对不同长度的规则都有很好的适应性,同时在效率上较之apriori算法有巨大的提高。

            第二个问题是基于这个的一个想法:apriori算法得出的关系都是频繁出现的,但是在实际的应用中,我们可能需要寻找一些高度相关的元素,即使这些元素不是频繁出现的。在apriori算法中,起决定作用的是支持度,而我们现在将把可信度放在第一位,挖掘一些具有非常高可信度的规则。Edith Cohen[6]中介绍了对于这个问题的一个解决方法。整个算法基本上分成三个步骤:计算特征、生成候选集、过滤候选集。在三个步骤中,关键的地方就是在计算特征时Hash方法的使用。在考虑方法的时候,有几个衡量好坏的指数:时空效率、错误率和遗漏率。基本的方法有两类:Min_Hashing(MH)Locality_Sensitive_Hashing(LSH)Min_Hashing的基本想法是:将一条记录中的头k个为1的字段的位置作为一个Hash函数。Locality_Sentitive_Hashing的基本想法是:将整个数据库用一种基于概率的方法进行分类,使得相似的列在一起的可能性更大,不相似的列在一起的可能性较小。我们再对这两个方法比较一下。MH的遗漏率为零,错误率可以由k严格控制,但是时空效率相对的较差。LSH的遗漏率和错误率是无法同时降低的,但是它的时空效率却相对的好很多。所以应该视具体的情况而定。最后的实验数据也说明这种方法的确能产生一些有用的规则。

    参考文献

    1 R. Agrawal, T. Imielinski, and A. Swami. Mining association rules between sets of items in large databases. Proceedings of the ACM SIGMOD Conference on Management of data, pp. 207-216, 1993.

    2 A. Savasere, E. Omiecinski, and S. Navathe. An efficient algorithm for mining association rules in large databases. Proceedings of the 21st International Conference on Very large Database, 1995
    3 J. S. Park, M. S. Chen, and P. S. Yu. An effective hash-based algorithm for mining association rules. Proceedings of ACM SIGMOD International Conference on Management of Data, pages 175-186, San Jose, CA, May 1995.
    4 H. Mannila, H. Toivonen, and A. Verkamo. Efficient algorithm for discovering association  rules. AAAI Workshop on Knowledge Discovery in Databases, 1994, pp. 181-192.
    5 J.Han,J.Pei,and Y.Yin.Mining frequent patterns without candidate generation.In Proc.2000 ACM-SIGMOD Int.Conf.Management of Data(SIGMOD’00),Dalas,TX,May 2000.
    6 Edith Cohen, Mayur Datar, Shinji Fujiwara, Aristides Gionis, Piotr Indyk, Rajeev Motwani, Jeffrey D.Ullman, Cheng Yang. Finding Interesting Associations without Support Pruning. 1999
    7 M. Fang, N. Shivakumar, H. Garcia-Molina, R. Motwani, and J. D. Ullman, “Computing iceberg queries efficiently,” Intl. Conf. on Very Large Databases, pp. 299-310, 1998.
    8 H. Toivonen, “Sampling large databases for association rules,” Intl. Conf. on Very Large Databases, pp. 134–145, 1996.




    展开全文
  • 基于关联规则和复杂系统熵聚类的中药相畏药物组合规律研究.pdf
  • 关联规则算法总结

    千次阅读 2020-05-01 12:15:27
    关联规则A->B的支持度:1000个顾客购物,100个购买了面包和黄油。则面包->黄油 10% 可信度 关联规则A->B的可信度:1000个顾客购物,200个购买了面包和黄油,140个购买了黄油,则可信度为70%(140/200) ...

    目的:两个属性是否相关联的研究

    物品集I里面是物品,事务集

    事务T支持物品集A:这个事务中包含此物品

    支持度

    物品A的支持度:1000个顾客购物,200个买了面包,支持度20%(200/1000)

    关联规则A->B的支持度(联合概率):1000个顾客购物,100个购买了面包和黄油。则面包->黄油 10%

    可信度

    关联规则A->B的可信度(条件概率):1000个顾客购物,200个购买了面包,140个购买了面包和黄油,则可信度为70%(140/200)

    A->B的支持度和B->A的支持度一样,可信度不同。

    规则度量

    最小支持度minsup关联规则必须满足的最小支持度

    最小可信度minconf关联规则必须满足的最小可信度

    大项集

    频繁项集:支持度不小于minsup的物品集

    最大频繁项目集:频繁集中挑选出所有不被其他元素包含的平凡项目集。

    关联规则发现任务

    事务数据库D,满足最小支持度和最小可信度的关联规则

    1)求D中满足最小支持度的所有频繁集(Apriori算法和FP树都是找频繁集的算法)。大于支持度

    2)利用频繁集生成满足最小可信度的所有关联规则。大于可信度

    高效求出频繁集:生成长度为1的L[1];L[k]的基础上生成候选物品集C[k+1],候选物品集必须保证包括所有的频繁项集。

    频繁集向下封闭性,频繁集子集必是频繁集;非频繁集的超集必是非频繁集

    Apriori算法(生成测试法)——构造候选集->组合频繁集

    思想:找单项候选集,去掉小于事先设定最小支持度的项,得单项频繁集;组合为两项候选集,再去掉小于事先设定最小支持度的项,得两项频繁集。以此类推!

    注意:组合时及时修剪。k项到k+1项时,可以将它排序,前k-1项都一样,然后将两个集合的第k项加入(此方法选的只多不少,需要再筛选一次)

    伪代码:

    优化:基于划分方法/Hash/采样/减小交易个数

    瓶颈:候选集的生成(1、组成更长频繁集太多。2、最长模式n,则需n+1次扫描数据库)

    注意的问题:充分理解数据、目标明确、数据工作做好、最小的支持度和可信度、理解关联规则

    使用步骤:连接数据,做数据准备;给定最小支持度和可信度,发现关联规则;可视化与评估

    FP-树算法——构造FP-树->挖掘频繁集

    原理:

    1.两次数据库搜索。一次对所有1-项目进行频度排序,一次将数据库信息转化为紧致内存(即FP-tree)

    2.根据FP-tree生成频繁集。为树上每个节点生成条件模型库;用条件模型库构造对应的条件FP树;递归挖掘条件FP树,并增长频繁集。

    步骤:

    1.找单项集的频次,并将大于等于minsup的项目进行排序,形成项头表。构建一个Null结点的FP树

    2.将数据库中的每一条记录进行过滤排序(过滤即删去频次<minsup的结点,排序即按照项头表的顺序)

    3.将排序后的数据插入FP树中,记录路过一次结点,结点频次加一。

    4.不断进行2-3步,直到每一条记录都插入FP树,FP树即构造完成

    5.FP-growth,按项头表的逆序(即从下往上),依次选定结点,并在FPtree中找到能到达该结点的路径(条件模式基)

    6.根据条件模式基找到频繁集

    具体算法和例子在这篇博客中讲的很清楚https://www.cnblogs.com/pinard/p/6307064.html

    缺点:需要递归,所以内存开销大。只适用于单维的布尔关联规则。

     

    上面观察的是用户单次购物买这些东西和买另一些东西的关系;

    下面观察的是用户的上次购物买的东西和下次购物买的东西的关系。

    序列模式(sequential pattern)——交易有先后关系

    如图,有五个用户A,B,C,D,E分别有3,2,3,3,2次购买记录,A用户第一次买了物品{1,2,4},第二次买了物品{2,3},第三次买了物品{5}

    <{1,2}>代表某用户某次购买时同时买了物品1和2;<{1}{2}>代表某用户某次购买了物品1,之后在另一次购买时又购买了物品2

    支持度的分母代表记录几个人,这里就是5。分子代表有几个人买过(不论是哪次购物)

    候选集生成

    两个长度为k(有k个数,不关注几个大括号)的序列,一个去头,一个去尾,若中间相同,则将两个集合合并

    a的生成:1去首{1}==4去尾{4},则a=1+4

    b的生成:2去首{1}==5去尾{3},则b=2+5

    c的生成:3去首{1}==7去尾{3,4}中的4,则c=3+7

    d的生成:4去首{2}==6去尾{5},则d=4+6

    e的生成:5去首{2,5}中的2==7去尾{3,4}中的4,则e=5+7

    上面生成的之多不少,再进行pruning最终只有b.

     

     

     

    展开全文
  • 关联规则1:关联规则的应用场景

    千次阅读 2020-08-03 11:33:30
    关联规则,作为十大机器学习算法之一,应用非常广泛。最经典的例子当然是“啤酒”和“尿布” 的故事。 这个故事的背景是什么呢?
  • 机器学习——关联规则

    千次阅读 2019-08-10 21:49:38
    机器学习——关联规则(一)关联规则原理(二)关联规则代码实现 (一)关联规则原理 在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,超市也因此发现了一个规律,在购买婴儿尿布的年轻父亲们中,有30%~...
  • Python机器学习&数据分析-关联规则

    千次阅读 2019-08-04 09:10:23
    数据分析-关联规则 机器学习课程的笔记整理 一、关联规则前置知识 关联规则 在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,超市也因此发现了一个规律,在购买婴儿尿布的年轻父亲们中,有30%~40%的人同时...
  • # look at the first three rules inspect函数查看具体的规则,这里指查看前3个关联规则 inspect(groceryrules[ 1 : 3 ]) ## Step 5: Improving model performance ----提高模型的性能 # sorting grocery ...
  • 关联规则 挖掘 ,数据关联 融合

    千次阅读 2019-02-22 20:45:25
    关联规则 挖掘 ,数据关联 融合
  • 推荐算法-关联规则|R

    千次阅读 2017-07-05 21:17:23
    推荐算法-关联规则1.概念关联规则是常见的推荐算法,从发现...优点是能够从大量行为数据中挖掘出无法直接感受到的规则,往往能给出意想不到的规则组合。缺点是难以进行模型评估,一般通过行业经验判断结果是否合理。
  • 关联规则算法2-----关联规则FP-Growth

    千次阅读 2017-03-20 12:46:57
    常见的关联规则算法分为两类,一:Apriori算法,二:FPGrowth。 Apriori:不断扫描数据库、构造候选集、筛选候选集,挖掘出频繁项集,,缺点:当数据量较大时,运行速度较慢。 FPGrowth算法优势:只需扫描两遍数据...
  • 基于R语言的关联规则实现

    千次阅读 2015-10-17 21:02:48
    1993年,Agrawal等人首先提出关联规则概念,同时给出了相应的挖掘算法AIS,但是性能较差。1994年,他们建立了项目集格空间理论,并依据上述两个定理,提出了著名的Apriori算法,至今Apriori仍然作为关联规则挖掘的...
  • 在本文中,采用改进Apriori算法从药房内订购的处方获得的数据进行数据挖掘,通过SPSS Clementine平台试验,从这些处方中的指定药物中获得了10个关联规则。在这些关联规则中,得出了以下主要结论:维生素D和钙片是最...
  • apriori和关联规则算法

    千次阅读 2016-02-21 10:32:48
    从大规模数据集中寻找物品间的隐含关系被称为关联规则分析(association analysis)或关联规则学习(association rule learning)。举个例子说就是发现用户购买了一件商品(如帽子)后,会购买另一件商品(如围巾)...
  • 关联规则挖掘Apriori

    2019-05-18 20:43:29
    关联规则挖掘Apriori及FP-Growth算法 关联规则中的几个概念: 支持度:某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。 置信度:是个条件概念,即在A发生的情况下,B发生...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,242
精华内容 49,696
关键字:

关联组合规则