频繁模式挖掘:Apriori

Frequent pattern: a pattern (a set of items, subsequences, substructures, etc.) that occurs frequently in a data set

First proposed by Agrawal, Imielinski, and Swami [AIS93] in the context of frequent itemsets and association rule mining

Motivation: Finding inherent regularities in data

What products were often purchased together?— Beer and diapers?!

What are the subsequent purchases after buying a PC?

What kinds of DNA are sensitive to this new drug?

Can we automatically classify web documents?

Applications

Basket data analysis,cross-marketing, catalog design, sale campaign analysis, Web log (click stream)

analysis, and DNA sequence analysis.

Apriori 及其改进算法

规则:  {x1,x2,…,xn} =>Y  

如果顾客把商品x1,x2,…, xn放入购物篮中的话,则很可能也会把商品Y放入其中。这个可能性(购买x1,x2,…,xn的前提下购买Y)称作规则的可信度,人们通常只对那些可信度大于某个值的规则感兴趣,希望把这些规则找出来。当然,有可能出现这样的情况,某些商品是被随机放入购物篮中的,例如:类似这样的规则,{牛奶,黄油}—〉面包,它的可信度非常大,可能是因为很多人都购买面包,象这样的规则是无用的。

可信度和最小可信度

购买x1,x2,…, xn 的情况下购买Y的可能性, 条件概率

支持度和最小支持度

同时购买x1,x2,…,xn    和Y的可能性 

频繁项目集

满足最小支持度的项目集

支持度

support(A => B ) = P(A ∪ B)          

可信度:                                                    

confidence(A => B) =  P(B|A)

两个子问题:

1.根据用户输入的最小支持度,寻找频繁项目集

2. 根据用户输入的最小可信度,产生关联规则

第二个问题比较简单,关键是解决第一个问题

Boolean AR:算法设计的重要前提

以“市场-购物篮”为数据模型,把数据看作一个布尔矩阵,其中行=购物篮,列=商品项目:

1.矩阵很稀疏,几乎全是0

2.列的数目(项目数)要足够小,每列存点东西的话可以把所有的列放入内存,同时列的数目又要足够大,每个项目对存点东西的话不能全部放入内存。

3.行的数目很多,不可能把整个矩阵放入内存,即使利用稀疏采用压缩也不行。


主要考虑:

 它对数据的扫描次数 数据挖掘的主要代价是从硬盘读数据,因此估算一个数据挖掘算法运行时间的最好手段是看它对同一个数据读了几次。

重要公理:

如果一个项目集S是频繁的(项目集S的出现频度大于最小支持度s),那么S的任意子集也是频繁的。

要找出频繁项目集,主要有两类算法:

1.分层挖掘 (每一层需要对数据做一次扫描)

先找出大小为1的频繁项目集,再找出大小为2的频繁项目集,再找出大小为3的频繁项目集,等等。

我们只需要把精力放在大小为2的频繁项目集上,因为:

通常,大小为2的频繁项目集就足够了。

在很多数据集合里,查找大小为2的频繁项目集比较困难,进行高层挖掘比查找大小为2的频繁项目集用的时间要少。

2.   数据做一次(最多两次)扫描,找出最大频繁集   (任何超集都不是频繁集的集合S)。


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中。 

步骤2:产生关联规则

对于每个频繁项目集L,产生它的所有非空子集S

对L的每个非空子集S,如果满足如下条件:


  则输出关联规则S→(L – S)


The Apriori Algorithm      An Example:


对A-priori算法的改进:

1.当>=2时,减小候选集Ci的大小.这一点非常重要,因为即使对于找频繁的对(大小为2的频繁项目集),候选集的大小必须足够小,给每个对加一个计数器之后还可以在内存中放得下.(基于hash的算法以及Iceberg 查询对hash算法的改进)

2.  把找L1,L2,…,Ln的过程合并成一次(最多两次)扫描,而不是每层扫描一次.(Sample算法,Partition算法,Dynamic算法) 

3.  减小数据库的大小任何一个事务(一个购物蓝),如果它不包含k-itemset,则不包含k+1-itemset,可以去掉。(基于hash的算法采用了该技术)

基于hash的算法

利用了内存通常比项目数要大的事实,在第一次扫描数据决定L1的时候,建立一个哈希表(P237),根据该表的数据来提前去掉那些不可能是频繁的2-itemset. 在第一次开始扫描数据决定L1时,内存中的情况如图:


pass1:
1.计算所有项目的频度

2.对每一个记录,将所有的 2-Itemset 哈希到哈希表的某个桶中,桶的计数增加1

3.扫描结束时,将频度大于s的项目放入L1.

4.扫描结束时,找出哈希表中计数值大于s的桶(在结果位图中,相应位设为1)。

在第二次扫描数据决定L2时,内存中的情况如图:


pass2:
1.内存中存放有大小为1的频繁项目集L1。

2.内存中存放有位图

3.最后,内存中还放了一个表,存放所有的候选对和它们的计数值,候选对集合C2中的每一个对(i,j),必须满足下列条件:

 i  在L1中,j 在L1中

对(i,j)必须哈希到一个频繁桶中

第二点正是PCY算法和直接a-priori算法之间的不同之处。PCY算法减小了第二次扫描数据时的内存需求。

4.    最后,在第二次扫描数据时,考察每一个2-Itemset,如果满足上面列出的两个条件,则在内存中增加它的计数值,如果第一次出现的话创建一个入口点。

example:


什么时候Hash算法比Apriori算法优越?

 当C2很大(C2和他们的计数器在内存中放不下),而Hash算法产生的频繁桶却很少(大大地减小了C2的大小,使之能全部装入内存,从而不需要再扫描数据)时,Hash算法比Apriori算法优越。

partition算法(two passes)

将数据划分成多个子集, 分别读入内存,找出局部候选集(pass 1)

再次扫描数据,找出所有的频繁集.(pass 2)

关键点: 一个集合如果在任一个子集中都不频繁,则它在全局数据中也不频繁

Sample算法(one or two passes)

随机取内存大小的一个数据的样本,在内存中运行一个层次算法(不用负担I/O),希望从这个样本数据能求出真正的频繁集

按比例伸缩最小支持率,如果样本数据是整个数据的1%,则应该用s%作为新的最小支持率

完整地扫描数据一次,对由样本数据得出的频繁项目集进行验证,但是那些在全局数据中频繁但在样本数据中不频繁的集合被丢掉了

为了减小false negative,可以将样本数据的最小支持率降低一点,这样在全面扫描数据的时候就可以找到更多的候选集。但注意:这样做的后果可能会产生太多的候选集而使内存装不下。


------------------------------------------------------

References

[AgSr94] R. Agrawal, R. Srikant, “Fast Algorithms for Mining Association Rules”, Proc. of the 20th Int'l Conference on Very Large Databases, Santiago, Chile, Sept. 1994.

[AgSr96] R. Srikant, R. Agrawal: "Mining Sequential Patterns: Generalizations and Performance Improvements", to appear in Proc. of the Fifth Int'l Conference on Extending Database Technulogy (EDBT), Avignon, France, March 1996.

[BeRa99] Kevin S. Beyer and Raghu Ramakrishnan.  “Bottom-Up Computation of Sparse and Iceberg CUBEs”. In Proceedings of the ACM SIGMOD International Conference on Management of Data, pages 359-370, June 1999.

[HPDW01] J. Han, J. Pei, G.Dong, and K. Wang, “Efficient Computation of Iceberg Cubes with Complex Measures”, Proc. 2001 ACM-SIGMOD Int. Conf. on Management of Data (SIGMOD'01), Santa Barbara, CA, May 2001.

[HPY00] J. Han, J. Pei, and Y.Yin, `` Mining Frequent Patterns without Candidate Generation'',, Proc. 2000 ACM-SIGMOD Int. Conf. on Management of Data (SIGMOD'00), Dallas, TX, May 2000.

[HaPe00] J. Han and J. Pei ``Mining Frequent Patterns by Pattern-Growth: Methodology and Implications'', ACM SIGKDD Explorations (Special Issue on Scaleble Data Mining Algorithms), 2(2),December 2000.

[PHPC01] J. Pei, J. Han, H.Pinto, Q. Chen, U. Dayal, and M.-C. Hsu, “ PrefixSpan: Mining Sequential Patterns Efficiently by Prefix-Projected Pattern Growth'', Proc. 2001 Int. Conf. on Data Engineering (ICDE'01), Heidelberg, Germany, April 2001.

你可能感兴趣的:(频繁模式挖掘:Apriori)