Apriori算法的python实现

def listSet(targetList):#生成不含有重复项的列表
newList=[]
for listItem in targetList:
newList.append(list(set(listItem)))
return newList

def list1Creation(newList):#生成1-项集
list1=[]
for listItem in newList:
for Item in listItem:
if [Item] not in list1:
list1.append([Item])
return list1

def count(newList,setK):#计算K-项集的支持度计数
numList=[]
for son in setK:
num=0
for listItem in newList:
if (set(son).issubset(listItem)):
num+=1
numList.append(num)
return numList

def select(support,N,listN,numList):#生成频繁k项集
cmp=support*N
listM=[]
for Item in range(len(numList)):
if numList[Item]>=cmp:
listM.append(listN[Item])
return listM

def listNCreation(listN):#生成k+1项集
listM=[]
length=len(listN[0])+1
for i in range(len(listN)):
for j in range(i+1,len(listN)):
if list(set(listN[i])|set(listN[j])) not in listM:
listM+=[list(set(listN[i])|set(listN[j]))]
for Item in listM:
if len(Item)!=length:
del listM[listM.index(Item)]
return listM

List=[[1,1,3,4],[2,2,3,5],[1,2,3,5,5,5,5],[2,2,2,2,2,5]]
#样例,输出为
#[[1], [3], [2], [5]]
#[[1, 3], [2, 3], [3, 5], [2, 5]]
#[[2, 3, 5]]
List=listSet(List)#生成有效的列表
N=len(List)#列表的总长度
listN=list1Creation(List)#生成1-项集

while len(listN)!=1 and len(listN)!=0:
numList=count(List,listN)#计算k-项集的支持度计数
listM=select(0.5,N,listN,numList)#生成频繁k-项集
listN=listM
listN=listNCreation(listN)#生成k+1-项集
print(listM)

本人初学,才识学浅,代码水平有限,还请各位大佬提出改进算法意见,降低代码的复杂度。

你可能感兴趣的:(初学萌新)