冰山立方体BUC算法(附测试集和完整代码)

目录:

算法思路

算法实现

算法运行结果

 

一、算法思路

设想的算法分为三部分:

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)

 

三、算法运行结果

冰山立方体BUC算法(附测试集和完整代码)_第1张图片

 

附:测试集和完整代码

测试集:创建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)

 

你可能感兴趣的:(数据科学)