apriori算法举例,apriori算法分析
这里把之前的实验报告搬出来了,参考一下各位大佬的代码,然后自己再复习一遍~
作为数据挖掘(和机器学习)的典型算法,Apriori算法是一种挖掘关联规则的频繁项集算法。其核心思想是通过候选集生成和场景向下封闭检测两个阶段挖掘频繁项集。关于它的更多信息,我在网上写的不多。
该算法的基本步骤如下:
1.首先扫描数据集,计算每个单项集的支持度,根据给定的最小支持度得到第一个频繁项集。
2.然后通过运算得到二项式候选集,再次扫描每个候选集的数据集,得到每个候选集的支持度,再与最小支持度进行比较,删除不合格的单项集,得到二项式频繁集。
3.如此下去,直到一个新的候选集无法连接。
4.对于所有找到的频繁集,使用规则提取算法提取关联规则并计算置信度。
该算法的关键代码如下:
L1=find _ frequency _ 1-items ets(D);for(k=2;lk-1;k ) { Ck=apriori_gen(Lk-1,min _ sup);对于每个事务tD {//scan D for counts CT=subset(Ck,t);//获取t的子集,这些子集是每个候选c Ct c.count的候选;} Lk={ cCk c . countmin _ sup } } return L=k Lk;
题外话,为了让实验报告更好看:-),我用Figlet作为工具,生成大的华丽字符,然后添加到输出中。至于它的下载安装,网上有很多教程,也很简单。下面来看看效果:
然后将整个字符图形直接复制粘贴到输出中即可。
简单来说,代码如下:
#!/usr/mdyb/python # coding=utf-8导入ITER工具#事务数据库,和课本上的数据一致Data={T100:[I1 , I2 , I5], T200:[I2 , I4], T300:[I2 , I2 , I4], T500:[I1 , I3], T600:[I2 , I3], T700:[I1 , I3], T800:[I1 , I2 , I3 , I5], T900定义推测的类class Apriori:def __init__(self,min_sup=0.2,dataDic={}):#事务数据库dataself.data=dataDic#获取事务的数量self.size=len(dataDic)#最小支持度阈值自我。min _ sup=min _ sup self。最小_支持值=最小_支持*自我。尺寸#找出频繁一项集的集合L1 def find _ frequency _ 1 _ items ets(self):#这里的字典格式设置为:{itemset1:freq1,items et 2:freq 2 } freq DIC={ } for event in self。数据:用于自身中的项目。data[event]:if item in freq DIC:freq DIC[item]=1 LSE:freq DIC[item]=1 L1=[]for items et in freq DIC:if items et=self。最小支持值:L1。追加([项目集合])返回L1#实现连接和剪枝def apriori_gen(self,L _ last):k=len(L _ last[0])1Ck=[]for items et 1 in L _ last:for items et 2 in L _ last:#连接步:产生候选对于范围(k-2)中的I,flag=0:如果items et 1[I]!=items et 2[I]:flag=1 break;如果flag==1:继续项集1名学生项集2[k-2]:c=项集1[项集2[k-2]]else:continue#剪枝步:删除非频繁的候选如果自我。has _ incorative _ subset(c,L_last,k):continueelse:Ck.append(c)返回Ck#使用先验知识def has _ incorative _ subset(self,c,L_last,k):#返回列表中元组的项子集=列表(ITER工具。每个子集中的commdybations(c,k-1)):#将元组转换成列表each=list(each)if each not in L _ last:return true return False #运行推测的算法def run(自我):L _ last=自我。find _ frequency _ 1 _ items ets()L=L _ lasti=0j=2 while L _ last!=[]:Ck=self。apriori _ gen(L _ last)freq DIC={ }对于自身中的事件。数据:#获取所有支持的子集对于卡文克莱中的丙:#判断是否是子集if set(c)=set(self。data[event]):if tuple(c)in freq DIC:freq DIC[tuple(c)]=1 else:freq DIC[tuple(c)]=1Lk=[]num=[]Lo=[]for c in freq DIC:if freq DIC[c]self。min _ sup _ val:Lk . append(list(c))num。append(freq DIC[c])L _ last=LkL=Lk if len(Lk)!=0:打印[*]频繁%d项集L%d:%(j,j)for i in xrange(0,len(Lk)):print Lk[i],:,num[I]printj=1 return ldef main():print _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _(_)/_ \ _ \ _ \ _ _ /_ \ _ _ _ _ /_ \ ^ _ _ \ _ \ ._ _/ _ _ \ _ _ _ _ _ _/ _ _ _ a=Apriori(dataDic=Data)result=a . run()print [*]所有的频繁项集: for r in result:print Rif _ _ name _ _== _ _ main _ _ :main()
这里将数据也写在脚本中,数据是跟书上一模一样的(具体的可以看《数据挖掘概念与技术 第三版》 ,具体第几页忘了)
运行结果:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。