Frequent Pattern 挖掘之一(Aprior算法)(转)

数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘。这篇博客就想谈谈频繁模式挖掘相关的一些算法。

定义

何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据集中频繁出现的模式。举个例子,比如在超市的交易系统中,记载了很多次交易,每一次交易的信息包括用户购买的商品清单。如果超市主管是个有心人的话,他会发现尿不湿,啤酒这两样商品在许多用户的购物清单上都出现了,而且频率非常高。尿不湿,啤酒同时出现在一张购物单上就可以称之为一种频繁模式,这样的发掘就可以称之为频繁模式挖掘。这样的挖掘是非常有意义的,上述的例子就是在沃尔玛超市发生的真实例子,至今为工业界所津津乐道。

Aprior挖掘算法:

那么接下来的问题就很自然了,用户该如何有效的挖掘出所有这样的模式呢?下面我们就来讨论一下最简单,最自然的一种方法。在谈到这个算法之前,我们先声明一个在频繁模式挖掘中的一个特性-Aprior特性。

Aprior特性:

这个特性是指如果一个Item set(项目集合)不是frequent item set(频繁集合),那么任何包含它的项目集合一定也不是频繁集合.这里的集合就是模式.这个特性很自然,也很容易理解.比如还是看上面沃尔玛超市的例子,如果啤酒这个商品在所有的购物清单中只出现过1次,那么任何包含啤酒这个商品的购物商品组合,比如(啤酒,尿不湿)最多也只出现了一次,如果我们认定出现次数多于2次的项目集合才能称之为频繁集合的话,那么这些包含了啤酒的购物组合肯定都不是频繁集合.反之,如果一个项目集合是频繁集合,那么它的任意非空子集也是频繁集合.

有了这个特性,那么就可以在挖掘过程中对一些不可能的项目集合进行排除,避免造成不必要的计算浪费.这个方法主要包含两个操作:product(叉积)和prune(剪枝).这两种操作是整个方法的核心.

首先是product:

先有几个定义,L(k)-候选项目队列,该队列中包含一系列的项目集合(也就是说队列是项目集合的集合),这些项目集合的长度都是一样的,都为k,这个长度我们称之为秩(呵呵,秩是我自己取的中文名),这些长度相同的集合称之为k-集合。那么就有L(k+1)=L(k) product L(k).也就是说通过product操作(自叉积),秩为k的候选队列可以生成秩为k+1的候选队列。需要注意的是,这里所有的候选队列中的k-集合都按照字母顺序(或者是另外的某种事先定义好的顺序)排好序了。好,下面关键来了,product该如何执行?product操作是针对候选队列中的k-集合的,实际上就是候选队列中的k-集合两两进行执行join操作。K-集合l1,l2之间能够进行join有一个前提,那就是两个k-集合的前k-1个项目是相同的,并且l1(k)的顺序大于l2(k)(这个顺序的要求是为了排除重复结果)。用公式表示这个前提就是(l1[1]=l2[1])^(l1[2]=l2[2])^…^(l1[k-1]=l2[k-1])^(l1[k]<l2[k]).那么join的结果就形成了一个k+1长度的集合l1[1],l1[2],…,l1[k-1],l1[k],l2[k]。如果L(k)队列中的所有k-集合两两之间都完成了join操作,那么这些形成的k+1长度的集合就构成了一个新的秩为k+1的候选项目队列L(k+1)。

剪枝操作:

这个操作是针对候选队列的,它对候选队列中的所有k-集合进行一次筛选,筛选过程会对数据库进行一次扫描,把那些不是频繁项目集合的k-集合从L(k)候选队列中去掉。为什么这么做呢?还记得前面提到的Aprior特性么?因为这些不是频繁集合的k-集合通过product操作无法生成频繁集合,它对product操作产生频繁集合没有任何贡献,把它保留在候选队列中除了增加复杂度没有任何其他优点,因此就把它从队列中去掉。

这两个操作就构成了算法的核心,用户从秩为1的项目候选队列开始,通过product操作,剪枝操作生成秩为2的候选队列,再通过同样的2步操作生成秩为3的候选队列,一直循环操作,直到候选队列中所有的k-集合的出现此为等于support count.

下面给出一个具体的例子,可以很好得阐述上面的算法思想:

这种算法思路比较清晰直接,实施起来比较简单。但是缺点就是代价很大,每一次剪枝操作都会对数据库进行扫描,每一次product操作需要对队列中的k-集合两两进行join操作,其复杂度为C(sizeof(L(k)),2)。

为了提高算法效率,Han Jiawei提出了FP Growth算法,使得频繁模式的挖掘效率又提升了一个数量级。下一篇博客就着重分析一下FP growth。

时间: 2024-10-13 23:25:34

Frequent Pattern 挖掘之一(Aprior算法)(转)的相关文章

Frequent Pattern 挖掘之二(FP Growth算法)(转)

FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树).下面就详细谈谈如何构造这个树,举例是最好的方法.请看下面这个例子: 这张表描述了一张商品交易清单,abcdefg代表商品,(ordered)frequent items这一列是把商品按照降序重新进行了排列,这个排序很重要,我们操作的所

Aprior算法、FP Growth算法

数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据集中频繁出现的模式.举个例子,比如在超市的交易系统中,记载了很多次交易,每一次交易的信息包括用户购买的商品清单.如果超市主管是个有心人的话,他会发现尿不湿,啤酒这两样商品在许多用户的购物清单上都出现了,而且频率非常高.尿不湿,啤酒同时出现在一张购物单上就可以称之为一种频繁模式,这样的发掘就可以称之为

Aprior算法Hadoop上实现思路与关键部分代码

本人最近研究Aprior算法,由于要实现海量数据的分析挖掘,需要在hadoop平台加以实现. 在网上看过一些Aprior算法Mapreduce的代码,感觉拿过来都不好直接用,而且,多数都不是原味的Aprior,或者经过改进,是FP-growth算法,或者是将数据分块,各块独立运行Aprior算法,不是严格意义上的Aprior算法. 本人也是几经实验,终于自己也实现了一种基于Mapreduce的原汁原味的Aprior算法的分布式实现. Aprior分布式实现的问题:输入有多个,一个是事务数据库,一

挖掘相关规则的算法描述

Mining Assocaition rule algrothm(挖掘相关规则的算法) 此算法中有两个关键参数,coverage(表示预测正确的案例个数,此参数用来筛选哪些实例个数大于或等于这个值得相关规则) accuracy(表示预测数据的精确度,此参数实际上是满足相关规则的实例的个数/满足规则前部分条件的实例个数) A  找到满足coverage参数的所有项数的规则集合算法描述 把1赋给变量k 找到所有的满足coverage数量的k项规则集合,并且把它们保存到哈希表#1中 while 发现一

数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法

整理数据挖掘的基本概念和算法,包括关联规则挖掘.分类.聚类的常用算法,敬请期待.今天讲的是关联规则挖掘的最基本的知识. 关联规则挖掘在电商.零售.大气物理.生物医学已经有了广泛的应用,本篇文章将介绍一些基本知识和Aprori算法. 啤酒与尿布的故事已经成为了关联规则挖掘的经典案例,还有人专门出了一本书<啤酒与尿布>,虽然说这个故事是哈弗商学院杜撰出来的,但确实能很好的解释关联规则挖掘的原理.我们这里以一个超市购物篮迷你数据集来解释关联规则挖掘的基本概念: TID Items T1 {牛奶,面包

关联挖掘和Aprioir算法

Apriori算法 优点:易编码实现 缺点:在大数据集上可能较慢 适用数据类型:数值型或者标称型 算法过程: 关联分析是一种在大规模数据集中寻找有意思的关系的任务,这里的有意思的关系有两种:频繁项集(frequent item sets)或关联规则(association rules).支持度(support):一个项集的支持度被定义为数据集中该项集的记录所占的比例.置信度(confidence):关联规则A->B的置信度表示为support(A,B)/support(A) 单纯暴力做的话有2^

Spark FPGrowth (Frequent Pattern Mining)

给定交易数据集,FP增长的第一步是计算项目频率并识别频繁项目.与为同样目的设计的类似Apriori的算法不同,FP增长的第二步使用后缀树(FP-tree)结构来编码事务,而不会显式生成候选集,生成的代价通常很高.第二步之后,可以从FP树中提取频繁项集. import org.apache.spark.sql.SparkSession import org.apache.spark.mllib.fpm.FPGrowth import org.apache.spark.rdd.RDD val spa

机器挖掘之经典算法

在机器学习中,有一种叫做「没有免费的午餐」的定理.简而言之,它指出没有任何一种算法对所有问题都有效,在监督学习(即预测建模)中尤其如此. 例如,你不能说神经网络总是比决策树好,反之亦然.有很多因素在起作用,例如数据集的大小和结构. 因此,你应该针对具体问题尝试多种不同算法,并留出一个数据「测试集」来评估性能.选出优胜者. 当然,你尝试的算法必须适合你的问题,也就是选择正确的机器学习任务.打个比方,如果你需要打扫房子,你可能会用吸尘器.扫帚或拖把,但是你不会拿出铲子开始挖土. 大原则 不过也有一个

FP-tree算法实现

支持度和置信度 严格地说Apriori和FP-Tree都是寻找频繁项集的算法,频繁项集就是所谓的"支持度"比较高的项集,下面解释一下支持度和置信度的概念. 设事务数据库为: A E F G A F G A B E F G E F G 则{A,F,G}的支持度数为3,支持度为3/4. {F,G}的支持度数为4,支持度为4/4. {A}的支持度数为3,支持度为3/4. {F,G}=>{A}的置信度为:{A,F,G}的支持度数 除以 {F,G}的支持度数,即3/4 {A}=>{F