#得到C1deffilterC1():sum=[]#筛选出数据中的所有元素[sum.append(j)for i in rawData for j in i if j notinsum]returnlist(map(set,sum))#计算支持度: cx->lxdefsupport(cx):#创建lx空表
lx =[]for i in cx:#计算各集合在数据中出现的次数
ip =0for j in rawData:if i.issubset(j):
ip +=1#若该支持度大于最小支持度,则将该集合写入lx列表if ip/len(rawData)>= minSupport:
lx.append(i)#若小于,则将该集合写入剪枝列表中else:
pruning.append(i)return lx
#无重复组合+剪枝 lx->c(x+1)defnoRepCom(lx):#创建cx空表
cx =[]#对当前集合扩增一位,外加剪枝操作for i in lx:for j in l1:#判定l1中的元素是否在该集合中,若不在if j.issubset(i)==False:#使用集合类型的 “与” 运算,得到新的组合
b = i | j
#如果剪枝列表存在需要剪枝元素iflen(pruning)!=0:for k in pruning:#剪枝集合如果不在新的组合中(剪枝),同时b不在cx的列表中(去重)if k.issubset(b)==Falseand b notin cx:
cx.append(b)#如果剪枝列表为空else:#只需去重即可if b notin cx:
cx.append(b)return cx
#main#导入数据
rawData =[['1','2','5'],['2','4'],['2','3'],['1','2','4'],['1','3'],['2','3'],['1','3'],['1','2','3','5'],['1','2','3']]#将数据转换为集合的数据类型
rawData =list(map(set, rawData))print(rawData)#设置最小支持度
minSupport =0.3#剪枝组
pruning =[]#得到c1
cn = filterC1()print('c1:', cn)#计算支持度,得到 l1
l1 = support(cn)print('l1:', l1)#打印剪枝列表print('pruning', pruning,'\n')#lx对l1进行切片,得到新的列表#原因:在noRepCom(lx)中使用了 l1,同时为了在下面的死循环找到进入循环的入口
lx = l1[:]#n为计算次数,sum为频繁项集
n,sum=2,[]#Apriori算法循环while(len(cn)!=0):#例子:由l1得到c2
cn = noRepCom(lx)print('c'+str(n)+':', cn)#例子,由c2得到l1
lx = support(cn)print('l'+str(n)+':', lx)#打印剪枝列表print('pruning', pruning,'\n')#步数+1
n +=1#累积频繁项集sum+= cn
print('D的频繁项集:',sum)#找到sum中的最大频繁项集for i inrange(len(sum)):#设置flag标记,初始化为 1
flag =1for j inrange(i+1,len(sum)):#如果sum[j]集合包含了sum[i]集合,则将flag标记置为1,退出当前循环ifsum[i].issubset(sum[j])==True:
flag =0break#若flag仍为1,则打印它因为它就是我们想要的最大频繁项集if flag ==1:print('D中的最大频繁项集:',sum[i])