apriori

Published: 16 Jun 2015 Category: 算法

一个例子入门

尿布与啤酒

据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒。在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,而他们中有30%~40%的人同时也为自己买一些啤酒。产生这一现象的原因是:美国的太太们常叮嘱她们的丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒。这样商店实际上可以将尿布和啤酒放在一块,并确保在周四全价销售而获利。

概述

Apriori算法是数据挖掘中一种挖掘关联规则的频繁项集算法。

两个概念

关联规则
关联规则是形如X→Y的蕴涵式,其中, X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。其中,关联规则XY,存在支持度和信任度。
频繁项集 :
项的集合称为项集。包含k个项的项集称为k-项集。项集的出项频率是包含项集的事务数,简称为项集的频率,支持度计数或计数。注意,定义项集的支持度有时称为相对支持度,而出现的频率称为绝对支持度。如果项集I的相对支持度满足预定义的最小支持度阈值,则I是频繁项集。

两个参数

支持度(support):
事务出现的次数。有时用概率表示,有时用出现次数表示。例如: 这里写图片描述
{A}、{B}的支持度是2(100%)。{C}的支持度1{50%}

置信度(confidence):
事务包含x也包含y的条件概率。
A=>C: confidence = support({A}∪{B})/support({A})

核心算法

核心思想:
Apriori 算法的核心是使用候选项集寻找频繁项集。 Apriori 使用一种称为逐层搜索的迭代方法, k- 项集用于搜索( k+1 ) – 项集。首先,找出所有频繁 1- 项集 L(1),然后用 L(1) 寻找 L(2) ,用 L(2) 寻找 L(3), 如此,直至不能找到频繁 k- 项集为止。
核心性质:
频繁项集的非空子集也是频繁的。
连接:
假设已经挖掘到频繁K-项集 L(K)。L(K)中含多个大小为K的事务。假如事务A∩事务B = K-1(个数)。则候选集C(K+1) 加上事务: 事务A∪事务B。意思就是说从频繁K-项集 L(K)中任取两个事务,如果他们有k-1个项目相同,则取两者的并集。这样正好形成一个(K+1)的候选项。
剪枝:
这个是利用了apriori算法的核心性质。假如现在有个候选大小为(k+1)的事务。列举其中所有k个项目组成大小为k的事务。看事务是否在L(K)中,如果存在不在L(K)中的,则说明这个候选集不是频繁的,减掉。

优缺点

优点: 易编码实现。
缺点: 在大数据集上可能比较慢。
适用数据类型: 数值型或者标称型数据。

一个例子结束

数据
这里写图片描述
参数 :最小支持度:50% 最小置信度:80%

  1. 大小为1的候选集及其支持度 > 这里写图片描述

  2. 大小为1的频繁序列 > {A} {B} {C} {E}

  3. 1->2连接。大小为1的候选集及其支持度(其实1->2不需要考虑剪枝) >这里写图片描述

  4. 大小为2的频繁序列: > {A,C} {B,C} {B,E} {C,E} > Support(A,C)/support(A)=2/2 = 100% A=>C > Support(A,C)/support(A)=2/3 = 66.67%<80% (c推不出a) > 同理»»»»»»»»»

  5. 2->3 连接,剪枝 > 这里写图片描述

  6. 遍历连接剪枝后的候选集,统计支持度 > 这里写图片描述

  7. 大小为3的频繁序列: > {B,C,E}