关联规则挖掘与Apriori算法

关联规则挖掘是数据挖掘中常用的手段,一般指的是从交易数据库、关系数据库以及其他的数据集中发现项或对象的频繁的模式(frequent patterns)、关联(association)的过程。此方法一般用于在购物篮分析(market basket analysis)中。最早是用于发现超市销售数据库中不同商品之间的关联关系,最经典的莫过于啤酒与尿布的这个段子。

观察发现很多顾客在买尿布的时候同时也购买啤酒,这样超市把尿布和啤酒放在一起就可以提高销售额,如果把土豆片摆在它们中间,则会同时提高这三者的销售额。

那么这个现象就会带来一些思考,哪些商品客户是可能会在一次购物同时购买?

基础概念

在讲述算法过程前先介绍下几个基本概念,首先我们存在一个交易数据库Transacational database:

  • 被研究的对象被称为项(Item),购物篮分析应用背景下,顾客购每个商品称为一个项
  • 所有项的集合: I={i_1,i_2, ...i_m}
  • 每个交易t_i对应的项的集合是I的子集
  • I的任何一个子集被称为项集(Itemset): x = {i_{j1}, i_{j2}...i_{jp}}
  • 交易数据库D则是交易的集合,D={t_1, t_2...,t_m}
  • 每个项集包含的项的个数,成为项集的长度,一个长度为k的项集被称为k项集
  • 一个项集X在数据库D中出现的次数称为频数, 记为count(X)

支持度support

一个项集X的支持度指的是在数据集中包含该项集的记录所占的比例。
support(X) = count(X)/|D|
若给定一个最小支持度minsup, support(X) >= minsup, 则X称为频繁项集,也可以说X是频繁的。

置信度/可信度confidence

置信度/可信度是针对一条比如X->Y的关联规则来定义的,指的是包含X的交易中包含Y的比例。
conf(X \rightarrow Y) = |XY|/|X| = sup(XY)/sup(X)

Apriori算法

Apriori算法是一个经典的挖掘规则算法,也是最常用的挖掘频繁项集的算法。主要步骤如下

  1. 发现所有的频繁集: 支持度>=minsupport的所有项集
    1. 统计每个k项候选集的支持度,找出频繁的k项集: L_k
    2. 利用频繁的k项集生成k+1项候选集: C_{k+1}, k=k+1
  2. 将每个频繁集生成可能的关联规则

下面举个例子,最小支持度minsup=2

apriori算法举例

文字描述下算法流程就是:

  1. 扫描TDB, 对每个候选项计算支持度得到表C1
  2. 比较C中各个后选项支持度与最小支持度,得到1维的最大项集L1
  3. 由L1得到候选集C2
  4. 由C2比较支持度得到L2
  5. 由L2得到C3
  6. 由C3得到3维项集L3

根据上述流程我们也会发现,这个算法每一步产生候选集时循环产生的组合过多,我们可以通过挖掘关联规则的性质来做剪枝。

  • 任何频繁集的子集必须是频繁的
  • Apriori剪裁规则: 若存在某些项集是不频繁的,则和这些项集的任何超集都是不频繁的,因为无需生成和测试
剪枝

如图所示,AB是不频繁的,那么红色虚线圈出的所有超集也是不频繁的,因此可以剪掉。所以生成候选集的方法可以这样总结:

假设项集L_k中的项是有序的

  1. 两两组合L_k中项集生成C_{k+1}
  2. 裁剪

生成关联规则

前面说完了如何生成频繁项集,接下来说说如何生成关联规则,现有频繁项集l,生成每个非空子集S,若S满足最小置信度:
confidence((l-s) \rightarrow s) = \frac{sup(l)}{sup(l-s)} >= minconf

则输出关联规则(l-s)->s。

关联规则示例

如图所示,最小置信度minconf=80%,对于频繁项集BCE,得到如下几个关联规则,其中大于80%的为BC->E和CE-<B两条规则。

提升度

我们现在掌握了如何找出频繁项集以及关联规则的算法,那么怎么确定计算出来的支持度和置信度是有效的呢?现在有个例子如下:

提升度示例

从直觉上来说,打篮球和吃燕麦看不出有什么关联,但从上述计算的结果来看,打篮球->吃燕麦的规则的支持度和置信度还挺高。这说明了支持度和置信度有时候并不一定能准确的反映数据之间的相关性。那么就引入了一个新的概念,提升度(Lift)。
lift = \frac{P(A \cup B)}{P(A)P(B)} = \frac{conf(A \rightarrow B)}{sup(B)}
如果lift>1,则说明是A对B是有提升的,反之则是没有提升。

那么Apriori算法现在可以总结为四步:

  1. 设置minsup和minconf
  2. 找出频繁项集
  3. 根据频繁项集找到conf>minconf的规则
  4. 计算上一步找出的规则的提升度,选出提升度最高的几个

由于Apriori算法存在着可能会产生大量候选集的问题,因此又出现了新的算法,FP-growth算法。它是基于Apriori构建,但采用了高级的数据结构减少扫描次数,大大加快了算法速度。FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁,因此FP-growth算法的速度要比Apriori算法快。这个算法以后再深入讨论。以上就是关于Apriori算法的基础知识,后续会抽空写个Apriori算法的简单代码实现,这里先立个flag~

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