python3Apriori的GUI实现

    xiaoxiao2023-10-15  142

    python3 Apriori的GUI实现

    Apriori简介

    !未能实现txt文件的导入

    代码如下:

    # -*- coding: utf-8 -*- import numpy as np import tkinter from tkinter import scrolledtext def loadDataSet(): dataset = [['鱼', '熟食', '水果'], ['水果', '净菜', '鱼'], ['家禽', '水果', '油', '调味料', '净菜'], ['家禽', '熟食', '油', '净菜'], ['家禽', '水果', '蔬菜', '调味料'], ['熟食', '鱼', '蔬菜', '油'], ['熟食', '蔬菜', '调味料'], ['油', '蔬菜', '调味料', '净菜'], ['蔬菜', '水果', '净菜', '鱼'], ['水果', '调味料', '油', '鱼', '净菜'], ['家禽', '净菜', '油', '调味料', '水果'], ['熟食', '水果', '蔬菜']] return dataset def createC1(dataSet): C1 = [] for transaction in dataSet: for item in transaction: if not [item] in C1: C1.append([item]) C1.sort() # 映射为frozenset唯一性的,可使用其构造字典 return list(map(frozenset, C1)) # 从候选K项集到频繁K项集(支持度计算) def scanD(D, Ck, minSupport): ssCnt = {} for tid in D: for can in Ck: if can.issubset(tid): if not can in ssCnt: ssCnt[can] = 1 else: ssCnt[can] += 1 numItems = float(len(D)) retList = [] supportData = {} for key in ssCnt: support = ssCnt[key] / numItems if support >= minSupport: retList.insert(0, key) supportData[key] = support return retList, supportData def calSupport(D, Ck, min_support): dict_sup = {} for i in D: for j in Ck: if j.issubset(i): if not j in dict_sup: dict_sup[j] = 1 else: dict_sup[j] += 1 sumCount = float(len(D)) supportData = {} relist = [] for i in dict_sup: temp_sup = dict_sup[i] / sumCount if temp_sup >= min_support: relist.append(i) supportData[i] = temp_sup # 此处可设置返回全部的支持度数据(或者频繁项集的支持度数据) return relist, supportData # 改进剪枝算法 def aprioriGen(Lk, k): # 创建候选K项集 LK为频繁K项集 retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i + 1, lenLk): L1 = list(Lk[i])[:k - 2] L2 = list(Lk[j])[:k - 2] L1.sort() L2.sort() if L1 == L2: # 前k-1项相等,则可相乘,这样可防止重复项出现 # 进行剪枝(a1为k项集中的一个元素,b为它的所有k-1项子集) a = Lk[i] | Lk[j] # a为frozenset()集合 a1 = list(a) b = [] # 遍历取出每一个元素,转换为set,依次从a1中剔除该元素,并加入到b中 for q in range(len(a1)): t = [a1[q]] tt = frozenset(set(a1) - set(t)) b.append(tt) t = 0 for w in b: # 当b(即所有k-1项子集)都是Lk(频繁的)的子集,则保留,否则删除。 if w in Lk: t += 1 if t == len(b): retList.append(b[0] | b[1]) return retList def apriori(dataSet, minSupport=0.2): C1 = createC1(dataSet) D = list(map(set, dataSet)) # 使用list()转换为列表 L1, supportData = calSupport(D, C1, minSupport) L = [L1] # 加列表框,使得1项集为一个单独元素 k = 2 while (len(L[k - 2]) > 0): Ck = aprioriGen(L[k - 2], k) Lk, supK = scanD(D, Ck, minSupport) # scan DB to get Lk supportData.update(supK) L.append(Lk) # L最后一个值为空集 k += 1 del L[-1] # 删除最后一个空集 return L, supportData # L为频繁项集,为一个列表,123项集分别为一个元素。 # 生成集合的所有子集 def getSubset(fromList, toList): for i in range(len(fromList)): t = [fromList[i]] tt = frozenset(set(fromList) - set(t)) if not tt in toList: toList.append(tt) tt = list(tt) if len(tt) > 1: getSubset(tt, toList) def calcConf(freqSet, H, supportData, ruleList, minConf=0.7): for conseq in H: conf = supportData[freqSet] / supportData[freqSet - conseq] # 计算置信度 if conf >= minConf: ruleList.append((freqSet - conseq, conseq, conf)) # 生成规则 def gen_rule(L, supportData, minConf=0.7): bigRuleList = [] for i in range(1, len(L)): # 从二项集开始计算 for freqSet in L[i]: # freqSet为所有的k项集 # 求该三项集的所有非空子集,1项集,2项集,直到k-1项集,用H1表示,为list类型,里面为frozenset类型, H1 = list(freqSet) all_subset = [] getSubset(H1, all_subset) # 生成所有的子集 calcConf(freqSet, all_subset, supportData, bigRuleList, minConf) return bigRuleList class aprioriGUI(tkinter.Frame): def __init__(self, master=None): tkinter.Frame.__init__(self, master) self.grid() self.createWidgets() # 调用对象方法,创建子组件 def createWidgets(self): self.runbtn0 = tkinter.Button(self, text="运行Apriori算法", command=self.run) self.runbtn0.grid(row=0, column=0) self.runbtn1 = tkinter.Button(self, text="运行Apriori算法", command=self.run) self.runbtn1.grid(row=0, column=1) self.runbtn2 = tkinter.Button(self, text="运行Apriori算法", command=self.run) self.runbtn2.grid(row=0, column=2) fm1 =tkinter.Frame() fm1.grid(row=1) self.show = scrolledtext.ScrolledText(fm1, width=80, height=30) self.show.grid(row=1) def run(self): dataSet = loadDataSet() L, supportData = apriori(dataSet, minSupport=0.2) rule = gen_rule(L, supportData, minConf=0.7) for line in rule: r = str(line[0]) + '-->' + str(line[1]) + '置信度:' + str(line[2]) + '\n' self.show.insert(tkinter.INSERT, r) root = tkinter.Tk() root.title('数据挖掘算法实现') root.geometry('600x500+250+150') app = aprioriGUI(root) root.mainloop()

    增添了文件读取功能

    def loadDataSet(): dataset = [] with open('dataset.txt') as read_line: for line in read_line: curLine = line.strip('\n').split(" ") strLine = list(map(str, curLine)) dataset.append(strLine) return dataset

    GUI的实现修改如下:

    # GUI的实现 class aprioriGUI(tkinter.Frame): def __init__(self, master=None): tkinter.Frame.__init__(self, master) self.grid() self.createWidgets() # 调用对象方法,创建子组件 self.dataset = [] def createWidgets(self): self.path = tkinter.Entry(self) self.path.grid(row=0, column=0) self.inputbtn = tkinter.Button(self, text="导入文件", command=self.input) self.inputbtn.grid(row=0, column=2) fm1 = tkinter.Frame() fm1.grid(row=2) self.show = scrolledtext.ScrolledText(fm1, width=80, height=30) self.show.grid(row=2) def run(self): L, supportData = apriori(self.dataset, minSupport=0.2) rule = gen_rule(L, supportData, minConf=0.8) for line in rule: r = str(line[0]) + '-->' + str(line[1]) + '置信度:' + str(line[2]) + '\n' self.show.insert(tkinter.INSERT, r) def input(self): file = self.path.get() with open(file) as read_line: for line in read_line: curLine = line.strip('\n').split(" ") strLine = list(map(str, curLine)) self.dataset.append(strLine) return self.dataset
    最新回复(0)