Apriori算法python实现(可调节支持度与置信度)

  • 前言
  • 完整代码

前言

看到网上的Apriori算法代码大多都没有添加置信度进行筛选,因此我自己写了一个


完整代码

import itertoolsdef item(dataset):      #求第一次扫描数据库后的 候选集,(它没法加入循环)c1 = []     #存放候选集元素for x in dataset:       #就是求这个数据库中出现了几个元素,然后返回for y in x:if [y] not in c1:c1.append( [y] )c1.sort()#print(c1)return c1def get_frequent_item(dataset, c, min_support):cut_branch = {}     #用来存放所有项集的支持度的字典for x in c:for y in dataset:if set(x).issubset(set(y)):     #如果 x 不在 y中,就把对应元素后面加 1cut_branch[tuple(x)] = cut_branch.get(tuple(x), 0) + 1     #cut_branch[y] = new_cand.get(y, 0)表示如果字典里面没有想要的关键词,就返回0#print(cut_branch)Fk = []       #支持度大于最小支持度的项集,  即频繁项集sup_dataK = {}  #用来存放所有 频繁 项集的支持度的字典for i in cut_branch:if cut_branch[i] >= min_support:    #Apriori定律1  小于支持度,则就将它舍去,它的超集必然不是频繁项集Fk.append( list(i))sup_dataK[i] = cut_branch[i]#print(Fk)return Fk, sup_dataKdef get_candidate(Fk, K):       #求第k次候选集ck = []    #存放产生候选集for i in range(len(Fk)):for j in range(i+1, len(Fk)):L1 = list(Fk[i])[:K-2]L2 = list(Fk[j])[:K-2]L1.sort()L2.sort() #先排序,在进行组合if L1 == L2:if K > 2:       #第二次求候选集,不需要进行减枝,因为第一次候选集都是单元素,且已经减枝了,组合为双元素肯定不会出现不满足支持度的元素new = list(set(Fk[i]) ^ set(Fk[j]) ) #集合运算 对称差集 ^ (含义,集合的元素在t或s中,但不会同时出现在二者中)#new表示,这两个记录中,不同的元素集合# 为什么要用new? 比如 1,2     1,3  两个合并成 1,2,3   我们知道1,2 和 1,3 一定是频繁项集,但 2,3呢,我们要判断2,3是否为频繁项集#Apriori定律1 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集else:new = set()for x in Fk:if set(new).issubset(set(x)) and list(set(Fk[i]) | set(Fk[j])) not in ck:  #减枝 new是 x 的子集,并且 还没有加入 ck 中ck.append( list(set(Fk[i]) | set(Fk[j])) )#print(ck)return ckdef Apriori(dataset, min_support = 2):c1 = item (dataset) #返回一个二维列表,里面的每一个一维列表,都是第一次候选集的元素f1, sup_1 = get_frequent_item(dataset, c1, min_support)       #求第一次候选集F = [f1]      #将第一次候选集产生的频繁项集放入 F ,以后每次扫描产生的所有频繁项集都放入里面sup_data = sup_1       #一个字典,里面存放所有产生的候选集,及其支持度K = 2 #从第二个开始循环求解,先求候选集,在求频繁项集while (len(F[K-2]) > 1):  #k-2是因为F是从0开始数的     #前一个的频繁项集个数在2个或2个以上,才继续循环,否则退出ck = get_candidate(F[K-2], K)  #求第k次候选集fk, sup_k = get_frequent_item(dataset, ck, min_support)     #求第k次频繁项集F.append(fk)    #把新产生的候选集假如Fsup_data.update(sup_k)  #字典更新,加入新得出的数据K+=1return F, sup_data    #返回所有频繁项集, 以及存放频繁项集支持度的字典def generate_association_rules(patterns, confidence_threshold):"""Given a set of frequent itemsets, return a dictof association rules in the form{(left): ((right), confidence)}"""rules = []for itemset in patterns.keys():upper_support = patterns[itemset]for i in range(1, len(itemset)):for antecedent in itertools.combinations(itemset, i):antecedent = tuple(sorted(antecedent))consequent = tuple(sorted(set(itemset) - set(antecedent)))if antecedent in patterns:lower_support = patterns[antecedent]confidence = float(upper_support) / lower_supportif confidence >= confidence_threshold:rules.append([antecedent,consequent, confidence])return rulesdef printPatterns(patterns):keys1 = list(patterns.keys())values1 = list(patterns.values())for i in range(len(keys1)):keys1[i]=list(keys1[i])for i in range(len(keys1)):for j in range(len(keys1[i])):print(keys1[i][j],end=" ")for i2 in range(10-2*len(keys1[i])):print(" ",end="")print(" : ",end="")print(values1[i],end="\n")def printRules2(rlues):keys1=[]values1=[]for i in range(len(rules)):keys1.append(list(rules[i][0]))values1.append(list(rules[i][1]))for i in range(len(keys1)):for j in range(len(keys1[i])):print(keys1[i][j],end=" ")for i2 in range(10-2*len(keys1[i])):print(" ",end="")print(" --> ",end="")for i1 in range(len(values1[i])):print(values1[i][i1],end=" ")for i3 in range(10-2*len(values1[i])):print(" ",end="")print(":  "+str(rules[i][2]),end="\n")if __name__ == '__main__':dataset = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]       #装入数据 二维列表F, sup_data = Apriori(dataset, min_support = 2)   #最小支持度设置为2rules = generate_association_rules(sup_data, 0.6)  # 置信度(条件概率)删选print("各频繁集及其出现次数如下",end="\n")printPatterns(sup_data)print('---------------------------------')print("各强关联规则及其置信度如下",end="\n")printRules2(rules)

参考文章

Apriori算法python实现(可调节支持度与置信度)相关推荐

  1. python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度

    Apriori算法的简介 Apriori算法:使用候选项集找频繁项集 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法.其核心是基于两阶段频集思想的递推算法.该关联规则在分类上属于单维 ...

  2. 支持度、置信度、提升度、apriori算法理解(简易版)

    关于支持度.置信度.提升度以及apriori算法的理解(简单版) 理解支持度 所谓支持度,就是比如说10个用户购买商品,有8个用户购买商品A,那么商品A的支持度就是80%.支持度越大,关联规则越重要, ...

  3. 机器学习之关联规则(支持度和置信度、Apriori算法)

    关联规则及其基础: 表1:购物篮例子的分析 关联分析:用于发现隐藏在大型数据集中的有意义的联系.所发现的联系可以用关联规则或频繁项集的形式表示. 例如,从表1中可以提取出:{尿布} ⟹ {啤酒}(该规 ...

  4. Apriori算法+python实现

    文章目录 一.相关概念 二.Apriori算法 三.Apriori算法示例: 四.代码实现: 参考链接:apriori算法 python实现 一.相关概念 支持度:support(A =>B) ...

  5. 【机器学习】关联规则挖掘算法 + 三大案例实战 + Apriori算法 + Python代码实现

    文章目录 一.关联规则概述 1.1 关联规则引入 1.2 关联规则相关概念介绍 1.2.1 样本.事务.项集.规则 1.2.2 支持度.置信度 1.2.3 提升度 1.2.4 所有指标的公式 二.Py ...

  6. Apriori算法python实现(数据挖掘学习笔记)

    目录 1.算法伪代码 2.算法代码 3.测试数据 4.结果 1.算法伪代码 输入:事务数据库D:最小支持度阈值. 输出:D中的频繁项集L. 方法:  L1 = find_frequent_1_item ...

  7. 大白话解析Apriori算法python实现(含源代码详解)

    大白话解析Apriori算法python实现(含源代码详解) 一.专业名词解释 二.算法思路 三.python代码实现 四.Aprioir的优点.缺点及改进方法 本文为博主原创文章,转载请注明出处,并 ...

  8. apriori算法python实现

    apriori算法python实现 源于一次课程实验,下面的代码只是负责给出频繁模式,没有进行关联规则提取 # -*- coding: utf-8 -*- """@Tim ...

  9. 简介关联规则、支持度和置信度

    转自:小帆的帆的专栏 例子: 总共有10000个消费者购买了商品, 其中购买尿布的有1000人, 购买啤酒的有2000人, 购买面包的有500人, 同时购买尿布和啤酒的有800人, 同时购买尿布的面包 ...

最新文章

  1. oracle10gr2 x86,Oracle10gR2 On RHEL5 x86安装技术文档(英文原版)
  2. 虚拟化正是云计算所依托的基石
  3. 【转】android是32-bit系统还是64-bit系统
  4. python方向-零基础转行Python,往这个方向走,绝对没有错
  5. mysql查询时,offset过大影响性能的原因与优化方法
  6. process_进程池
  7. iPhone 13的新对手?小米历史上最好看的手机即将发布
  8. Web定时器 - Timer
  9. php处理mysql的符号_MySQL数据入库时特殊字符处理
  10. 为企业搭建Gitlab软件版本管理服务器
  11. 【Github】nlp-journey: NLP相关代码、书目、论文、博文、算法、项目资源链接
  12. jQuery深拷贝Json对象
  13. SpringBoot 2.1.0 整合 WebSocket 通信
  14. Node之HTTPS客户端
  15. esxi查看许可过期_ESXi许可证将在 60 天后过期问题
  16. mac安装win7之后鼠标失灵_苹果电脑安装win7时键盘鼠标无响应3种解决方案
  17. 【图像去噪】基于matlab小波变换图像去噪(MSE和SNR)【含Matlab源码 2192期】
  18. 苹果移动设备(iPhone/iPad)分辨率汇总
  19. IP-MAC绑定到底有多重要?(白目的见解)
  20. 缓冲区(1):为什么会有缓冲区(缓存)?

热门文章

  1. Linux嵌入式学习---C语言之赋值
  2. 做一个AV网站需要做什么
  3. ​高新技术企业优惠政策有哪些?
  4. 对OOA、OOD和OOP的较浅理解
  5. matplotlib.pyplot画图 图片的二进制流的获取
  6. Pfsense和Snorby
  7. 网易创始人丁磊:很多人来网易工作只是为了谋生,其实并没有什么兴趣!
  8. 第3周 字符串分段组合
  9. 联诚发(LCF)派礼物,平平安安过端午
  10. 关于Mybatis的@Param注解