关键词不能为空

当前您在: 主页 > 英语 >

关联规则算法Apriori的学习与实现

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 16:13
tags:

-

2021年2月9日发(作者:天穹)


关联规则算法


Apriori


的学习与实现





(2011-07-18 11:28:52)




首先我们来看,


什么是规则?规则形 如



如果



那 么


…(If…Then…)”,


前者为条件,后者为结


果。


关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系 。


关联规则揭示了


数据项间的未知的依赖关系,


根据所挖掘的关联关系,


可以从一个数据对象的信息来推断另

< br>一个数据对象的信息。例如购物篮分析。牛奶



?



面包


< /p>


[


支持度:


3%


,置信度:


40%]


支持度


3%


意味


3%


顾客同时购买牛奶和面包。置信度


40%


意味购买牛奶的顾客


40%


也购买


面包。


规则的支持度和置信度是两个 规则兴趣度度量,


它们分别反映发现规则的有用性和确


定性。< /p>


关联规则是有趣的,


如果它满足最小支持度阈值和最小置信度阈值 。


这些阈值可以由


用户或领域专家设定。



我们先来认识几个相关的定义:



定义


1



< /p>


支持度(


support




支持度


s


是事务数据库< /p>


D


中包含


A U B

的事务百分比,它是概率


P



A U B


),即


support



A B



=P



A U B


),它描述了


A



B


这两个物品集的并集在所有的事务中出现的概率。



定义


2



< /p>


置信度(


confidence




可信度为事务数据库


D

中包含


A


的事务中同时也包含


B< /p>


的百分比,它是概率


P



B|A



,即


confide nce



A B


=P



B|A


)。



定义


3




频繁项目集



支持度不小于用户给定的 最小支持度阈值(


minsup


)的项集称为频繁项目集(简称 频集),


或者大项目集。所有



的频繁


1-


项集记为


L


1




假设有如下表的购买记录。



顾客



1



2



3



4



5



项目



orange juice, coke



milk, orange juice, window cleaner



orange juice, detergent



orange juice, detergent, coke



window cleaner



将上表整理一下,得到如下的一个

< p>
2


维表





Orange



Win Cl



Milk



Coke



Detergent



4



1



1



2



1



1



2



1



0



0



1



1



1



0



0



2



0



0



2



0



2



0



0



1



2



Orange



WinCl



Milk



Coke



Detergent



上表中横栏和纵 栏的数字表示同时购买这两种商品的交易条数。如购买有


Orange

< br>的交易数



4


,而同时购买


Orange



Coke

< br>的交易数为


2




置信度表示了这条规则有多大程度上值得可信。设条件的项的集合为


A,


结果的集合为


B



置信度计算在


A


中,同时也含有


B


的概率。即


Confidence(A==>B)=P(B|A)< /p>


。例如计算



如果


Orange



Coke


的置信度。< /p>


由于在含有


Orange



4


条交易中,


仅有


2


条交易含有


Coke.


其置

< br>信度为


0.5




支持度计算在所有的交易集中,既有


A


又有


B


的概率。例如在


5


条 记录中,既有


Orange




Coke


的记录有


2


条。


则此条规则的支持度为


2/5=0.4


现在这条规则可表述为,


如果一个


顾客购买了


Orange,


则有


50 %


的可能购买


Coke



而这样的情况


(即买了


Orange


会再买


Coke



会有


40%


的可能发生。



再来考虑下述情况。





A



B



C



A and B



A and C



B and C



A,B



and C



支持度



0.45



0.42



0.4



0.25



0.2



0.15



0.05



可得到下述规则



规则



置信度



If B and C then A



0.05/0.15*100%=33.33%



If A and C then B



0.05/0.20*100%=25%



If A and B then C



0.05/0.25*100%=20%



上述的三条规则,哪一条规则有用呢?



对于规则



If B and C then A



,同时购买


B

< p>


C


的人中,有


33.3 3%


会购买


A


。而单项


A


的支持度有


0.45


,也就 是说在所有交易中,会有


45%


的人购买


A.


看来使用这条规则来进行


推荐,还不如不推荐,随机对顾 客进荐好了。



为此引入另外一个量,即提升度


(Lift)


,以度量此规则是否可用。描述的是相对于不用规则,

< p>
使用规则可以提高多少。有用的规则的提升度大于


1


。计算方式为


Lift(A==>B)=Confidence(A==>B)/Su pport(B)=Support(A==>B)/(Support(A)*Support(B))



在上


例中,


Lif t(If B and C The A)=0.05/(0.15*0.45)=0.74

。而


Lift(If A then


B)=0.25/( 0.45*0.42)=1.32



也就是说对买了

< p>
A


的人进行推荐


B,


购买 概率是随机推荐


B



1.32


倍。



如何产生规则呢。可以分两步走。



首先找出频繁集


(frequent itemset)


。所谓频繁集指满足最小支持度或置信度的集合。其次从


频繁集中找出 强规则


(strong rules)


。强规则指既满足最小支 持度又满足最小置信度的规则。



我们来看如何产生频繁集。



这其中有 一个定理。即频繁集的子集也一定是频繁集。比如,如果


{A,B,C}


是一个


3


项的频


繁集,则其子 集


{A,B},{B,C},{A,C}


也一定是


2


项的频繁集。为方便,可以把含有


k


项的集


合称之为


k-itemsets.


下面以迭代的方式找出频繁集。


首先找出


1-i temsets


的频繁集,


然后使用这个


1-itemsets




行组合, 找出


2-itemsets


的频繁集。如此下去,直到不再满足 最小支持度或置信度的条件为


止。


这其中重要的两步骤分别是连 接


(join)


和剪枝


(prune) .


即从


(k-1)-itemsets


中的项进行组合,


产生备选集


(Candidate item sets)


。再从备选集中,将不符合最小支持度或置信度的项删去。

< br>例如



Frequent 2-itemsets



I1,I2



I1,I4



I2,I3



I2,I4




==>



I1,I2,I4






I2,I3,I4





Candidate 3-itemsets




==>



I1,I2,I4









Frqquent 3-itemsets



下面我们再来看一个详细的例子。



设 最小支持度为


2


,以


C


k


表示


k-itemsets


备选集


,



L


k


表示


k-itemsets


频繁集。



ID



Items




Itemset



Sup. count



I1



6



7



6



2



2









Itemset



I1




Itemset



I1,I2



100



I1,I2,I5



200



I2,I4



300



I2,I3



400



I1,I2,I4



500



I1,I3



600



I2,I3



700



I1,I3



800



I1,I2,I3,I5



900



I1,I2,I3






==>


C


1:



I2











I3



I4



I5









==>


L


1:



I2











I3



I4



I5









==>


C


2



I1,I3











I1,I4



I1,I5



I2,I3



I2,I4



I2,I5



I3,I4



I3,I5



I4,I5




C


2


进行扫描,计算支持度。



Itemset



Sup. count



I1,I2



I1,I3



I1,I4



I1,I5



I2,I3



I2,I4



I2,I5



I3,I4



I3,I5



I4,I5



4



4



1



2



4



2



2



0



1



0




==>


L


2:



I1,I2












I1,I3



I1,I5



I2,I3



I2,I4



I2,I5







Itemset




==>


C


3



I1,I2,I3



2












I1,I2,I5



2



















Itemset



Sup. count




==>


L


3:



I1,I2,I3












I1,I2,I5











Itemset



< br>对于频繁集中的每一项


k-itemset,


可以产生非 空子集,对每一个子集,可以得到满足最小置


信度的规则了。例如考虑

< br>{I1,I2,I5}


。其子集有


{I1,I2}, {I1,I5}, {I2,I5}, {I1}, {I2}, {I5}


。可以


产生规则,


{I1,I2}


??


{I5} (50%), {I1,I5}


??


{I2} (100%), {I2,I5}


??


{I1} (100%),{I1}


??


{I2,I5}


(33%), {I2}


??


{I1,I5} (29%), {I5}


??


{I1,I2} (100%)




也不是每个数据集都 有产生强规则。例如





一起可能很


难产生有效规则。因为恰好一起买这两个牌子的产品的顾客太少。但 不妨将


Thinkpad


notebook

< br>放到


Notebook


这一层次上考虑,而


Canon printer


放到


printer< /p>


这一去层次上考虑。


这样的话,一起买


n otebook



printer


的顾 客就较多了。也即


Multilevel association rules




< br>自


1994


年由


Agrawal


等人提出的关联规则挖掘


Apriori


的算法从其产生到现在,


对关联规则


挖掘方面的研究有着很大 的影响。


Apriori


算法是一种最有影响的挖掘布尔关联 规则频繁项


集的算法。算法基于这样的事实:算法使用频繁项集性质的先验知识。


Apriori


使用一种称


作逐层搜索的迭 代方法,


k-


项集用于探索(


k


+1



-


项集。首先 ,找出频繁


1-


项集的集合。该


集合记 作


L


1



L1



用于找频繁


2-

项集的集合


L2


,而


L2



用于找


L3


,如此下 去,直到不能找到


频繁


k


-

< p>
项集。找每个


Lk



需要 一次数据库扫描。为提高频繁项集逐层产生的效率,一种称作


Apriori


性质的重要性质用于压缩搜索空间。



为了提高频繁项目集逐层产生的效率,


Apriori


算法利用 了两个重要的性质用于压缩搜索空


间:




l


)若


X


是频繁项集,则


x


的所有子集都是频繁项集。

< br>



2


)若

x


是非频繁项集,则


X


的所有超集 都是非频繁项集。




算法:



Apriori


算法,使用逐层迭代找出频繁项集。



输入:事务数 据库


D


;最小支持度阈值


min_su p




输出:


D


中的频繁项集


L




1




L1 = find_frequent_1_itemsets



D


);



2




for



k = 2




Lk-


1 ≠




k++




{


3




Ck = aproiri_gen



Lk-1



min_sup


);



4




for each transaction t D{ //scan D for count


5




Ct = subset



Ck


< p>
t


);



//get subsets of t that are candidates


6




for each candidate c Ct


7




++




8




}


9




Lk={c Ck | ≥ min_sup}



10




}


11




return L =



kLk





现举例说明:如表


1


所示为事务数据库


D


,设最小支持度为


20%


,挖掘频繁项集的具体过


程如表1所示。




1



事务数据库


D




图1所示为


Apriori


算法挖掘频繁集的过程,其中最小支持度为


20%






1



Apriori


算法的执行流程




第一步,经过算法的第一次迭代,对事务数据库进行一次扫描 ,计算出


D


中所包含的每个


项目出现的 次数,生成候选


1-


项集的集合


C


1




第二步,根 据设定的最小支持度,从


C


1


中确定频 繁


1-


项集


L


1




第三步,由

L


1


产生候选


2-


项集


C


2


,然后扫描事务数据 库对


C


2


中的项集进行计数。



第四步,根据最小支持度,从候选集


C


2


中确定频繁集


L


2




第五步,由频繁

< br>2-


项集


L


2

< br>生成候选


3-


项集


C

< p>
3


,生成的候选


3-


项集 的集合


C


3


={{1

< br>,


2



3}


{1



3



5}



{2



3



5}}


,根据


Apriori


的性质剪枝:所有的频繁项集的子集都 是频繁的,项



{1



2



3}


的子集


{1



2}


不包含在频繁< /p>


2-


项集


L2


中 ,故删除


{1



2


3}


。项集


{1



3



5}

< br>的子集


{1



5}


也不包含在频繁


2-


项集


L


2


中,故删除


{1


3



5}


,项集


{2



3


5}


的所有子集


都是

< p>
L


2


的元素,故保留。




Apriori


算法的效率分析:


< /p>



1



Apri ori


性质能显著减少候选集的数目。事务数据库


TDB


总共有


4


个项目,因此可能

< br>的


2-


项集有



=6


个。正如本例所示,利用


Apriori


性质,我们只需要检查


4


个候选


2-


项集的


支持度。


Apri ori


算法在


2


项集这个层次上剪枝率 达


33.3%



随着候选集的长度逐渐 增大,



能的组合数目也急剧增大,因此


Apriori


算法的剪枝效率也越来越高。




2



尽管


Apriori


能对大量候选集剪枝,


但是在大型的事 务数据库中,


仍然可能有大量的候


选集需要处理,并且这种操作 相当耗时。例如,如果事务数据库包含


10


6

< br>个项目,并且只有


1%


(即


10


4


)的项目是频繁的,


Apriori


需要产生超过


10


7

< br>个候选


2-


项集,扫描数据库计算它

们的支持度,生成


L


2


以产生候选


3-


项集。




3


)反复地扫描数据库、计算候选集的支持度,再生成新的长 度加


1


的候选集,


Apriori



法是冗长乏味的,尤其是当存在长模式的时候。

< br>Apriori


是一种产生候选集,然后检测其支


持度的 算法。为挖掘频集


X ={x


1



x


2




x


100


} . Apriori


需要扫描数据库


100


次。



针对


Apriori


算法存在的缺点,


人们对


Apriori


算法进行了多方 面的改进,


希望能够找出一个


高效、可靠的挖掘频繁项集的算法 。这些算法大多是以



Apriori


为核心,或是其变体,或是


其扩展。如增量更新算法、并行算法等



下面是使用


Java


语言实现的


Apriori


算法,实现了


AprioriAlgorithm


类,包含了频繁项集的


挖掘过程和频繁关联规则的挖掘过程。



另外 ,有一个辅助类


ProperSubsetCombination

用于计算一个频繁项集的真子集,采用组合


原理,基于数值编码原理实现的组合求解 集合的真子集。



算法实现



(一)核心类



Apriori


算法的核心实现类为


AprioriAlgorithm


,实现的


Java


代码如下所示:

< br>


package ation;


import p;


import t;


import or;


import


import


import p;



public class AprioriAlgorithm {


private Map> txDatabase; //


事务数据库



private Float minSup; //


最小支持度



private Float minConf; //


最小置信度



private Integer txDatabaseCount; //


事务数据库中的事务数




private Map>> freqItemSet; //


频繁项集集合



private Map, Set>> assiciationRules; //


频繁关联规则集合




public AprioriAlgorithm(Map> txDatabase,Float minSup,Float minConf)


{


base = txDatabase;


= minSup;


f = minConf;


baseCount = ();


freqItemSet = new TreeMap>>();


assiciationRules = new HashMap, Set>>();


}



public Map, Float> getFreq1ItemSet() {


Map, Float> freq1ItemSetMap = new HashMap, Float>();


Map, Integer> candFreq1ItemSet = dFreq1ItemSet();


Iterator<, Integer>> it = et().iterator();


while(t()) {


, Integer> entry = ();


//


计算支持度



Float supported = new Float(ue().toString())/new Float(txDatabaseCount);


if(supported>=minSup) {


((), supported);


}


}


return freq1ItemSetMap;


}



public Map, Integer> getCandFreq1ItemSet() {


Map, Integer> candFreq1ItemSetMap = new HashMap, Integer>();


Iterator<>> it = et().iterator();


//


统计支持数,生成候选频繁


1-


项集



while(t()) {


> entry = ();


Set itemSet = ue();


for(String item : itemSet) {


Set key = new HashSet();


(());


if(!nsKey(key)) {


Integer value = 1;


(key, value);


}


else {


Integer value = 1+(key);


(key, value);


}


}


}


return candFreq1ItemSetMap;


}



public Set> aprioriGen(int m, Set> freqMItemSet) {


Set> candFreqKItemSet = new HashSet>();


Iterator> it = or();


Set originalItemSet = null;


while(t()) {


originalItemSet = ();


Iterator> itr = rator(originalItemSet, freqMItemSet);


while(t()) {


Set identicalSet = new HashSet(); //

两个项集相同元素的集合


(


集合的


交运算


)


(originalItemSet);


Set set = ();


All(set); // identicalSet


中剩下的元素是


identicalSet



set

< br>集合中公有的


元素



if(() == m-1) { // (k-1)-


项集中


k-2


个相同



Set differentSet = new HashSet(); //


两个项集不同元素的集合


(


集合


的差运算


)


(originalItemSet);


All(set); //


因为有


k-2

个相同,



differentSet

中一定剩下一个元素,



differentSet


大小为


1


(set); //


构造候选


k-


项 集的一个元素


(set


大小为


k-1, differentSet


大小



k)


(differentSet); //

< br>加入候选


k-


项集集合



}


}


}


return candFreqKItemSet;


}


private Iterator> getIterator(Set itemSet, Set> freqKItemSet)


{


Iterator> it = or();


while(t()) {


if((())) {


break;


}


}


return it;


}



public Map, Float> getFreqKItemSet(int k, Set> freqMItemSet) {


Map, Integer> candFreqKItemSetMap = new HashMap, Integer>();


//


调用


aprioriGen


方法,得到候选频繁


k-


项集



Set> candFreqKItemSet = iGen(k-1, freqMItemSet);



//


扫描事务数据库



Iterator<>> it = et().iterator();


//


统计支持数



while(t()) {


> entry = ();


Iterator> kit = or();


while(t()) {


Set kSet = ();


Set set = new HashSet();


(kSet);


All(ue()); //


候选频繁


k-


项集与事务数据库中元素做差元算



if(y()) { //


如果拷贝


set


为空,支持数加


1


if((kSet) == null) {


Integer value = 1;


(kSet, value);


}


else {


Integer value = 1+(kSet);


(kSet, value);


}


}


}


}


//


计算支持度,生成频繁


k-


项集,并返回



return support(candFreqKItemSetMap);


}

-


-


-


-


-


-


-


-



本文更新与2021-02-09 16:13,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/622247.html

关联规则算法Apriori的学习与实现的相关文章