数据挖掘之模式挖掘(频繁模式挖掘与Apriori算法)

来源:互联网 发布:php 反射机制 编辑:程序博客网 时间:2024/05/29 07:42

数据挖掘任务分为:模式挖掘、描述建模、预测建模。 这篇讲解模式挖掘。

1、频繁模式(Frequent pattern)

1.1 定义
Frequent pattern: a pattern (a set of items, subsequences, substructures, etc.) that occurs frequently in a data set.
频繁模式:在一个数据集中频繁出现的模式(一些项、子序列、子结构等)
1.2 Motivation
Finding inherent regularities in data:
a)What products were often purchased together? Beer and diapers?
b)What are the subsequent purchases after buying a PC?
c)What kinds of DNA are sensitive to this new drug?
d)Can we automatically classify web documents?
1.3 Applications
Basket data analysis, cross-marketing, catalog design, sale campaign analysis, Web log (click stream) analysis, and DNA sequence analysis.
1.4 Why Is Freq. Pattern Mining Important?
(1)Discloses an intrinsic and important property of data sets.
(2)Forms the foundation for many essential data mining tasks.

2、频繁模式挖掘方法概述

 

图1 A Multidimensional View of Frequent Patten Discovery
上图中,纵坐标代表频繁模式挖掘所应用的数据和知识种类,如关联规则、子序列、子图和冰山方体等,横坐标代表在频繁模式挖掘中所采用的主要操作。它们的组合产生了各种具体的频繁模式挖掘方法。
具体地,横坐标中,read指相应的算法只会对数据进行读取操作,通过对数据的多次读取来完成频繁模式的挖掘;针对read方法需要对数据进行多次读取的缺点,write方法在读取数据时将部分以后可能会用到的部分数据记录下来,写在磁盘上,这样下次用到这些数据时便不用重新读取原始数据,而直接读取写在磁盘上的相应数据即可,从而可以达到以空间换时间的目的,加快处理速度;pointer方法是指当所有的数据可以放入内存时,可以用指针在内存中不断地跳转,从而达到对数据有选择读取的目的。
3、频繁模式挖掘算法相关
3.1 数据和知识的类型
3.1.1 关联规则(Associative Pattern)
(1) transactional table vs relational table
(2) boolean vs quantitative
 
图2 transactional with binary
 
图3 relational with quantitative attribute
3.1.2 序列模式(Sequential Pattern)
A sequence : < (ef) (ab) (df) c b >
(e,f)->(a,b)-> c occur 50% of the time.
3.1.3 冰山方体(Iceburg Cube)
图4 cube: using other measure as support
3.2 频繁模式挖掘的算法
3.2.1 算法模型
图5 频繁模式挖掘&网格遍历
频繁模式挖掘的过程,可以看做对图5所示的网格进行遍历的过程。可以从以下几个方面对这一过程进行分类
(1)广度遍历vs深度遍历(Breadth first vs Depth first)
(2)自顶向下vs自底向上(Bottom up vs top down)
(3)基于读、基于写和基于指针(Read-based, Write-Based, Pointer-Based)
3.2.2 算法分类
(1)Read [AgSr94]
Apriori-based. No write involved.
(2)Write [Zaki00, HPY00, HaPe00]
Perform write to improve performance.
(3)Pointer [BeRa99, HPDW01]
Memory based algorithm designed to point to various part of the data instead of re-writing the data in another part of the memory.
3.2.3 算法概要
 
4、关联规则挖掘算法
4.1 基本概念
4.1.1关联规则
关联规则是发现交易数据库中不同商品(项)之间的联系。这些规则找出顾客购买行为模式,如购买了某一商品对购买其他商品的影响。发现这样的规则可以应用于商品货架设计、存货安排以及根据购买模式对用户进行分类。比如“尿布和啤酒”:观察发现很多顾客在买尿布的时候同时也购买啤酒,这样超市把尿布和啤酒放在一起就可以提高销售额,如果把土豆片摆在它们中间,则会同时提高这三者的销售额。
4.1.2 规则
规则:{x1,x2,…,xn}->Y。
如果顾客把商品x1,x2,…, xn放入购物篮中的话,则很可能也会把商品Y放入其中。
这个可能性(购买x1,x2,…,xn的前提下购买Y)称作规则的可信度
人们通常只对那些可信度大于某个值的规则感兴趣,希望把这些规则找出来。当然,有可能出现这样的情况,某些商品是被随机放入购物篮中的,例如:类似这样的规则,{牛奶,黄油}—〉面包,它的可信度非常大,可能是因为很多人都购买面包,象这样的规则是无用的。
4.1.3 可信度与支持度
支持度:同时购买x1,x2,…,xn    和Y的可能性。
support(A-> B)=P(AB)
可信度:购买x1,x2,…, xn 的情况下购买Y的可能性, 条件概率。
confidence (A->B)=P(B|A)
4.1.4 频繁项目集
满足最小支持度的项目集。
4.1.5 支持度和可信度举例
 
图6 支持度和可信度的例子
4.2 关联规则的因果关系
理想情况下,人们都希望从关联规则中得出这样的结论,因为购买了商品x1,x2,…,xn,所以一定会购买商品Y。但是因果关系是一个很不好确定的东西,下面举一个例子来说明对购物篮数据来说,因果关系意味着什么。如果商店降低尿布的价格而升高啤酒的价格,则会吸引尿布购买者,而这些购买尿布的人同时很可能会购买啤酒,这样商店在尿布上遭受的损失就会从啤酒中得以弥补,这是因为“尿布是因,啤酒是果”。相反,如果降低啤酒的价格而升高尿布的价格,买啤酒的人多了但买尿布的人并不会增多,商店就赔本了。
4.3 关联规则挖掘的演进
(1)1993:AIS(AR Model)
(2)1994:Apriori(层次算法产生侯选集)
         1995:Partition,Hash-based,Parallel
             1996:Sample
             1997:Dynamic
(3)2000:FP-Growth(不产生候选集)
4.4 关联规则挖掘算法概述
关联规则挖掘问题可以划分为两个子问题:
(1)根据用户输入的最小支持度,寻找频繁项集。
(2)根据用户输入的最小可信度,产生关联规则。
第二个问题比较简单,关键是解决第一个问题。

5、Boolean AR(Association Rule)
5.1 算法设计的重要前提
以“市场-购物篮”为数据模型,把数据看作一个布尔矩阵,其中行=购物篮,列=商品项目,如图7:
 
图7 市场-购物篮模型图
(1)矩阵很稀疏,几乎全是0
(2)列的数目(项目数)要足够小,每列存点东西的话可以把所有的列放入内存;同时列的数目又要足够大,每个项目对存点东西的话,不能全部放入内存。
(3)行的数目很多,不可能把整个矩阵放入内存,即使利用稀疏采用压缩也不行。
5.2 估计算法运行的时间
主要考虑算法对数据的扫描次数。数据挖掘的主要代价是从硬盘读数据,因此估算一个数据挖掘算法运行时间的最好手段是看它对同一个数据读了几次。
5.3 一个重要的公理
如果一个项目集S是频繁的(项目集S的出现频度大于最小支持度s),那么S的任意子集也是频繁的。 
5.4 找频繁项目集的两类算法
(1)分层挖掘(每一层需要都需要对数据做一次扫描)
先找出大小为1的频繁项目集,再找出大小为2的频繁项目集,再找出大小为3的频繁项目集,等等。 我们只需要把精力放在大小为2的频繁项目集上,因为:通常,大小为2的频繁项目集就足够了。在很多数据集合里,查找大小为2的频繁项目集比较困难,进行高层挖掘比查找大小为2的频繁项目集用的时间要少。
(2)数据做一次(最多两次)扫描,找出最大频繁集(任何超集都不是频繁集的集合S)。 
6、Apriori算法
6.1 Apriori 算法步骤1:分层寻找频繁项目集
(1)给出minisupp,第一次扫描数据的时候,找出频度大于minisupp的项目,称这集合为L1。一般来说,一个商店卖的商品品种不会超过10万个,所以我们假定有足够的内存来计算每个项目的出现频度。
(2)第二次扫描数据时,L1中的项目对成为大小为2的候选项目集C2,我们希望C2不要太大,这样的话就可以有足够的空间为每个候选对分配一个计数器来计算它的出现频度,计数值大于minisupp的候选对构成大小为2的频繁项目集L2。 
(3)第三次扫描数据时,由L2生成大小为3的候选项目集C3,C3是这样的集合{A,B,C},并且{A,B},{B,C},{A,C}都在L2中。计算C3中每个三元组的出现频度,大于minisupp构成L3。
(4)一直进行到集合为空时为止。Li是大小为i的频繁项目集,Ci+1是大小为i+1的集合,这些集合的每个大小为i 的子集都在Li中。
找频繁项集的过程举例,如图8。
 
图8 找频繁项集过程举例
6.2 Apriori 算法步骤2:产生关联规则
对于每个频繁项目集L,产生它的所有非空子集S。
对L的每个非空子集S,如果满足如下条件:

则输出关联规则 S→(L – S)。
6.3 Apriori算法对网格结构的遍历
(1)Bottom-up, breadth first search
自底向上,宽度优先搜索。
(2)Only read is perform on the databases
只读。
(3)Store candidates in memory to simulate the lattice search
在内存中保存候选集来模拟网格遍历。
(4)Iteratively follow the two steps:
递归地进行以下两步:
a)产生候选集(generate candidates)
b)对频繁项计数,得到频繁项集(count and get actual frequent items)
图9 Apriori对网格的遍历方法
6.3.2 候选集的产生和剪枝(Candidate Generation and Pruning)
Suppose all frequent (k-1) items are in Lk-1
Step 1: 
Self-joining Lk-1
insert into Ck
select p.i1, p.i2, …, p.ik-1, q.ik-1
from Lk-1 p, Lk-1 q
where p.i1=q.i1, … , p.ik-2=q.ik-2, p.ik-1 < q.ik-1
 
图10 候选集产生和剪枝示意图
Step 2: pruning
forall itemsets c in Ck do
     forall (k-1)-subsets s of c do 
           if (s is not in Lk-1) then
              delete c from Ck
6.4 总结:Apriori算法的重要细节
6.4.1 How to generate candidates?
   Step 1: self-joining Lk
   Step 2: pruning
6.4.2 How to count supports of candidates?
6.4.3Example of Candidate-generation
L3={abc, abd, acd, ace, bcd}
(1)Candidate generation
   Self-joining: L3*L3
   abcd from abc and abd
   acde from acd and ace
(2)Pruning:
   acde is removed because ade is not in L3
   C4={abcd}
7、Apriori算法的改进
7.1 改进方向概述
(1)当i>=2时,减小候选集Ci的大小.这一点非常重要,因为即使对于找频繁的对(大小为2的频繁项目集),候选集的大小必须足够小,给每个对加一个计数器之后还可以在内存中放得下.
(基于hash的算法以及Iceberg 查询对hash算法的改进)
(2)把找L1,L2,…,Ln的过程合并成一次(最多两次)扫描,而不是每层扫描一次。
(Sample算法,Partition算法,Dynamic算法)
(3)减小数据库的大小。任何一个事务(一个购物篮),如果它不包含k-itemset,则不包含k+1-itemset,可以去掉。
(基于hash的算法采用了该技术)
原创粉丝点击