频繁项集挖掘算法——Apriori算法实现初步

基本概念

这周数据挖掘课上老师介绍了一种基础的数据挖掘算法——频繁项集挖掘算法。这种算法用一句话来总结就是要在数据库中扫描出所有的频繁项集。所谓频繁项集是指一个n项集合,该集合在数据库事务列表中出现的次数超过了我们所给定的一个阈值,这个阈值记为min_sup,被称为最小支持度计数,可以用整数来表达也可用分数来表达。

频繁项集挖掘算法最著名的一个实现即是Agrawal和R.Srikant于1994年提出的Apriori算法。该算法与其他挖掘频繁项集算法相比的一个重大优化就是提出了“先验性质”。先验性质通俗地说即是若一个集合是非频繁的,则它的任何超集都是非频繁的,反过来,若一个集合是频繁的则它的所有真子集都是频繁的。之所以说先验性质是Apriori算法相对于其他频繁项集挖掘算法的重大优化是因为先验性质能够有效地减少算法的搜索空间,这一点我们将会在具体实现中体现出来。

算法阐述

该算法的实现原理其实非常简单,即是使用一种逐层搜索的迭代算法,使用k项集来迭代产生出k+1项候选集(candidate set),然后再通过先验性质对k+1项候选集进行剪枝操作,缩小算法搜索空间,进而由此产生k+1项集。由k项集产生出k+1项候选集的过程可分为两步,第一步为连接步,笔者不想用过多的数学表达,仅在这里简单地描述连接步过程。假设我们已经获得了k项频繁项集合,则从该项集的第一项(记为第i项)开始向下寻找前k-1项与其相同的项(记为第j项),则第i项的全部元素和第j项的第k个元素组成了k+1项“候选集”的一项,以此类推直到遍历k项频繁项集。之所以候选集要打引号是因为这里的集合还没有经过剪枝操作,还不能被真正成为候选集。

集合的剪枝操作即在k+1项集中针对每个k+1项集检验它的每个k项真子集是否都为事务集合的频繁项集即可,若然,则保留这个k+1项集作为候选集,否则从集合中删除这个k+1项集。这样我们就获得了k+1项候选集,在这之后针对数据库进行扫描,计算出每个k+1项集的频繁计数(出现了多少次),大于最小频繁计数(min_sup)的保留,小于的从集合中去除,则我们就得到了k+1项频繁项集合。然后再重复以上的工作,迭代搜索,直到找出一个n项频繁集合无法再找出n+1项频繁项集,则算法结束,释放资源,停机。


图1【1】

算法实现

笔者使用纯C语言实现该算法,手动管理内存。但在这里不推荐使用C语言。因为C太基础,许多要用到的数据结构均需要手动实现,效率太低且复杂度较高。笔者在实现算法之前对算法的复杂度缺乏了解,以为该算法很简单因此就想用C试试,结果等体会到复杂的时候代码已经写出了数十行,只好硬着头皮写。

笔者使用文件来模拟数据库,程序扫描文件就等效为扫描数据库。为了降低程序的I/O次数并提高运行速度,在程序启动时即读取数据进入内存,使用树形结构来存储数据。该数据结构中使用到两类节点,一类节点用于存储事务元素,一类节点用于存储事务id,并为元素节点提供索引,整个数据结构使用简单的单链表实现。数据结构直观上很像一个散列表:



算法首先在读入数据之后产生频繁一项集,该集合的产生算法较为简单:在整个事务列表中搜索所有的事务元素并统计这些元素的出现次数,小于min_sup的一项集丢弃。



上图算法返回一个映射,该映射中存储着所有的频繁一项集及其频繁计数,该映射作为下一级函数的数入,用于产生频繁二项集,频繁三项集......。

从频繁二项集开始算法即开始使用递归函数生成,具体算法过程如述:首先接受k项频繁项集,然后使用两个指针一前一后产生出所有符合“连接步条件”的k+1项集合。这个k+1项集合通过先验条件剪枝后得到k+1项候选集,然后计算集合中每一个k+1项集在事务集合中的计数,不符合min_sup的去掉,然后再递归调用该函数,直到找不出更多的集合,则递归返回。





这就是该算法的核心步骤了。

算法测试

算法测试时选取的是《数据挖掘》这本书上161页的例子,在本例中笔者使用文本文档来模拟数据库,文本文档中的数据格式如下图所示:




程序中设定最小支持度计数为2,则程序的运行结果如下图所示:



可见,程序给出的结果和书上的结果是一样的。

该算法的实现笔者已经开源在git上,请有兴趣的朋友们能一起批评指正。

github.com/yhswjtuILMARE/MaxItemSet

参考

[1]http://www.jianshu.com/p/00103435ef89

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 前言 其实读完斯坦福的这本《互联网大规模数据挖掘》,让我感觉到,什么是人工智能?人工智能就是更高层次的数据挖掘。机...
    我偏笑_NSNirvana阅读 12,400评论 1 23
  • Apriori算法是通过限制候选产生发现频繁项集。 Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用...
    贰拾贰画生阅读 18,299评论 9 10
  • 单选题 1. 某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A) A...
    山的那边是什么_阅读 33,386评论 2 59
  • 大家恐怕都听说过著名的啤酒与尿布, 这是典型的购物篮问题, 在数据挖掘界叫做频繁项集(Frequent Items...
    陈码工阅读 3,420评论 0 2
  • 每天上课的时候,总看着窗外发呆,想你,有时偷偷地拿出你的照片,会不知不觉地流泪,然后跑出教室,买了一些酒,独自躲在...
    乔鱼阅读 217评论 0 0