【关联规则Apriori】【算法】【商务智能方法与应用】课程

探索Apriori算法:数据挖掘中的频繁项集与关联规则

在当今数据驱动的世界中,数据挖掘技术正变得越来越重要。今天,我们将通过一个实际案例,了解并应用Apriori算法,这是一种广泛用于发现频繁项集及其关联规则的算法,尤其适用于零售数据分析、电影推荐系统等领域。

一、Apriori算法简介

Apriori算法的核心思想是:频繁项集的所有子集必定也是频繁的。这意味着,通过递归地寻找频繁项集,我们可以有效地提取出数据中隐藏的关联规则。

算法步骤:

  1. 生成候选项集:首先,从单个项开始,生成所有可能的项集。
  2. 筛选频繁项集:然后,通过与数据集比较,筛选出那些满足最小支持度(minSupport)要求的项集。
  3. 迭代生成更高维度的项集:通过合并当前维度的频繁项集,生成下一维度的候选项集,并重复筛选过程。
  4. 关联规则挖掘:在得到了所有频繁项集后,计算它们之间的关联规则,并筛选出满足最小置信度(minConfidence)要求的规则。

二、案例分析:电影演员关联分析

接下来,我们将通过一个电影演员关联分析的案例,来具体展示Apriori算法的应用。

data:

导库

from itertools import chain, combinations  #itertools模块提供了非常有用的用于操作迭代对象的函数
from openpyxl import load_workbook #处理excel文件的模块

1. 加载数据集函数 loadDataSet()

这个函数用于加载数据集,数据集是电影和演员的关联数据。代码中使用了operpyxl库来加载Excel文件,并从中提取数据。

#加载关联分析数据的函数
def loadDataSet():'''加载数据,返回包含若干集合的列表'''# 返回的数据格式为 [{1, 3, 4}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}]result = []# xlsx文件中有3列,分别为电影名称、导演名称、演员清单# 同一个电影的多个主演演员使用逗号分隔ws = load_workbook('./data/data112172/电影导演演员.xlsx').worksheets[0]for index, row in enumerate(ws.rows):# 跳过第一行表头if index==0:continueresult.append(set(row[2].value.split(',')))return result

result.append(set(row[2].value.split(','))) 这行代码做了几件事情:

  • row[2].value 获取当前行的第三列(索引为 2)的值,这列应该包含了演员的名字,多个名字之间用中文逗号(‘,’)分隔。
  • .split(',') 将演员名字的字符串按中文逗号分割成列表。
  • set(...) 将列表转换成集合,这样可以去除重复的演员名字(如果有的话)。
  • result.append(...) 将得到的集合添加到结果列表 result 中。

2. 创建初始候选项集 createC1()

这个函数用于从数据集中创建初始的候选项集C1,每个候选项是一个单项。

def createC1(dataSet):'''dataSet为包含集合的列表,每个集合表示一个项集返回包含若干元组的列表,每个元组为只包含一个物品的项集,所有项集不重复'''return sorted(map(lambda i:(i,), set(chain(*dataSet))))
  • chain(*dataSet):使用 itertools.chaindataSet 中的所有集合合并成一个迭代器。*dataSet 表示将 dataSet 解包,传递给 chain 函数。
  • set(chain(*dataSet)):将合并后的迭代器转换为集合,自动去除了重复的元素。

  • map(lambda i:(i,), ...):对集合中的每个元素应用 lambda 函数,将每个元素包装成一个单元素的元组。

  • sorted(...):对生成的元组列表进行排序,确保输出是有序的。

3. 扫描数据集,生成频繁项集 scanD()

这个函数用于扫描数据集,根据候选项集生成频繁项集。它计算每个候选项集的支持度,并保留那些支持度大于最小支持度阈值的项集。

#扫描集合列表,找出支持度大于阈值的项集
def scanD(dataSet, Ck, Lk, minSupport):'''dataSet为包含集合的列表,每个集合表示一个项集ck为候选项集列表,每个元素为元组minSupport为最小支持度阈值返回Ck中支持度大于等于minSupport的那些项集'''# 数据集总数量total = len(dataSet)supportData = {}for candidate in Ck:# 加速,k-频繁项集的所有k-1子集都应该是频繁项集if Lk and (not all(map(lambda item: item in Lk,combinations(candidate,len(candidate)-1)))):continue# 遍历每个候选项集,统计该项集在所有数据集中出现的次数# 这里隐含了一个技巧:True在内部存储为1set_candidate = set(candidate)frequencies = sum(map(lambda item: set_candidate<=item,dataSet))# 计算支持度t = frequencies/total# 大于等于最小支持度,保留该项集及其支持度if t >= minSupport:supportData[candidate] = treturn supportData

4. 生成新的候选项集 aprioriGen()

这个函数用于根据当前的频繁项集生成新的候选项集。它通过合并具有k-2项相同元素的项集来生成k项集。

#生成频繁项集
def aprioriGen(Lk, k):'''根据k项集生成k+1项集'''result = []for index, item1 in enumerate(Lk):for item2 in Lk[index+1:]:# 只合并前k-2项相同的项集,避免生成重复项集# 例如,(1,3)和(2,5)不会合并,# (2,3)和(2,5)会合并为(2,3,5),# (2,3)和(3,5)不会合并,# (2,3)、(2,5)、(3,5)只能得到一个项集(2,3,5)if sorted(item1[:k-2]) == sorted(item2[:k-2]):result.append(tuple(set(item1)|set(item2)))return result

5. 主函数 apriori()生成频繁项集

这个函数是Apriori算法的主函数,它初始化算法流程,生成频繁项集,并递归地生成更高维度的频繁项集。

#用apriori算法找频繁项集
def apriori(dataSet, minSupport=0.5):'''根据给定数据集dataSet,返回所有支持度>=minSupport的频繁项集'''C1 = createC1(dataSet)print(C1)supportData = scanD(dataSet, C1, None, minSupport)print(supportData)k = 2while True:# 获取满足最小支持度的k项集Lk = [key for key in supportData if len(key)==k-1]# 合并生成k+1项集Ck = aprioriGen(Lk, k)# 筛选满足最小支持度的k+1项集supK = scanD(dataSet, Ck, Lk, minSupport)# 无法再生成包含更多项的项集,算法结束if not supK:breaksupportData.update(supK)k = k+1return supportData

6. 查找关联规则 findRules()

这个函数用于在频繁项集中查找满足最小置信度的关联规则。

#寻找关联规则
def findRules(supportData, minConfidence=0.5):'''查找满足最小置信度的关联规则'''# 对频繁项集按长度降序排列supportDataL = sorted(supportData.items(),key=lambda item:len(item[0]),reverse=True)rules = []for index, pre in enumerate(supportDataL):for aft in supportDataL[index+1:]:# 只查找k-1项集到k项集的关联规则if len(aft[0]) < len(pre[0])-1:break# 当前项集aft[0]是pre[0]的子集# 且aft[0]==>pre[0]的置信度大于等于最小置信度阈值if set(aft[0])<set(pre[0]) and\pre[1]/aft[1]>=minConfidence:rules.append([pre[0],aft[0]])return rules

 执行程序

# 加载数据
dataSet = loadDataSet()
# 获取所有支持度大于0.2的项集
supportData = apriori(dataSet, 0.2)
# 在所有频繁项集中查找并输出关系较好的演员二人组合
bestPair = [item for item in supportData if len(item)==2]
print(bestPair)# 查找支持度大于0.6的强关联规则
for item in findRules(supportData, 0.6):pre, aft = map(set, item)print(aft, pre-aft, sep='==>')

这些代码片段共同构成了Apriori算法的实现,用于从数据中挖掘频繁项集和关联规则。

三、结果解读

通过对数据的分析,我们得到了如下结果:

  1. 频繁项集:我们找到了多个频繁项集,这些项集表示演员之间常见的共同出演关系。
  2. 关联规则:例如,我们发现{'演员1'} => {'演员3'},这表示当演员1出演的电影中,很可能也会有演员3的参与。

四、总结

通过这个案例,我们不仅学习了Apriori算法的基本原理和实现过程,还了解了如何将该算法应用于实际的电影数据分析中,发现演员之间的潜在关联。

Apriori算法在数据挖掘领域具有重要的应用价值,通过它我们可以从大量数据中提取有价值的信息,为决策提供数据支持。

五、实战

题目:参考以上案例,编写代码建立导演与演员的关联规则。请在下面编写你的代码:

分析题目:

         建立导演与演员的关联规则涉及到分析导演与演员之间的关系,以揭示他们在电影制作中的合作模式。以下是解析其中逻辑的几个关键点:

1. 数据结构

  • 数据集构成:数据集通常包含电影、导演和演员的信息。每一条记录表示一部电影,包含导演和该电影的演员列表。
  • 集合表示:每部电影可以表示为一个集合,包含导演和所有参与的演员。例如,电影A由导演X执导,演员包括Y和Z,可以表示为 {X,Y,Z}{X,Y,Z}。

2. 关联规则的定义

  • 关联规则:形式为 A⇒B,其中 A 是前提(例如导演),B 是结果(例如演员)。规则的含义是“如果导演是A,那么很可能演员是B”。
  • 支持度和置信度
    • 支持度:表示规则在数据集中出现的频率。例如,支持度为0.3表示30%的电影中同时有该导演和演员组合。
    • 置信度:表示在给定导演的情况下,演员出现的概率。置信度越高,说明导演与演员之间的关系越强。

3. 逻辑解析

  • 合作模式:通过建立导演与演员的关联规则,可以识别出导演与演员之间的固定合作模式。例如,某位导演可能倾向于与特定演员合作,这种模式可以通过频繁项集挖掘算法(如Apriori)来发现。

  • 导演影响力:导演的选择可能影响演员的表现和电影的整体风格。通过分析这些规则,可以了解哪些导演更倾向于选择某些类型的演员,从而推测出导演的艺术风格和市场定位。

  • 预测与推荐:一旦建立了这些规则,可以用于预测未来的合作。例如,如果某位导演与某些演员有高置信度的合作关系,那么在未来的项目中,选择这些演员可能会提高电影的成功率。

4. 算法实现

  • 数据准备:首先,加载数据并构建包含导演和演员的集合。
  • 频繁项集挖掘:使用Apriori算法等技术,找出支持度和置信度高的项集。
  • 规则生成:从频繁项集中生成关联规则,计算每条规则的支持度和置信度,筛选出符合阈值的规则。

5. 应用场景

  • 选角决策:制片方可以根据这些规则做出更明智的选角决策,选择与特定导演有良好合作历史的演员。
  • 市场分析:分析导演与演员的组合可以帮助电影公司制定市场策略,选择合适的宣传和营销方式。

6. 示例

假设我们有以下数据:

  • 电影1:导演A,演员B、C
  • 电影2:导演A,演员C、D
  • 电影3:导演B,演员B、E

通过分析,我们可能发现:

  • 规则 A⇒C 的支持度为0.67(67%的电影中,导演A与演员C共同出现),置信度为1.0(所有导演A的电影中,演员C都出现)。
  • 规则 A⇒B 的支持度为0.67,置信度为0.67(在导演A的电影中,演员B也出现的概率为67%)。

接下来,开始编程~

        在两种不同的分析(演员与演员的关联规则分析和导演与演员的关联规则分析)中,代码的主体结构和算法逻辑是相似的,因为它们都是基于Apriori算法来挖掘频繁项集和关联规则。不过,具体的实现细节和数据预处理部分可能会有所不同。以下是两种分析之间的一些差异和可复用代码:

可复用代码:

  1. Apriori算法的核心函数:包括createC1scanDaprioriGen, 和 apriori 函数。这些函数不依赖于具体分析的对象(演员或导演),因此可以被复用。
  2. findRules 函数:用于从频繁项集中生成关联规则,同样不依赖于具体分析的对象,因此也可以复用。

需要改进的代码:

  1. 数据预处理:在加载数据集的loadDataSet函数中,需要根据实际的数据结构进行调整。例如,如果数据集中包含导演和演员的信息,需要正确地从数据中提取这些信息并构建集合。
  2. 关联规则的解释:在输出关联规则时,可能需要根据分析的对象(演员或导演)调整输出的格式和解释,以便更清晰地展示规则的含义。
  3. 参数调整:支持度和置信度的阈值可能需要根据实际数据集的特性进行调整,以获得更有意义的结果。

代码差异:

  • 在演员与演员的关联规则分析中,数据预处理可能更关注于提取演员的信息,而导演与演员的关联规则分析则需要同时关注导演和演员的信息。
  • 输出关联规则时,可能需要根据分析的焦点(例如,导演对演员的影响)调整规则的表示方式,以突出分析的重点。
def loadDataSet():result = []ws = load_workbook('./data/data112172/电影导演演员.xlsx').worksheets[0]for index, row in enumerate(ws.rows):if index == 0:continuedirectors = set(row[1].value.split(','))  actors = set(row[2].value.split(','))  # 生成每个导演与其相关演员的集合result.append(directors.union(actors))return result

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

适合二开的web组态软件

技术文档 官网网站&#xff1a;http://www.hcy-soft.com 体验地址&#xff1a;by组态[web组态插件] 可以广泛应用于化工、石化、制药、冶金、建材、市政、环保、电力等几十个行业。 一、产品简介 BY组态是完全自主研发的集实时数据展示、动态交互等一体的全功能可视化平台。帮…

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】 2207.字符串中最多数目的子序列方法&#xff1a;贪心 一次遍历 2207.字符串中最多数目的子序列 方法&#xff1a;贪心 一次遍历 从题意中可以看出来&#xff0c;对于 pattern.charAt(0) 一定是插入到最左侧是最优…

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

Mysql——初识Mysql

目录 数据库基础 创建数据库 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 mysql服务端是一个网络服务器&#xff0c;采用的是TCP协议在应用层 &#xff0c;mysql有自己的协议。 数据库基础 mysql不是数据库&#xff0c;是mysql的…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学&#xff0c;它涵盖了加密技术和解密技术的各个方面&#xff0c;是现代信息安全的核心组成部分。 一、定义与基本概念 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;主要涉及保密通信和数字签名两个方面。它…

【工具】语音朗读PDF的免费工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 看累了&#xff0c;不想看&#xff0c;能不能读给我听&#xff01; 工具介绍 Natural Readers Free Text to Speech Online with Realistic…

Ubuntu 16.04安装填坑记录

一. 问题描述&#xff1a; &#xff08;1&#xff09;Ubuntu 16.04使用USB启动盘安装时&#xff0c;出现"try ubuntu without installation"或“install ubuntu”选择&#xff0c;Enter选择安装后&#xff0c;显示器黑屏无任何显示。 原因分析&#xff1a; 显示黑…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号&#xff0c;先经过数据预处理进行数据集的制作和加载&#xff0c;然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文&#xff08;文末附10分类数据集&#xff09;&#xff1a; Pyth…

8.11Zero Crossing Detection (零交叉检测)

基本概念 零交叉检测是一种基于二阶导数的边缘检测方法&#xff0c;它通过查找二阶导数过零点来定位边缘。 注意: OpenCV没有直接提供这种检测方法&#xff0c;但可以通过结合其他函数来实现。 在OpenCV中&#xff0c;基于C的Zero Crossing Detection&#xff08;零交叉检测&…

项目第一弹:RabbitMQ介绍

RabbitMQ介绍 一、前言1. 回顾生产者消费者模型2.忙闲不均与负载均衡3.改造线程池使其支持负载均衡4.MQ的引入 二、MQ的介绍1.应用/模块解耦&#xff0c;且提高容错性2.异步处理3.流量削峰填谷4.分布式事务1.两阶段提交协议&#xff08;2PC协议&#xff09;2.事务消息&#xff…

《动手学深度学习》笔记2.1——神经网络从基础→进阶 (层和块 - 自定义块)

目录 0. 前言 原书正文&#xff08;第五章&#xff09; 第五章 - 第一节 - 层和块 - 自定义块 1. Sequential() PyTorch高级API 2. MLP() 无传入参数 3. MySequential() 传入任意层(块) 4. FixedHiddenMLP() 无传入参数-固定隐藏层 5. NestMLP() 传入嵌套块-多次嵌套 …

【目标检测】隐翅虫数据集386张VOC+YOLO

隐翅虫数据集&#xff1a;图片来自网页爬虫&#xff0c;删除重复项后整理标注而成 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;386 标注…

C++核心编程和桌面应用开发 第五天(new delete malloc 静态成员 静态成员函数 单例)

目录 1.new运算符 1.1开批数组 2.delete运算符 3.malloc和new的区别 4.万能指针接收new对象 5.静态成员 6.静态成员函数 7. 单例 7.1概念 7.2常见场景 1.new运算符 C中用new进行动态内存分配&#xff0c;new会在调用构造函数之前&#xff0c;成功进行内存分配&#x…

利用F.interpolate()函数进行插值操作

函数简介 功能&#xff1a; 利用插值方法&#xff0c;对输入的张量数组进行上\下采样操作&#xff0c;换句话说就是科学合理地改变数组的尺寸大小&#xff0c;尽量保持数据完整。 torch.nn.functional.interpolate(input, sizeNone, scale_factorNone, modenearest, align_c…

RabbitMQ是什么?RabbitMQ简介

一&#xff1a;技术背景 假如我们有一个支付服务&#xff0c;支付服务的业务逻辑是&#xff1a;首先支付扣减余额&#xff0c;更新支付单状态&#xff0c;更新订单状态&#xff0c;发短信&#xff0c;给这个用户增加积分。在这个场景下&#xff0c;如果我们使用同步调用通信&am…

vscode将c++项目打包exe进行反汇编练习

vscode将c&c项目打包成控制台exe全过程&#xff0c;进行c反汇编练习&#xff0c;反汇编只有不断的练习才能巩固、积累经验。 一、打包exe 创建新项目&#xff0c;选择c&#xff0c;Windows桌面向导 直接点击创建 直接点确定 直接点击运行即可&#xff0c;可以看到我的exe…

15 跨组件通信依赖注入provide和inject

Provide / Inject 通常&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;我们使用 props。想象一下这样的结构&#xff1a;有一些深度嵌套的组件&#xff0c;而深层的子组件只需要父组件的部分内容。在这种情况下&#xff0c;如果仍然将 prop 沿着组件链逐级传递…

ROS2 技术及分布式介绍

PC端开发环境搭建 WSL环境搭建 https://www.guyuehome.com/46574 In Windows 11 builds that support wslg: 1. Open up powershell and enter wsl --install ROS2系统安装 方法一 • 设置编码 Bash $ sudo apt update && sudo apt install loca…

EffcientNetV2(2021):更快、更强、效率更高的EffcientNet!

EffcientNetV2: Smaller Models and Faster Training EfficientNetV2&#xff1a;更小的模型和更快的训练 论文地址&#xff1a; https://arxiv.org/abs/2104.00298 本文介绍了 EfficientNetV2&#xff0c;这是一个新的卷积网络系列&#xff0c;与以前的模型相比&#xff0c;它…

HDFS_API文件和文件夹

代码&#xff1a; Beforepublic void init() throws URISyntaxException, IOException {URI uri new URI("hdfs://master:9000");// 创建一个配置文件Configuration entries new Configuration();// 获取到了客户端对象 // entries.set("dfs.replicat…