apriori算法python实现
源于一次课程实验,下面的代码只是负责给出频繁模式,没有进行关联规则提取
# -*- coding: utf-8 -*-
"""
@Time : 2022/10/30 11:46
@Author : ZORO
@File : Apriori_byself.py
@Description : apriori算法实现,最后得出频繁模式
"""
import numpy as np
from itertools import combinations
minsup = 3/14
f = open("事务数据.txt",'r',encoding='utf-8')
text = f.read()
textlines = text.splitlines()
c1 = []
c2 = []
for line in textlines:
for word in line.split(' '):
if word not in c1:
c1.append(word)
c2.extend(list(map(lambda x:{x},c1)))
def throw_away(set1,set2): #在set2中剔除子集包含set1中元素的元素
for subset1 in set1:
for subset2 in set2:
if subset1.issubset(subset2):
set2.remove(subset2)
def cal_sup(can): #计算支持度
sup_n = 0
for line in textlines:
num = 0
for sub_can in can:
if sub_can in line:
num +=1
if num == len(can):
sup_n += 1
return sup_n/len(textlines)
def union_tuple(tuple): #将元组中包含的所有集合合成并集
result = {''}
for sub in tuple:
result.update(sub)
result.discard('')
return result
def combine(can_set): #对can_set候选集中的所有事务两两排列组合
new_set = []
com_list = []
com_list.extend(list(combinations(can_set, 2)))
for s in com_list:
s = union_tuple(s)
if len(s) == k+2: #防止出现大于k的频繁模式
new_set.append(s)
return new_set
k = 0
mode = []
mode.append(c2)
while(1):
infre_set = [] #定义非频繁模式空列表
for cell in mode[k]: #遍历候选k模式中的每一条事务
support = cal_sup(cell) #计算事务支持度
if support < minsup: #如果支持度小于最小支持度,则将其添加至非频繁模式,同时在原来的候选模式中删掉
# infre_set.extend(list(map(lambda x:{x},cell))) #添加
infre_set.append(cell)
for cell in infre_set:
mode[k].remove(cell) #删掉
tempnew = []
tempnew.extend(combine(mode[k])) #将频繁模式重新组合,生成候选k+1模式
throw_away(infre_set, tempnew) #剔除包含非频繁模式的候选k+1模式
if (len(tempnew) == 0): #如果候选k+1模式为空集
print('k=',k+1)
print('频繁模式为:',mode[k]) #打印频繁模式
break #跳出循环
else: #否则
mode.append(tempnew) #将候选k+1模式添加进模式列表中
k = k + 1 #k+1进入下一次循环
事务数据可以是文本数据,希望有所帮助。