### 由啤酒和尿布引出:
在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的商品居然摆在一起。但这一奇怪的举措居然使尿布和啤酒的稍量大幅增加了。这可不是一个笑话,而是一直被商家所津津乐道的发生在美国沃尔玛连锁超市的真实案例。原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。这个发现为商家带来了大量的利润,但是如何从浩如烟海却又杂乱无章的数据中,发现啤酒和尿布销售之间的联系呢?这又给了我们什么样的启示呢?这是怎么做到的呢,这就是数据的挖掘,需要对数据之间的关联规则进行分析,进行购物篮分析。
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。很多的的挖掘算法是在Apriori算法的基础上进行改进的,比如基于散列(Hash)的方法,基于数据分割(Partition)的方法以及不产生候选项集的FP-GROWTH方法等。因此要了解关联规则算法不得不先要了解Apriori算法。
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。可能产生大量的候选集,以及可能需要重复扫描数据库,是Apriori算法的两大缺点
### 频繁项集
项的集合称为项集。包含k个项的项集称为k-项集。集合{computer,ativirus_software}是一个二项集。项集的出项频率是包含项集的事务数,简称为项集的频率,支持度计数或计数。注意,定义项集的支持度有时称为相对支持度,而出现的频率称为绝对支持度。如果项集I的相对支持度满足预定义的最小支持度阈值,则I是频繁项集。
### 布尔关联规则:
关联规则是形如X→Y的蕴涵式,其中且, X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。
### 定义
根据 韩家炜等观点,关联规则定义为:
假设I是 项的集合。给定一个交易数据库D,其中每个 事务(Transaction)t是I的非空子集,即,每一个交易都与一个唯一的 标识符TID(Transaction ID)对应。关联规则在D中的 支持度(support)是D中事务同时包含X、Y的百分比,即 概率; 置信度(confidence)是D中事物已经包含X的情况下,包含Y的百分比,即 条件概率。如果满足 最小支持度阈值和 最小置信度阈值。这些阈值是根据挖掘需要人为设定。
基本概念表1:关联规则的简单例子
| TID | 网球拍 | 网 球 | 运动鞋 | 羽毛球 |
| —- | —— | —– | —— | —— |
| 1 | 1 | 1 | 1 | 0 |
| 2 | 1 | 1 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 |
| 4 | 1 | 0 | 1 | 0 |
| 5 | 0 | 1 | 1 | 1 |
| 6 | 1 | 1 | 0 | 0 |
用一个简单的例子说明。表1是顾客购买记录的数据库D,包含6个事务。项集I={网球拍,网球,运动鞋,羽毛球}。考虑关联规则(频繁二项集):网球拍与网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,X^Y=3, D=6,支持度(X^Y)/D=0.5;X=5, 置信度(X^Y)/X=0.6。若给定最小支持度α = 0.5,最小 置信度β = 0.6,认为购买网球拍和购买网球之间存在关联。
## 挖掘关联规则
### 什么是关联规则
一言蔽之,关联规则是形如X→Y的蕴涵式,表示通过X可以推导“得到”Y,其中X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS)
### 如何量化关联规则
关联规则挖掘的一个典型例子便是购物车分析。通过关联规则挖掘能够发现顾客放入购物车中的不同商品之间的关联,分析顾客的消费习惯。这种关联规则的方向能够帮助卖家了解哪些商品被顾客频繁购买,从而帮助他们开发更好的营销策略。比如:将经常同时购买的商品摆近一些,以便进一步刺激这些商品一起销售;或者,将两件经常同时购买的商品摆远一点,这样可能诱发买这两件商品的用户一路挑选其他商品。
在数据挖掘当中,通常用“支持度”(support)和“置性度”(confidence)两个概念来量化事物之间的关联规则。它们分别反映所发现规则的有用性和确定性。
对于A->B
\1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
\> ①***\*支持度\****:P(A ∩ B),既有A又有B的概率
\> ②***\*置信度\****:
\> P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ⇒ 面包
\>
\> **例子**:[支持度:3%,置信度:40%]
\> > 支持度3%:意味着3%顾客同时购买牛奶和面包
\> > 置信度40%:意味着购买牛奶的顾客40%也购买面包
\
比如:
Computer => antivirus_software , 其中 support=2%, confidence=60%
表示的意思是所有的商品交易中有2%的顾客同时买了电脑和杀毒软件,并且购买电脑的顾客中有60%也购买了杀毒软件。在关联规则的挖掘过程中,通常会设定最小支持度阈值和最小置性度阈值,如果某条关联规则满足最小支持度阈值和最小置性度阈值,则认为该规则可以给用户带来感兴趣的信息。
### 关联规则挖掘过程
1) 几个基本概念:
关联规则A->B的支持度*support=P(AB),指的是事件A和事件B*同时发生的概率。
\置信度***confidence=P(B|A)=P(AB)/P(A),指的是发生事件A的基础上发生事件B*的概率。
同时满足最小支持度阈值和最小置信度阈值的规则称为强规则。
如果事件A中包含k个元素,那么称这个事件A为\k\*项集,**并且事件A满足最小支持度阈值的事件称为频繁***k**项集**。
2) 挖掘过程:
第一,找出所有的频繁项集;
第二,由频繁项集产生强规则。
## Apriori介绍
Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。
其中,\Apriori**算法具有这样一条性质:任一频繁项集的所有非空子集也必须是频繁的。因为假如P(I)< 最小支持度阈值,当有元素A添加到I中时,结果项集(A∩I)不可能比I出现次数更多。因此A∩I也不是频繁的。
2.2 连接步和剪枝步
1) 连接步
若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个项相同,而最后一个项不同,则证明它们是可连接的,即这个k-1项集可以联姻,即可连接生成k项集。使如有两个3项集:{a, b, c}{a, b, d},这两个3项集就是可连接的,它们可以连接生成4项集{a, b, c, d}。又如两个3项集{a, b, c}{a, d, e},这两个3项集显示是不能连接生成3项集的。
剪枝步
若一个项集的子集不是频繁项集,则该项集肯定也不是频繁项集。这个很好理解,举一个例子,若存在3项集{a, b, c},如果它的2项子集{a, b}的支持度即同时出现的次数达不到阈值,则{a, b, c}同时出现的次数显然也是达不到阈值的。因此,若存在一个项集的子集不是频繁项集,那么该项集就应该被无情的舍弃。
\Apriori算法流程**:
\1. 过单趟扫描数据库D;计算出各个1项集的支持度,得 到频繁1项集的集合。
\2. 从2项集开始循环,由频繁k-1项集生成频繁频繁k项集。
2.1 连接步:为了生成,预先生成,由2个只有一个项不同的属于的频集做一 个(k-2)JOIN运算得到的。
2.2 剪枝步:由于是的超集,所以可能有些元素不是频繁的。舍弃掉子集不是频繁项集即不在频繁k-1项集中的项集
2.3 扫描数据库,计算2.3步中过滤后的k项集的支持度,舍弃掉支持度小于阈值的项集,生成频繁k项集。
\3. 当当前生成的频繁k项集中只有一个项集时循环结束
【注意】
在剪枝步中的每个元 素需在交易数据库中进行验证来决定其是否加入,这里的验证过程 是算法性能的一个瓶颈。这个方法要求多次扫描可能很大的交易数据库。可能产生大量的候选集,以及可能需要重复扫描数据库,是Apriori算法的两大缺 点。
Apriori\算法实例
| \交易\*ID** | *商品**ID**列表\ |
| ———————- | ——————————– |
| T100 | I1,I2,I5 |
| T200 | I2,I4 |
| T300 | I2,I3 |
| T400 | I1,I2,I4 |
| T500 | I1,I3 |
| T600 | I2,I3 |
| T700 | I1,I3 |
| T800 | I1,I2,I3,I5 |
| T900 | I1,I2,I3 |
上图为某商场的交易记录,共有9个事务,利用Apriori算法寻找所有的频繁项集的过程如下:
1 | 详细介绍下候选3项集的集合**C3**的产生过程:从连接步,首先C3={{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}(C3是由**L2**与自身连接产生)。根据Apriori性质,频繁项集的所有子集也必须频繁的,可以确定有4个候选集{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}不可能时频繁的,因为它们存在子集不属于频繁集,因此将它们从C3中删除。注意,由于**Apriori**算法使用逐层搜索技术,给定候选k项集后,只需检查它们的(k-1)个子集是否频繁。 |
3、总结与优化
①Apriori算法的缺点:
(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。
(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。
②网上提到的频集算法的几种优化方法:
- 基于划分的方法。
- 基于hash的方法。
- 基于采样的方法。
减少交易的个数。
我重点看了“基于划分的方法”改进算法,现在简单介绍一下实现思想:
基于划分(partition)的算法,这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并 对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。
其中,partition算法要注意的是分片的大小选取,要保证每个分片可以被放入到内存。当每个分片产生频集后,再合并产生产生全局的候选k-项集。若在多个处理器分片,可以通过处理器之间共享一个杂凑树来产生频集。
转自:http://blog.csdn.net/lizhengnanhua/article/details/9061755
http://blog.csdn.net/qustdjx/article/details/12770883
转载地址