推荐算法——Apriori算法原理

0、前言:

  • 首先名字别读错:an pu ruo ao rui 【拼音发音】
  • Apriori是一种推荐算法
  • 推荐系统:从海量数据中,帮助用户进行信息的过滤和选择。主要推荐方法有:基于内容的推荐、协同过滤推荐、基于关联规则的推荐、基于知识的推荐、混合推荐。
  • 关联分析:是一种在大规模数据集中寻找有趣关系的非监督学习算法,是利用一些有趣性的量度来识别数据库中发现的强规则。

1、基础概念

  • 频繁项集:经常【需要量化】出现在一块的物品的集合
  • 关联规则:暗示两种物品之间可能存在很强的关系
  • 事务:将数据看成一条条交易记录的集合,事务就是一条交易
  • 项:交易的每一个物品称为一个项
  • 项集:包含零个或者多个项的集合
  • k-项集:包含k个项的项集
  • 前件和后件:一个规则中先买了尿布后买了啤酒,尿布就是啤酒的前件、啤酒就是尿布的后件
  • 常用频繁项集的评估标准有:支持度、置信度、提升度;
    • 支持度就是几个关联的数据在数据集中出现次数占总数据集的比重。(举例:超市一天卖了5单,其中有2单同时出现了尿布和啤酒,那么{尿布、啤酒}的支持度就是2/5=0.4),支持度常用来删除一些没意义的规则。
    • 置信度就是一个数据出现后,另一个数据出现的概率。(举例:买了尿布后会买啤酒的概率=两者同时出现的概率(两者的支持度)/尿布出现的概率(尿布的支持度))
    • 提升度:如果A事件的支持度本来就很高,然后求B事件发生后A事件的置信度,发现也很高,但并没有A事件本身的支持度高,就有可能误以为B事件的发生导致A事件发生的可能性增加了。所以加入了提升度的概念(举例:求A事件发生对B事件的提升度=AB同时发生的支持度/B事件发生的持度度),提升度大于1,表明A对B是有效的强关联规则,小于1表明A对B是无效的强关联规则。等于1,说明没有提升。
  • ★发现频繁项集和关联规则:如果一一遍历去找关联规则和频繁项集,计算量非常大,所以要进行筛选。
    • 1、首先设定最小支持度,最小置信度,找到满足最小支持度的所有项集,这些项集叫做频繁项集。
    • 2、从频繁项集中提取所有高置信度的规则,这些规则就是强关联规则。
    • 注意:如果一个项集是频繁的,那么它的所有子集也是频繁的。
    • 注意:如果一个项集是非频繁的,那么所有包含它的集合也是非频繁的。【通过这条规则减少计算量】

2、算法实现过程

  • Apriori算法原理:所有非频繁项集不用计算,减少计算量。获取apriori频繁项集是第一步,要通过apriori最终获取强关联规则,就要在频繁项集支持度的基础上,计算每种规则的支持度。
    在这里插入图片描述
  • 原始候选集构建1-项集:
# 数据集
dataset = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
# 让候选集每一项变成不可变集合,进而获取1-项集
def creat_c1(data_set):c1 = []for data in data_set:for i in data:if i not in c1:c1.append(i)c1.sort()return list(map(frozenset,[{i} for i in c1])) # frozenset是将集合变成不可变集合,目的是最后让frozenset作为字典的key
c1 = creat_c1(dataset)
'''
[frozenset({1}),frozenset({2}),frozenset({3}),frozenset({4}),frozenset({5})]
'''
  • 由1-项集(C1)转为1-项频繁集(L1)推出k-项集转k-项频繁集的函数:通过支持度筛选频繁集;scanD()函数:获取所有k-项集的支持度和k-项集对应的k-项频繁集
# C1(1项集):L1(1项频繁项集)
# D:数据集
# Ck:k项集
# min_support:最小支持度
def scanD(D,Ck,min_support=0.1):support_dic = {}# 遍历原始交易记录for d in D:for c in Ck:# 判断是否是子集,是的话数量加1if c.issubset(d):support_dic[c] = support_dic.get(c,0) + 1 # 防止刚开始support_dic是空support_data = {} # 所有项集的支持度LK = [] # 频繁项集# 计算支持度for k,v in support_dic.items():support = v/len(D)support_data[k] = support
#     print(support_data) # 打印支持度# 获得频繁项集if support >= min_support:LK.append(k)# 返回频繁项集、所有项集支持度:return LK, support_data
  • 由1-项频繁集产生2-项集的方法推出:k-项频繁集产生k+1-项集的方法;apriori_gen()函数:获取所有k-项频繁集(Lk)对应的k+1-项集(Ck+1),如下图以2-项集生成方法说明:
    在这里插入图片描述
# L1(1频繁项集) => C2(2项集)
def apriori_gen(LK):Ck = []for i in range(len(LK)-1):for j in range(i+1,len(LK)):f_set = LK[i] | LK[j]# print(f_set)# 不能重复,新项集只能是k+1项if f_set not in Ck and len(f_set) == len(LK[0])+1:Ck.append(f_set)# print(Ck)return Ck   
  • 获取频繁项集和频繁项集生成过程中产生的项集的支持度
import time
def apriori(D, min_support=0.1):c1 = creat_c1(D)L1,support1 = scanD(D,c1,min_support)# 所有频繁项集L_f = []# 所有项集支持度就直接添加到support1中# 循环while True:L_f.append(L1)# 项集C = apriori_gen(L1)# 项集——频繁项集L,support = scanD(D,C,min_support)L1 = Lsupport1.update(support)if len(L1)==0:breakreturn L_f,support1
  • 获取k项集满足最小置信度的强关联规则的集合
    计算置信度:confidence(X -> Y) = P(Y|X) = P(XY) / P(X)【在x发生的条件下Y发生的置信度】
    calculate_conf()函数:计算某个频繁项集对应的满足最小置信度的强关联规则的集合。
# 计算一个项集的所有强关联规则
# 计算置信度
# freqSet: 频繁项集
# H=[frozenset({i}) for i in freqSet]
# L, support_Data = apriori(dataset, min_support=n)
# brl = [ ]   # 保存强关联规则的列表
def calculate_conf(freqSet, H, supportData, brl, minConf=0.5):newH = [ ]# 遍历Hfor s in H:# 置信度conf = supportData[freqSet] / supportData[freqSet - s]# conf(3,5->1) = P(1, 3, 5) / P(3,5)  # display(f'--- {freqSet - s} -> {s} = {conf} ---')# 大于最小置信度的规则是强规则if conf >= minConf:# 保存强关联规则到brl中brl.append( (freqSet - s, "->" , s, ' = ', conf) )  newH.append(s)return newH

用一个2-项集测试下函数calculate_conf,发现对于2-项集,函数能够获取所有满足置信度要求的关联规则。

freqSet = frozenset({1, 3})
H = [frozenset({i}) for i in freqSet]
L, support_data = apriori(dataset, min_support=0.2)
brl = [ ]   # 保存强关联规则的列表
# display(freqSet, H)# 计算单个项集的置信度
calculate_conf(freqSet, H, support_data, brl, minConf=0.1)
brl
'''
[(frozenset({3}), '->', frozenset({1}), ' = ', 0.6666666666666666),(frozenset({1}), '->', frozenset({3}), ' = ', 1.0)]
'''
# 3-项集
freqSet = frozenset({1, 3, 5})
H = [frozenset({i}) for i in freqSet]
L, support_data = apriori(dataset, min_support=0.2)
brl = [ ]   # 保存强关联规则的列表
# display(freqSet, H)# 计算单个项集的置信度
calculate_conf(freqSet, H, support_data, brl, minConf=0.1)
brl
'''
[(frozenset({3, 5}), '->', frozenset({1}), ' = ', 0.5),(frozenset({1, 5}), '->', frozenset({3}), ' = ', 1.0),(frozenset({1, 3}), '->', frozenset({5}), ' = ', 0.5)]
'''

可以发现:在3项集中出现了问题,3项集中只有2-项集作为前件的情况,没有1-项集作为前件的情况,出现了统计不完全的情况。因此为了让统计结果齐全,需要重新写个函数完善calculate_conf()函数。

# 考虑2-项集,3-项集,4-项集...
def rules_from_freq(freqSet, H, supportData, brl, minConf=0.7):tmp = Truewhile tmp:tmp = False# 计算置信度newH = calculate_conf(freqSet, H, supportData, brl, minConf=minConf)# display(f'newH: {newH}')H = apriori_gen(newH)# display(f'H: {H}')# print('*' * 100)tmp =  not  (H==[ ] or len(H[0]) == len(freqSet))

测试:通过测试结果可以看出,完善之后的函数就能够获得所有满足要求置信度的关联规则

# 3-项集
freqSet = frozenset({1, 3, 5})
H = [frozenset({i}) for i in freqSet]
L, support_data = apriori(dataset, min_support=0.2)
brl = [ ]   # 保存强关联规则的列表
# display(freqSet, H)# 计算单个项集的置信度
rules_from_freq(freqSet, H, support_data, brl, minConf=0.1)
brl
'''
[(frozenset({3, 5}), '->', frozenset({1}), ' = ', 0.5),(frozenset({1, 5}), '->', frozenset({3}), ' = ', 1.0),(frozenset({1, 3}), '->', frozenset({5}), ' = ', 0.5),(frozenset({5}), '->', frozenset({1, 3}), ' = ', 0.3333333333333333),(frozenset({3}), '->', frozenset({1, 5}), ' = ', 0.3333333333333333),(frozenset({1}), '->', frozenset({3, 5}), ' = ', 0.5)]
'''
  • 获取强关联规则的置信度:获取给定项集L中满足置信度要求的强关联规则
def gen_rules(L, support_data, min_conf=0.5):big_rule_list = [ ]for i in range(1, len(L)):  # 遍历所有行,第一行除外for freqSet in L[i]:  # 遍历每一行的所有元素# display(freqSet)H = [frozenset({i}) for i in freqSet]# 求每个项集的强关联规则,会保存在big_rule_list中rules_from_freq(freqSet, H, support_data, big_rule_list, minConf=min_conf)return big_rule_list

3、apriori算法总结:通过总结疏通下apriori算法中求频繁项集和求强关联规则的函数构造方法

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring整合RabbitMQ——生产者

1.生产者整合步骤 添加依赖坐标,在producer和consumer模块的pom文件中各复制一份。 配置producer的配置文件 配置producer的xml配置文件 编写测试类发送消息

《HelloGitHub》第 90 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …

javascript: Sorting Algorithms

// Sorting Algorithms int JavaScript https://www.geeksforgeeks.org/sorting-algorithms/ /** * file Sort.js * 1. Bubble Sort冒泡排序法 * param arry * param nszie */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i)…

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…

【生物信息学】计算图网络中节点的中心性指标:聚集系数、介数中心性、度中心性

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成邻接矩阵simulate_G: 2. 计算节点的聚集系数 CC(G): 3.计算节点的介数中心性 BC(G) 4. 计算节点的度中心性 DC(G) 5. 综合centrality(G) 6. 代…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

【Java基础】抽象类和接口的使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、抽象类抽象类概念…

无设计经验也能制作专业国庆微传单

如果你正在计划一个国庆活动&#xff0c;或者想要创建一个微传单来宣传你的品牌或产品&#xff0c;那么你可以尝试使用乔拓云微传单平台。通过这个平台&#xff0c;你可以轻松地创建和发布一个精美的微传单&#xff0c;而且完全免费。 以下是制作国庆微传单H5的步骤&#xff1a…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层

一、MapTool简介 在ArcGIS Pro SDK中&#xff0c;MapTool是一个重要的组件&#xff0c;用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。 在VS中添加新项&#xff0c;可以找到ArcGIS Pro 地图工具&#xff0c;即为MapTool。 新建后打开c…

优雅的写Controller 层代码这样写才可以

前 言 本篇主要要介绍的就是controller层的处理&#xff0c;一个完整的后端请求由4部分组成&#xff1a; 接口地址(也就是URL地址)请求方式(一般就是get、set&#xff0c;当然还有put、delete)请求数据(request&#xff0c;有head跟body)响应数据(response) 本篇将解决以下3个…

Vue+element开发Simple Admin后端管理系统页面

最近看到各种admin&#xff0c;头大&#xff0c;内容太多&#xff0c;根本不知道怎么改。所以制作了这个项目&#xff0c;只包含框架、和开发中最常用的表格和表单&#xff0c;不用自己从头搭建架构&#xff0c;同时也容易上手二次开发。可以轻松从其他开源项目整合到本项目。项…

基于Qt Creator开发的坦克大战小游戏

目录 介绍开发环境技术介绍安装说明项目目录设计思想项目介绍运行演示知识点记录Gitee源码链接 介绍 &#xff01;&#xff01;&#xff01;资源图片是从网上免费下载&#xff0c;源码都是原创&#xff0c;供个人学习使用&#xff0c;非盈利&#xff01;&#xff01;&#xff…

UE5报错及解决办法

1、编译报错&#xff0c;内容如下&#xff1a; Unable to build while Live Coding is active. Exit the editor and game, or press CtrlAltF11 if iterating on code in the editor or game 解决办法 取消Enable Live Coding勾选

Java编码

Java编码问题 Unicode与码点 所谓Unicode就是全世界的字符字典&#xff0c;也就是把字符给一个编号&#xff0c;这个编码就是码点。比如 2. 编码 由于这种分配的编码无论从占用空间角度&#xff0c;还是读取速度&#xff0c;以及逻辑划分角度&#xff0c;都不是完善。所以出…

了解”变分下界“

“变分下界”&#xff1a;在变分推断中&#xff0c;我们试图找到一个近似概率分布q(x)来逼近真实的概率分布p(x)。变分下界是一种用于评估近似概率分布质量的指标&#xff0c;通常用来求解最优的近似分布。它的计算涉及到对概率分布的积分或期望的估计

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 自动补全自定义拼音分词器自动补全查询案例&#xff1a;实现酒店搜索框自动补全自动补全的javaAPI实现搜索框自动补全 口述自动补全数据同步集群集群的分布式存储集群分布式查询集群故障转移 数据聚合 什么是聚合&#xff1f; 聚合…

【面试经典150 | 矩阵】旋转图像

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地旋转方法二&#xff1a;翻转代替旋转 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带…

【Cesium创造属于你的地球】相机系统

相机系统里面有setView&#xff0c;flyTo&#xff0c;lookAt&#xff0c;viewBoundingsphere这几种方法&#xff0c;以下是相关的使用方法&#xff0c;学起来&#xff01;&#xff01;&#xff01; setView 该方法可以直接切换相机视口&#xff0c;从而不需要通过一个飞入的效…