多的不想说,直接放代码
import pandas as pd
import numpy as np
apdata = np.array(pd.read_table('apriori.txt', delimiter=',', dtype=int))
# print(apdata)
# print(apdata.loc[1]['A'])
# print(apdata.shape[1])
Label =pd.read_table('apriori.txt', delimiter=',', dtype=int).columns
# 得到所有项
# 输入【columns】
# 输出【item】
def getitem(label):
item = []
for i in range(len(label)):
item.append(list(label[i]))
return item
# print(getitem(Label))
Item = [['A'], ['B'], ['C'], ['D'], ['E']]
# print(label)
# 获取所有项
# def getdata(data):
# # list = []
# # for i in range(len(data)):
# # for j in range(len(data[i])):
# # list.append(data[i][j])
# # return set(list)
# # print(getdata(apdata))
# 返回事务
# 参数【数据, 标签】
# 返回【事务】
def getthing(data, lable):
data2 = []
for i in range(len(data)):
data1 = []
for j in range(len(data[i])):
if data[i][j] == 1:
data1.append(lable[j])
data2.append(data1)
return np.array(data2)
# print(getthing(apdata, Label))
# print(len(getone(apdata, ['A', 'B', 'C', 'D', 'E'])))
# 获取项集支持度计数
# 参数【项集 , 数据, 标签】
# 返回【项集, 支持度计数字典】
def getcounts(item, data, label):
thing = getthing(data, label)
countitems = []
for i in range(len(item)):
count = 0
for j in range(len(thing)):
if [True for c in item[i] if c not in thing[j]]: #如果元素在item中不再thing中说明thing不包括item数组就不为空
count = count
else:
count += 1
countitems.append(count)
dic = list(zip(item, countitems)) #得到项集与支持度的zip
return dic
# print(getcounts(Item, apdata, Label))
# print(list(list(zip(*getcounts(Item, apdata, Label)))[0]))
# 剪枝
# 参数【项集, 支持度,数据, 标签】
def getnewItem(item, support, data, label):
dic = getcounts(item, data, label)
newdic = []
for i in range(len(item)):
if dic[i][1] >= support:
newdic.append(dic[i])
print(newdic)
return newdic
# 连接步
# 参数【项集, 数据, 标签】
# 输出【新的项集及支持度】
def connect(item, data, label):
newitem = []
k = 0
for i in range(len(item)):
k += 1
for j in range(len(item)-k):
if len(item[i]) >= 2:
if item[i][0:-1] == item[j+k][0:-1]: #连接步的前提是第一项到倒数第二项要相同
item1 = sorted(list(set(item[i]+item[j+k])))
newitem.append(item1)
else:
item1 = sorted(list(set(item[i]+item[j+k])))
newitem.append(item1)
return getcounts(newitem, data, label)
# print(connect(Item, apdata, Label))
# newdata = list(list(zip(*connect(Item, apdata, Label)))[0])
# print(newdata)
# newdata2 = list(list(zip(*getnewItem(newdata, 2, apdata, Label)))[0])
# print(newdata2)
# print(connect(newdata2, apdata, Label))
# 运行函数
# 参数【项集,数据,标签,支持度,迭代次数】
# 输出迭代结果 返回【结果列表】
def run(item, data, label, support, m, itemlist):
# getcounts(item, data, label) #得到项集及支持度
m += 1
print('第', m, '次迭代频繁项集为:')
countitem = getnewItem(item, support, data, label)
itemlist.append(countitem)
if len(countitem) == 0:
print('迭代结束')
else:
newitem = list(list(zip(*countitem))[0]) #得到剪枝后的项集 zip(*)表示解压缩
if len(newitem) >= 2:
newcountitem = list(list(zip(*connect(newitem, data, label)))[0]) #连接步
run(newcountitem, data, label, support, m, itemlist)
return itemlist
# print(run(Item, apdata, Label, 2, 0, itemlist=[]))
# 关联规则的产生
# run[a][b][c] 第a次迭代第b个频繁项 【c为0或者1 为项集标签和项集支持度】
# 得到频繁项集的置信度
# 输入 【项集, 数据, 标签, 支持度迭代次数从0开始, 空的频繁项集】
# 输出 【置信度】
def confidence(item, data, label, support, m, itemlist):
list1 = run(item, data, label, support, m, itemlist)
# 得出频繁项集set
for i in range(len(list1[-2])):
itemlist = list1[-2][i][0]
for j in range(len(itemlist)):
count1 = 0
count2 = 0
count3 = 0
for h in range(data.shape[1]): #列
for g in range(data.shape[0]): #行
if itemlist[j] == Item[h][0]:
if data[g][h] == 1:
count1 += 1
itemlist2 = itemlist[0:j]+itemlist[j+1:]
for t in range(len(getthing(data, label))):
if [True for c in itemlist2 if c not in getthing(data, label)[t]]:
count2 = count2
else:
count2 += 1
if [True for c in itemlist if c not in getthing(data, label)[t]]:
count3 = count3
else:
count3 += 1
print(count1, count2, count3)
print(itemlist[j], '->', itemlist[0:j]+itemlist[j+1:], '=', (count3/count1))
print(itemlist[0:j]+itemlist[j+1:], '->', itemlist[j], '=', (count3/count2))
confidence(Item, apdata, Label, 2, 0, [])
没了!