20191202_Apriori算法和FP-Growth算法python实现
这个是要求,说实话GUI做起来太难受了,要是随便做下还可以,但是要是非常细节,那就是折磨人的,这个实现了Apriori算法和FP-Growth算法,说实话,我确实不会,都是百度的,再修改嘛。
from tkinter import *
import fp_growth_py3 as fpg
import tkinter.filedialog
# 获取关联规则的封装函数
from numpy import *
import pandas as pd
def run1():
#参考网站https://blog.csdn.net/qq_36523839/article/details/82191677
# 构造数据def loadDataSet():return [['啤酒', '牛奶', '可乐'],['尿不湿', '啤酒', '牛奶', '橙汁'],['啤酒', '尿不湿'],['啤酒', '可乐', '尿不湿'],['啤酒', '牛奶', '可乐']
]
# a=[]
# raw = pd.read_excel('1.xlsx')
# # print(list(raw['购买商品']))
# return [raw['购买商品']]
# # a.append([int(b) for b in i.split(',')])
# # return a# 将所有元素转换为frozenset型字典,存放到列表中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)) # frozenset一种不可变的集合,set可变集合# 过滤掉不符合支持度的集合# 返回 频繁项集列表retList 所有元素的支持度字典def scanD(D, Ck, minSupport):ssCnt = {}for tid in D:for can in Ck:if can.issubset(tid): # 判断can是否是tid的《子集》 (这里使用子集的方式来判断两者的关系)if can not in ssCnt: # 统计该值在整个记录中满足子集的次数(以字典的形式记录,frozenset为键)ssCnt[can] = 1else:ssCnt[can] += 1numItems = float(len(D))retList = [] # 重新记录满足条件的数据值(即支持度大于阈值的数据)supportData = {} # 每个数据值的支持度for key in ssCnt:support = ssCnt[key] / numItemsif support >= minSupport:retList.insert(0, key)supportData[key] = supportreturn retList, supportData # 排除不符合支持度元素后的元素 每个元素支持度# 生成所有可以组合的集合# 频繁项集列表Lk 项集元素个数k [frozenset({2, 3}), frozenset({3, 5})] -> [frozenset({2, 3, 5})]def aprioriGen(Lk, k):retList = []lenLk = len(Lk)for i in range(lenLk): # 两层循环比较Lk中的每个元素与其它元素for j in range(i+1, lenLk):L1 = list(Lk[i])[:k-2] # 将集合转为list后取值L2 = list(Lk[j])[:k-2]L1.sort(); L2.sort() # 这里说明一下:该函数每次比较两个list的前k-2个元素,如果相同则求并集得到k个元素的集合if L1==L2:retList.append(Lk[i] | Lk[j]) # 求并集return retList # 返回频繁项集列表Ck# 封装所有步骤的函数# 返回 所有满足大于阈值的组合 集合支持度列表def apriori(dataSet, minSupport = 0.5):D = list(map(set, dataSet)) # 转换列表记录为字典 [{1, 3, 4}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}]C1 = createC1(dataSet) # 将每个元素转会为frozenset字典 [frozenset({1}), frozenset({2}), frozenset({3}), frozenset({4}), frozenset({5})]L1, supportData = scanD(D, C1, minSupport) # 过滤数据L = [L1]k = 2while (len(L[k-2]) > 0): # 若仍有满足支持度的集合则继续做关联分析Ck = aprioriGen(L[k-2], k) # Ck候选频繁项集Lk, supK = scanD(D, Ck, minSupport) # Lk频繁项集supportData.update(supK) # 更新字典(把新出现的集合:支持度加入到supportData中)L.append(Lk)k += 1 # 每次新组合的元素都只增加了一个,所以k也+1(k表示元素个数)return L, supportData# dataSet = loadDataSet(a)# L,suppData = apriori(dataSet)# print(L)# print(suppData)def generateRules(L, supportData, minConf=0.7): # supportData 是一个字典bigRuleList = []for i in range(1, len(L)): # 从为2个元素的集合开始for freqSet in L[i]:# 只包含单个元素的集合列表H1 = [frozenset([item]) for item in freqSet] # frozenset({2, 3}) 转换为 [frozenset({2}), frozenset({3})]# 如果集合元素大于2个,则需要处理才能获得规则if (i > 1):rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf) # 集合元素 集合拆分后的列表 。。。else:calcConf(freqSet, H1, supportData, bigRuleList, minConf)return bigRuleList# 对规则进行评估 获得满足最小可信度的关联规则def calcConf(freqSet, H, supportData, brl, minConf=0.7):prunedH = [] # 创建一个新的列表去返回for conseq in H:conf = supportData[freqSet]/supportData[freqSet-conseq] # 计算置信度if conf >= minConf:print(freqSet-conseq,'-->',conseq,'conf:',conf)brl.append((freqSet-conseq, conseq, conf))prunedH.append(conseq)return prunedH# 生成候选规则集合def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):m = len(H[0])if (len(freqSet) > (m + 1)): # 尝试进一步合并Hmp1 = aprioriGen(H, m+1) # 将单个集合元素两两合并Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)if (len(Hmp1) > 1): #need at least two sets to mergerulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)a = float(inp1.get())b = float(inp2.get())dataSet = loadDataSet()print(dataSet)L,suppData = apriori(dataSet,minSupport=a)rules = generateRules(L,suppData,minConf=b)print(rules)L=str(L).replace('frozenset','')rules=str(rules).replace('frozenset','')result='频繁项集:'+str(L)+ '\n'+'强关联规则:'+str(rules)
# print(result)txt.insert(END,result) # 追加显示运算结果inp1.delete(0, END) # 清空输入inp2.delete(0, END) # 清空输入
a=[]
def xz():filename=tkinter.filedialog.askopenfilename()if filename != '':lb4.config(text='您选择的文件是'+filename)raw = pd.read_excel(filename)txt2.insert(END,raw)print(list(raw['购买商品']))for i in raw['购买商品']:a.append([int(b) for b in i.split(',')])else:lb4.config(text='您没有选择任何文件')
# def run2(x, y):
# a = float(x)
# b = float(y)
# s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
# txt.insert(END, s) # 追加显示运算结果
# inp1.delete(0, END) # 清空输入
# inp2.delete(0, END) # 清空输入
def cut():pass
def cop():def xz2():filename=tkinter.filedialog.askopenfilename()if filename != '':lb42.config(text='您选择的文件是'+filename)raw = pd.read_excel(filename)txt22.insert(END,raw)else:lb42.config(text='您没有选择任何文件')def run2():a = float(inp12.get())dataset = [['啤酒', '牛奶', '可乐'],['尿不湿', '啤酒', '牛奶', '橙汁'],['啤酒', '尿不湿'],['啤酒', '可乐', '尿不湿'],['啤酒', '牛奶', '可乐']]frequent_itemsets = fpg.find_frequent_itemsets(dataset, minimum_support=a, include_support=True)print(type(frequent_itemsets)) # print typeresult = []for itemset, support in frequent_itemsets: # 将generator结果存入listresult.append((itemset, support))result = sorted(result, key=lambda i: i[0]) # 排序后输出for itemset, support in result:print(str(itemset) + ' ' + str(support))txt2.insert(END,str(itemset) + ' ' + str(support))root2 = Tk()root2.geometry('800x700')root2.title('关联规则挖掘系统')lb12 = Label(root2, text='请以此输入最小支持度数')lb12.place(relx=0.4, rely=0.1, relwidth=0.8, relheight=0.1)lb22 = Label(root2, text='最小支持度')lb22.place(relx=0.35, rely=0.2)inp12 = Entry(root2)inp12.place(relx=0.45, rely=0.2,relwidth=0.15, relheight=0.05)lb42 = Label(root2,text='')lb42.place(relx=0.1, rely=0.05)btn22=Button(root2,text='弹出文件选择对话框',command=xz2)btn22.place(relx=0.1, rely=0.2)# 方法-直接调用 run1()btn12 = Button(root2, text='开始计算', command=run2)btn12.place(relx=0.85, rely=0.2, relwidth=0.12, relheight=0.05)# # 方法二利用 lambda 传参数调用run2()# btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))# btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框txt2 = Text(root2)txt2.place(relx=0.4,rely=0.3, relheight=0.6,relwidth=0.5)txt22 =Text(root2)txt22.place(relx=0.05,rely=0.3, relheight=0.6,relwidth=0.3)
# mainmenu = Menu(root2)
# menuEdit = Menu(mainmenu) # 菜单分组 menuEdit
# mainmenu.add_cascade(label="算法",menu=menuEdit)
# menuEdit.add_command(label="Apriori",command=cut)
# menuEdit.add_command(label="FP-Growth",command=cop)root2.config(menu=mainmenu)root2.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件root.mainloop()
root = Tk()
root.geometry('800x700')
root.title('关联规则挖掘系统')
lb1 = Label(root, text='请以此输入最小支持度数和最小置信度参数值')
lb1.place(relx=0.4, rely=0.1, relwidth=0.8, relheight=0.1)
lb2 = Label(root, text='最小支持度')
lb2.place(relx=0.35, rely=0.2)
lb3 = Label(root, text='最小置信度参数')
lb3.place(relx=0.61, rely=0.2)
inp1 = Entry(root)
inp1.place(relx=0.45, rely=0.2,relwidth=0.15, relheight=0.05)
inp2 = Entry(root)
inp2.place(relx=0.72, rely=0.2,relwidth=0.15, relheight=0.05)
lb4 = Label(root,text='')
lb4.place(relx=0.1, rely=0.05)
btn2=Button(root,text='弹出文件选择对话框',command=xz)
btn2.place(relx=0.1, rely=0.2)
# 方法-直接调用 run1()
btn1 = Button(root, text='开始计算', command=run1)
btn1.place(relx=0.85, rely=0.2, relwidth=0.12, relheight=0.05)
# # 方法二利用 lambda 传参数调用run2()
# btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
# btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
txt = Text(root)
txt.place(relx=0.4,rely=0.3, relheight=0.6,relwidth=0.5)
txt2 = Text(root)
txt2.place(relx=0.05,rely=0.3, relheight=0.6,relwidth=0.3)
mainmenu = Menu(root)
menuEdit = Menu(mainmenu) # 菜单分组 menuEdit
mainmenu.add_cascade(label="算法",menu=menuEdit)
# menuEdit.add_command(label="Apriori",command=cut)
menuEdit.add_command(label="FP-Growth",command=cop)
root.config(menu=mainmenu)
# root.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件
root.mainloop()print(a)
# [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
Exception in Tkinter callback
Traceback (most recent call last):File "D:\sofewore\anaconda\lib\tkinter\__init__.py", line 1702, in __call__return self.func(*args)File "<ipython-input-3-1c37387ddf40>", line 308, in coproot2.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件
NameError: name 'popupmenu' is not defined<class 'generator'>
['可乐'] 3
['可乐', '尿不湿'] 1
['啤酒'] 5
['啤酒', '可乐'] 3
['啤酒', '可乐', '尿不湿'] 1
['啤酒', '尿不湿'] 3
['啤酒', '尿不湿', '橙汁'] 1
['啤酒', '尿不湿', '牛奶'] 1
['啤酒', '尿不湿', '牛奶', '橙汁'] 1
['啤酒', '橙汁'] 1
['啤酒', '牛奶'] 3
['啤酒', '牛奶', '可乐'] 2
['啤酒', '牛奶', '橙汁'] 1
['尿不湿'] 3
['尿不湿', '橙汁'] 1
['尿不湿', '牛奶'] 1
['尿不湿', '牛奶', '橙汁'] 1
['橙汁'] 1
['牛奶'] 3
['牛奶', '可乐'] 2
['牛奶', '橙汁'] 1
[]
20191202_Apriori算法和FP-Growth算法python实现相关推荐
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...
- WordCount作业提交到FileInputFormat类中split切分算法和host选择算法过程源码分析
参考 FileInputFormat类中split切分算法和host选择算法介绍 以及 Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputForm ...
- Frequent Pattern 挖掘之二(FP Growth算法)(转)
FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...
- MapReduce框架下的FP Growth算法概述
转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebi.html 前面的博客分析了关联分析中非常重要的一个算法-FP Growth.该算法根据数据库在内 ...
- FP Growth算法
转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法 ...
- MapReduce框架下的FP Growth算法详解
转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebk.html Sharding 这一步没什么好讲的,将数据库分成连续的大小相等的几个块,放置在不同的 ...
- KNN算法和Kernel KNN算法的区别
KNN算法和Kernel KNN算法的区别 KNN算法 KNN(K-Nearest Neighbor,简称KNN)算法,是一种常用的监督学习方法,其工作机制为:给定测试样本,基于某种距离度量找出训练集 ...
- FP Growth算法详解
看了n多资料,就这篇说的比较详细,适合初学者 FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对 ...
- 贪心算法和01背包算法
贪心算法和01背包算法 实验报告 1.问题 2.解析 3.设计 4.分析 5.源码 实验报告 课程名称 <算法分析与设计> 实验名称 贪心算法和01背包算法 1.问题 [描述算法问题,首选 ...
- 并行sgd算法和min-batch gd算法
sgd算法全称随机梯度下降法,有着比批梯度下降法更快收敛的优势,该算法名称中的"随机"二字是改算法的中心精神所在. sgd算法是一种天生的串行的算法,当数据量大的时候们希望通过使用 ...
最新文章
- 巧用CSS的 Mask 滤镜
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义调色板填充色、dark2、灰度比例)实战
- jni返回byte[]
- ML之回归预测:利用九大类机器学习算法对无人驾驶系统参数(2018年的data,18+2)进行回归预测+评估九种模型性能
- [渝粤教育] 郑州升达经贸管理学院 大学英语混合式课程 参考 资料
- C/S架构网络聊天软件——Java Chat Application 用java做一个聊天机器人
- 第三届“信息论与编码”中大论坛诚邀您的参加
- 有限数字生成素数 (10 分)
- [Python] L1-012. 计算指数-PAT团体程序设计天梯赛GPLT
- 计算机的使用知识,计算机基础知识计算机的使用方法
- APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
- python模块——pytz
- JAVA流的使用(复制文件效率对比)初学者
- 《系统与网络管理实践》(第三版)作者访谈
- 如何把excel表格的数据导入到MATLAB中去
- AI时代,与其恐惧,不如拥抱。
- 全面深改直面民生“硬骨头” 这些领域获得感满满
- [再寄小读者之数学篇](2014-11-02 Herglotz' trick)
- The 2022 ICPC Asia Hangzhou Regional Programming Contest
- 新闻速递|伦敦帝国理工学院大刀阔斧改革科研成果转化机制