Apriori算法的介绍

前言:

数据挖掘中的关联分析可以分成频繁项集的挖掘和关联规则的生成两个步骤,而Apriori算法是找频繁项集最常用到的一种算法。

关于关联分析和频繁项集请见:什么是关联分析?

中言:

我们还是利用购物篮的例子来讲述Apriori算法的思路。

购物篮信息如下:

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

TID代表交易流水号,Items代表一次交易的商品。

我们Apriori算法的最终目的就是要找出数据集中的频繁项集,把最小支持度阈值设为50%,则最终挖掘结果如下(后面的数字表示该项集的支持度计数):

频繁1-项集:

{Cola} 3

{Diaper} 3

{Beer} 3

{Ham} 2

频繁2-项集:

{Cola, Diaper} 2

{Cola, Beer} 2

{Cola,Ham} 2

{Diaper, Beer} 3

频繁3-项集:

{Cola, Diaper, Beer} 2




Apriori算法的思路是由频繁(k-1)-项集生成候选k-项集,然后根据最小支持度判断该候选k-项集是否是频繁k-项集。

例如先找出所有1-项集,然后筛选出里面的频繁1-项集; 根据频繁1-项集生成候选2-项集,然后筛选出里面的频繁2-项集; 再根据频繁2-项集生成候选3-项集,从里面筛选出频繁3-项集;·······

那么问题来了,如何从频繁(k-1)-项集生成候选k-项集呢?

答案是利用Apriori性质:一个频繁项集的任一子集也应该是频繁子集(用反证法容易证明,略)。所以如果一个项集是非频繁项集,那么它的超集也应该是非频繁项集。

例如{Cola, Diaper}是频繁项集,所以{Cola}和{Diaper}也应该是频繁项集。因为{Egg}是非频繁项集,所以{Cola, Egg}也是非频繁项集。



从频繁1-项集生成候选2-项集的步骤是:把频繁1-项集和频繁1-项集排列组合成2-项集,把含有非频繁子项集的2-项集去掉,就是候选2-项集了。

从频繁2-项集生成候选三项集的步骤是:把频繁2-项集和频繁1-项集排列组合成3-项集:{Cola, Diaper, Beer}、{Cola, Diaper, Ham}、{Cola, Beer, Ham}、{Diaper, Beer, Ham}。

因为{Diaper, Ham}不是频繁2-项集,所以含有{Diaper, Ham}的{Cola, Diaper, Ham}不是候选3-项集,去掉。因为{Beer, Ham}不是频繁2-项集,所以含有{Beer, Ham}的{Cola, Beer, Ham}、{Diaper, Beer, Ham}不是候选3-项集,去掉。

所以候选3-项集只有{Cola, Diaper, Beer}。

购物篮频繁项集的挖掘过程如下:

Apriori算法描述如下(代码源自《数据挖掘原理与实践》):

算法:Apriori 算法的频繁项集的产生

输入:数据集D;最小支持度阈值min_sup

输出:D 中的频繁项集L

(1) L1 = find_frequent_1-itemset( D );

(2) for( k=2; Lk?1≠Φ; k++)

(3) {

(4)  Ck = apriori_gen(Lk?1);      // 产生候选项集

(5)  for all transactions t ∈D

(6)  {

(7)    Ct = subset(Ck, t);      // 识别 t 包含的所有候选

(8)    for all candidates c∈Ct

(9)    {

(10)      c.count++;      // 支持度计数增值

(11)    }

(12)  }

(13)  Lk = { c∈Ck | c.count≥min_sup}      // 提取频繁k-项集

(14) }

(15) return L=∪kLk;

procedure apriori_gen(Lk?1)

(1) for each itemset l1∈Lk?1

(2)  for each itemset l2∈Lk?1

(3)    if( l1[1]=l2[1] ∧…∧ ( l1[k-2]=l2[k-2] ) ∧ ( l1[k-1]<l2[k-2] ) then

(4)    {

(5)      c = join( l1, l2 );      // 连接:产生候选

(6)      if has_infrequent_subset( c, Lk?1) then

(7)        delete c;      // 减枝:移除非频繁的候选

(8)      else

(9)        add c to Ck

(10)    }

(11) return Ck;

procedure has_infrequent_subset( c, Lk?1 )

// 使用先验知识判断候选项集是否频繁

(1) for each ( k-1 )-subset s of c

(2)  if s ?Lk?1 then

(3)    return TRUE;

(4) return FALSE;

后言:

我们可以看到,Apriori算法是通过频繁(k-1)-项集找到频繁k-项集的,虽然可以通过Apriori性质进行减枝,去掉一部分子集为非频繁项集的候选项集,但还是需要不断地扫描数据集,不断地求候选项集的支持度计数从而判断它是否是频繁项集。如果数据集足够大的时候,这种算法的效率还是挺让人捉急的!

然后,FP-Growth算法华丽丽的出现了。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 21:49:42

Apriori算法的介绍的相关文章

FP-Growth算法的介绍

引言: 在关联分析中,频繁项集的挖掘最常用到的就是Apriori算法.Apriori算法是一种先产生候选项集再检验是否频繁的"产生-测试"的方法.这种方法有种弊端:当数据集很大的时候,需要不断扫描数据集造成运行效率很低. 而FP-Growth算法就很好地解决了这个问题.它的思路是把数据集中的事务映射到一棵FP-Tree上面,再根据这棵树找出频繁项集.FP-Tree的构建过程只需要扫描两次数据集. 更多关联分析和Apriori算法的信息请见:什么是关联分析.Apriori算法的介绍. 正

频繁模式挖掘apriori算法介绍及Java实现

频繁模式是频繁地出现在数据集中的模式(如项集.子序列或者子结构).例如,频繁地同时出现在交易数据集中的商品(如牛奶和面包)的集合是频繁项集. 一些基本概念 支持度:support(A=>B)=P(A并B) 置信度:confidence(A=>B)=P(B|A) 频繁k项集:如果项集I的支持度满足预定义的最小支持度阈值,则称I为频繁项集,包含k个项的项集称为k项集. 算法思想 Apriori算法是Agrawal和R. Srikant于1994年提出,为布尔关联规则挖掘频繁项集的原创性算法.通过名

机器学习(八)—Apriori算法

摘要:本文对Apriori算法进行了简单介绍,并通过Python进行实现,进而结合UCI数据库中的肋形蘑菇数据集对算法进行验证. “啤酒与尿布”的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起.但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了.这可不是一个笑话,而是一直被商家所津津乐道的发生在美国沃尔玛连锁超市的真实案例.原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫

Apriori算法--关联规则挖掘

我的数据挖掘算法代码:https://github.com/linyiqun/DataMiningAlgorithm 介绍 Apriori算法是一个经典的数据挖掘算法,Apriori的单词的意思是"先验的",说明这个算法是具有先验性质的,就是说要通过上一次的结果推导出下一次的结果,这个如何体现将会在下面的分析中会慢慢的体现出来.Apriori算法的用处是挖掘频繁项集的,频繁项集粗俗的理解就是找出经常出现的组合,然后根据这些组合最终推出我们的关联规则. Apriori算法原理 Aprio

关联规则挖掘(基本概念和Apriori算法)

关联规则挖掘的研究一直是数据挖掘领域的一个重要方向. 关联规则挖掘的目的是从大型事务数据库中挖掘出不同项目之间的关联关系 ,找出潜在的行为模式. 关联规则概念是由 Agrawal 等人在1993年率先提出的, 并随后提出了Apriori算法. 基本概念: 定义1  关联规则挖掘的事务数据库记为TDB,TDB={T1,T2,…,Tk},Tk={i1,i2,…,ip},Tk称为事务,ip称为项目. 定义2  设I={i1,i2,…,im}是TDB中全体项目组成的集合.每一个事务T是I中一组项目的集合

Apriori算法及python实现

1 Apriori介绍 Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集.最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则. 2.算法模拟 3.伪代码 4.python实现 # -*- coding:gb2312 -*- import sys import copy def

机器学习实战笔记9(Apriori算法)

Apriori算法也属于无监督学习,它强调的是"从数据X中能够发现什么".从大规模的数据集中寻找物品之间隐含关系被称为关联分析或者称为关联规则学习.这里的主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索并不能解决这个问题.因此此处介绍使用Apriorio算法来解决上述问题. 1:简单概念描述 (1)              频繁项集:指经常出现在一块的物品的集合. 关联规则暗示两种物品之间存在很强的关系.(这里我们事先定义阀值,超过该阀值,证明两者之

数据挖掘10大算法详细介绍

想初步了解下怎样数据挖掘,看到一篇不错的文章转载过来啦~ 转自:http://blog.jobbole.com/89037/ 在一份调查问卷中,三个独立专家小组投票选出的十大最有影响力的数据挖掘算法,今天我打算用简单的语言来解释一下. 一旦你知道了这些算法是什么.怎么工作.能做什么.在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识. 还等什么?这就开始吧! 1.C4.5算法 C4.5是做什么的?C4.5 以决策树的形式构建了一个分类器.为了做到这一点,需要给定 C4.5 表

玩转大数据:深入浅出大数据挖掘技术(Apriori算法、Tanagra工具、决策树)

一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 “大数据”作为时下最火热的IT行业的词汇,随之而来的数据仓库.数据分析.数据挖掘等等围绕大数据的商业价值的利用逐渐成为行业人士争相追捧的利润焦点. “大数据” 其实离我们的生活并不遥远,大到微博的海量用户信息,小到一个小区超市的月销售清单,都蕴含着大量潜在的商业价值. 正是由于数据量的快速增长,并且已经远远超过了人们的数据分析能力.因此,科学.商用等领域都迫切需要智能化.自动化的数据分析工具.在这样的背景下,数据挖掘技术应用而生,使得