算法思路
算法实现
算法运行结果
设想的算法分为三部分:
1、计算输入数据的维数、每个维的基数、每个维的取值个数以及每个维的取值。
2、设计一个函数,参数为一个列表,计算该列表在数据集中的支持度。
3、遍历将满足最小支持的数据筛选出来。
1、基本量的计算
# 每个维的基数
Cardinality = [0 for x in range(len(AllData[0]))] # [0, 0, 0, 0]
# 各个维的取值
AllValue = []
def ComDim():
# 计算每个维度的取值个数,存储在数组numOfN中。
for j in range(len(Cardinality)):
# 单个维度取值集合
SingleValue = []
for i in range(len(AllData)):
if (AllData[i][j] not in SingleValue):
SingleValue.append(AllData[i][j])
#print(SingleValue)
Cardinality[j] = len(SingleValue)
AllValue.append(SingleValue)
2、支持度计算
对于支持度计算,我想到将列表转换成集合,通过调用集合的set.issubset将问题转换成成判断是否是子集。
# 计算传入列表在数据集中出现的个数
def Count(list):
# 将数据集列表和传入列表均转换为set集合
# 判断list是否为AllData的子集,若是,计数加一
cou = 0
#AllDataSet = set(AllData)
#print(AllDataSet)
for data in AllData:
if set(list).issubset(set(data)):
cou = cou+1
#print("该传入列表的计数为:"+str(cou))
return cou
3、BUC
四个参数的含义分别为:
List:传入的列表,用于递归,刚开始传入一个空列表。
min_sup:最小支持度。
StartDim:开始维,从此维开始往后面的维遍历。
MaxDim:最大维,也就是传入数据的维数,在这里是4。
通过ComDim(),我们得到了每个维的各个取值。接下来,我们遍历每个维的每个取值,将它放入一个list中,将list传入Count()中得到其支持度,与最小支持度比较,若不小于最小支持度,则写入结果,并且将该改变后的list和StartDim传入BUC,开始递归。
fw = open("result.txt", "w")
def BUC(list, min_sup, StartDim, MaxDim):
# 对于每一维i
for i in range(StartDim,MaxDim):
# 对于i维的每一个取值j
for j in range(Cardinality[i]):
list.append(AllValue[i][j])
count = Count(list)
# print(list)
if(count>=min_sup):
# 写入文件
for i in range(len(list)-1):
fw.write(str(list[i])+',')
fw.write(str(list[-1]+'\t'+str(count)+"\n"))
print(str(list)+' '+str(count))
#fw.write(str(list)+'/t'+str(count))
StartDim = StartDim+1
BUC(list,3,StartDim,4)
else:
list.pop()
if(len(list)>=1):
list.pop()
ComDim()
BUC([],3,0,4)
测试集:创建test.csv文件,并把测试集放在该文件中。
a1,b1,c1,d1
a1,b1,c1,d2
a1,b1,c2,d1
a1,b1,c2,d2
a2,b1,c1,d2
a2,b2,c2,d2
a2,b3,c1,d2
a2,b4,c1,d1
a3,b3,c1,d1
a4,b4,c1,d2
运行结果:放入result.txt文件中。
# 全部数据
AllData = []
file = open(r"test.csv", 'r')
for line in file:
line = line.replace("\n", "")
AllData.append(line.split(","))
file.close()
# print(AllData)
# 读入文件结束
# 计算传入列表在数据集中出现的个数
def Count(list):
# 将数据集列表和传入列表均转换为set集合
# 判断list是否为AllData的子集,若是,计数加一
cou = 0
#AllDataSet = set(AllData)
#print(AllDataSet)
for data in AllData:
if set(list).issubset(set(data)):
cou = cou+1
#print("该传入列表的计数为:"+str(cou))
return cou
# 每个维的基数
Cardinality = [0 for x in range(len(AllData[0]))] # [0, 0, 0, 0]
# 各个维的取值
AllValue = []
def ComDim():
# 计算每个维度的取值个数,存储在数组numOfN中。
for j in range(len(Cardinality)):
# 单个维度取值集合
SingleValue = []
for i in range(len(AllData)):
if (AllData[i][j] not in SingleValue):
SingleValue.append(AllData[i][j])
#print(SingleValue)
Cardinality[j] = len(SingleValue)
AllValue.append(SingleValue)
# print(Cardinality)
# print(AllValue)
fw = open("result.txt", "w")
def BUC(list, min_sup, StartDim, MaxDim):
# 对于每一维i
for i in range(StartDim,MaxDim):
# 对于i维的每一个取值j
for j in range(Cardinality[i]):
list.append(AllValue[i][j])
count = Count(list)
# print(list)
if(count>=min_sup):
for i in range(len(list)-1):
fw.write(str(list[i])+',')
fw.write(str(list[-1]+'\t'+str(count)+"\n"))
print(str(list)+' '+str(count))
#fw.write(str(list)+'/t'+str(count))
StartDim = StartDim+1
BUC(list,3,StartDim,4)
else:
list.pop()
if(len(list)>=1):
list.pop()
ComDim()
BUC([],3,0,4)