实验2 Aprori关联挖掘算法

目 录

一、实验目的... 1

二、实验环境... 1

三、实验内容... 1

3.1 connect_string()函数解析... 1

3.2 find_rule()函数解析+纠错... 2

3.3 关联规则挖掘... 4

四、心得体会... 7

一、实验目的

(1)理解Aprori关联挖掘算法的程序编写;

(2)能熟练地使用Aprori关联挖掘算法分析相应的数据。

二、实验环境

(1)操作系统:windows11;

(2)python版本:3.10;

(3)Python开发环境:Jupyter,pycharm。

三、实验内容

3.1 connect_string()函数解析

阅读给出的Aprori关联挖掘算法,并注释。

附件给出了一个代码文件,其中包含两个函数,connect_string(x, ms)函数代码如下:

# 自定义连接函数,用于实现L_{k-1}C_k的连接
def connect_string(x, ms):#分隔输入的频繁项集为二维数据结构
x = list(map(lambda i: sorted(i.split(ms)), x))#获取频繁项集的项目数
l = len(x[0])r = []#遍历频繁项集,得到下一步的候选集
for i in range(len(x)):for j in range(i, len(x)):if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))return r

这个代码的作用为:输入n-1个项目的频繁项集,输出n个项目的候选集。详细说明如下:

首先,输入参数为x和ms,其中x是一个列表,表示现有的n-1个项目的频繁项集,例如:[“西红柿--鸡蛋”,“排骨--鸡蛋”,“西红柿--鞋子”......],是一个包含两个项目的频繁项集。ms是分隔符号,用于分隔两个项目,此处的代码使用的分隔符为“--”,在这个函数中存入这个参数的目的是通过这个参数将频繁项集分解为多个项目;

其次,原本的一维列表通过代码“x = list(map(lambda i: sorted(i.split(ms)), x))”分隔为了二维列表,形如:[[’’西红柿’’,’’鸡蛋’’],[’’排骨’’,’’鸡蛋’’],[’’西红柿’’,’’鞋子’’]......];

随后,代码“l = len(x[0])”获取了传入的频繁项集包含的项目数“n-1”,用于后续构建“n”个项目的候选集;

最后,通过两个循环遍历所有事务,找出所有的候选集。

注意:这里得到的是“候选集”并不是“频繁项集”,另外也不是“完全的候选集”,因为代码采用了一定的“先验知识”,即:频繁项集的子集一定是频繁项集。

3.2 find_rule()函数解析+纠错

附件代码中另一个函数为find_rule()函数,里面调用了上述的connect_string()函数,用于寻找关联规则,但是代码中存在错误,已经标红,原始代码如下:

# 寻找关联规则的函数
def find_rule(d, support, confidence, ms=u'--'):result = pd.DataFrame(index=['support', 'confidence'])  # 定义输出结果
support_series = 1.0 * d.sum() / len(d)  # 支持度序列
column = list(support_series[support_series > support].index)  # 初步根据支持度筛选
k = 0while len(column) > 1:k = k + 1print(u'\n正在进行第%s次搜索...' % k)column = connect_string(column, ms)print(u'数目:%s...' % len(column))sf = lambda i: d[i].prod(axis=1, numeric_only=True# 新一批支持度的计算函数
# 创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i) for i in column]).Tsupport_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d)  # 计算连接后的支持度
column = list(support_series_2[support_series_2 > support].index)  # 新一轮支持度筛选
support_series = support_series.append(support_series_2)
column2 = []for i in column:  # 遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B
i = i.split(ms)for j in range(len(i)):column2.append(i[:j] + i[j + 1:] + i[j:j + 1])cofidence_series = pd.Series(index=[ms.join(i) for i in column2])  # 定义置信度序列
for i in column2:  # 计算置信度序列
cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))] / support_series[ms.join(i[:len(i) - 1])]for i in cofidence_series[cofidence_series > confidence].index:  # 置信度筛选
result[i] = 0.0result[i]['confidence'] = cofidence_series[i]result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]result = result.T.sort_values(['confidence', 'support'], ascending=False# 结果整理,输出
print(u'\n结果为:')print(result)return result

该函数的用途为:将输入的多个事务通过apriori算法进行处理,得到关联规则,具体解析如下:

首先,传入一个bool矩阵d,包含多个事务与事务的全部项目情况,事务有该项目则置为“True”或“1”,无项目则置为“False”或“0”;另外传入自定义的最小支持度“support”和最小置信度“confidence”;同时默认的分隔符为“--”可以选择自定义;

其次,通过“support_series = 1.0 * d.sum() / len(d)”分别计算出单个项目的支持度,并通过“column = list(support_series[support_series > support].index)”筛除不符合最小支持度的项集;

随后,通过一个循环不断探索当前候选集下满足最小支持度和最小置信度的关联规则,每个循环结束使用connect_string()函数得到下一个候选集。每一次循环得到的关联规则追加到一个序列中,但是追加的代码出现了一个错误support_series = support_series.app end(support_series_2)”,series结构的数据不能使用“append”方法进行追加,可以先转化为list进行追加或者使用“concat()”函数直接将两个series进行合并,因此修正后的代码为:

support_series = pd.concat([support_series,support_series_2])

最后,直到候选集不再能得到关联规则,推出循环,将得到的support_series转化为矩阵进行输出,具体输出效果见3.3

3.3 关联规则挖掘

以超市购买记录数据为例,利用关联规则挖掘算法挖掘其关联规则。将其数据整理到一个Excel表格中(文件命名为tr.xlsx),其形式如下:

利用给出的Aprori关联挖掘算法,最小支持度为0.2,最小置信度为0.4,调用apriori函数挖掘其关联规则。

首先,由于附件代码仅仅给出了功能函数,主函数需要补充,内容如下:

df = pd.read_excel('tr.xlsx',header = None,index_col = 0)df

此处代码功能为:读取excel文件,并且确定第一列为索引无标题行,运行结果如下:

其次,需要提取出所有事务中涉及到的所有项目,代码如下:

#将每个事务读取为一个字符串,删除nan,用空格分隔并且删除相同元素
items = set()for col in df.columns:items.update(df[col].dropna().unique())items = list(items)items

使用集合set可以提高效率,因为集合的查找操作平均时间复杂度是O(1),而列表的查找操作是O(n)。运行结果如下:

随后,将事务转化为bool矩阵,便于后续计算支持度与置信度,代码如下:

#创建bool矩阵dd = pd.DataFrame(False, index = df.index, columns = items)d

运行结果如下,此时还未传入事务数据,全部置为False:

随后,填入bool矩阵,得到源数据的bool矩阵,代码如下:

#填充bool矩阵dfor idx, row in df.iterrows():for item in row:if pd.notnull(item):d.at[idx, item] = Trued

如果源事务中有项目,则置为True,运行结果如下:

最后,设定最小支持度为0.1,最小置信度为0.2,并将bool矩阵传入find_rule()函数,代码如下:

find_rule(d, 0.1, 0.2)

运行结果如下,一共得到了77个关联规则:

四、心得体会

(1)在提取事务中所有项目的过程中:

#将每个事务读取为一个字符串,删除nan,用空格分隔并且删除相同元素
items = set()for col in df.columns:items.update(df[col].dropna().unique())items = list(items)items

这段代码通过使用集合可以提高效率,因为集合的查找操作平均时间复杂度是O(1),而列表的查找操作是O(n)。因此,通常推荐使用集合来处理这类问题,然后再将其转换为列表,如果最终需要列表形式的话。

(2)在已有的关联规则中追加新的关联规则时:

series不能使用append追加,可以先转化为list进行追加或者使用“concat()”函数直接将两个series进行合并,因此修正后的代码为:

support_series = pd.concat([support_series,support_series_2])

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

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

相关文章

PYTHON自学笔记(一)vscode配置

安装python 自行官网下载 安装vscode 自行官网下载 环境变量设置 把python和scripts的文件路径,添加到环境变量的path中,如图: 此项不弄,在命令行模式中系统不会认为你装了python和pip,你的输入相关命令shell不会…

# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】

easy-rl PDF版本 笔记整理 P5、P10 - P12 joyrl 比对 补充 P11 - P13 OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链…

[机器学习]-4 Transformer介绍和ChatGPT本质

Transformer Transformer是由Vaswani等人在2017年提出的一种深度学习模型架构,最初用于自然语言处理(NLP)任务,特别是机器翻译。Transformer通过自注意机制和完全基于注意力的架构,核心思想是通过注意力来捕捉输入序列…

CosyVoice多语言、音色和情感控制模型,one-shot零样本语音克隆模型本地部署(Win/Mac),通义实验室开源

近日,阿里通义实验室开源了CosyVoice语音模型,它支持自然语音生成,支持多语言、音色和情感控制,在多语言语音生成、零样本语音生成、跨语言声音合成和指令执行能力方面表现卓越。 CosyVoice采用了总共超15万小时的数据训练&#…

【2024_CUMCM】时间序列算法ARMA

目录 2023-c-问题二 问题分析 介绍 单位根检验 白噪声检验 自相关和偏自相关图 利用信息准则定阶 构建AMIMA模型 D-W检验 预测 代码 2023-c-问题二 问题分析 ARMA适合多个领域的时间序列分析,不同时间的定价策略属于这类问题。 介绍 ARMA模型&…

C++入门7——string类详解

目录 1.什么是string类? 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

【机器学习】基于线性回归的医疗费用预测模型

文章目录 一、线性回归定义和工作原理假设表示 二、导入库和数据集矩阵表示可视化 三、成本函数向量的内积 四、正态方程五、探索性数据分析描述性统计检查缺失值数据分布图相关性热图保险费用分布保险费用与性别和吸烟情况的关系保险费用与子女数量的关系保险费用与地区和性别…

GDP播放器 驱动视频播放器 PHP 系统源码 v4.4.3

最重要的是我们自己开发了源代码,因此无论您在使用此工具时遇到什么问题,我们都会快速解决。这个版本演示 分别支持PHP7.4/8.1/8.2三个版本 演示地址

轻松驾驭开发之旅:Maven配置阿里云CodeUp远程私有仓库全攻略

文章目录 引言一、为什么选择阿里云CodeUp作为远程私有仓库?二、Maven配置阿里云CodeUp远程私有仓库的步骤准备工作配置Maven的settings.xml文件配置项目的pom.xml文件验证配置是否成功 三、使用阿里云CodeUp远程私有仓库的注意事项 引言 在软件开发的世界里&#…

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日,阿里通义实验室发布开源语音大模型项目FunAudioLLM,而且一次包含两个模型:SenseVoice和CosyVoice。 CosyVoice专注自然语音生成,支持多语言、音色和情感控制,支持中英日粤韩5种语言的生成,效果显著优于…

分子AI预测赛Task4笔记(结束)

话不多说,直接上官方链接:‌​​​‍​⁠​‌​‍​​​‌​⁠‬​‬​​‌​​​​‬‬​​​​‍⁠‍‌​⁠Task3:进阶baseline详解 - 飞书云文档 (feishu.cn)Task4:持续尝试&…

C++左值右值

在C中,左值(lvalue)和右值(rvalue)是表达式分类的关键概念,它们主要影响表达式的赋值、函数调用以及操作符的使用方式。这些概念在C11及以后的版本中变得更加重要,因为引入了移动语义和右值引用…

妈妈带女儿美在心里

在这个充满温情与惊喜的午后,阳光温柔地洒落在每一个角落,仿佛连空气弥漫着幸福的味道。就在这样一个平凡的时刻,一段关于爱与成长的温馨画面,悄然在网络上绽放,引爆了无数人的心弦——#奚梦瑶2岁女儿身高#&#xff0c…

【Linux进程】命令行参数 环境变量(详解)

目录 前言 1. 命令行参数 什么是命令行参数? 2. 环境变量 常见的环境变量 如何修改环境变量? 获取环境变量 环境变量的组织方式 拓展问题 导入环境变量 3. 本地变量* 总结 前言 在使用Linux指令的时候, 都是指令后边根命令行参数, 每个指令本质都是一个一个的可执行程…

【UE5.1 角色练习】13-枪械射击——拿出与收起武器

目录 效果 步骤 一、安装射击武器 二、拿武器和收武器 效果 步骤 一、安装射击武器 1. 在虚幻商城中将“FPS Weapon Bundle”添加到工程中,由于我们使用的是5.1版本,我们可以先将该资产放入UE4工程中,然后迁移到5.1版本的工程 2. 打开角…

一.2.(4)放大电路静态工作点的稳定;(未完待续)

1.Rb对Q点及Au的影响 输入特性曲线:Rb减少,IBQ,UBEQ增大 输出特性曲线:ICQ增大,UCEQ减少 AUUO/Ui分子减少,分母增大,但由于分子带负号,所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

【JavaSE复习】数据结构、集合

JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展(无规律数据) 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…

爱了!8款超好用的PC端办公软件!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 你电脑中用的最久的软件是哪些?以下是否有你曾经使用过的软件呢?工欲善其事,必先利其器,今天继续…

无人机便携式侦测干扰设备(定全向)技术详解

无人机便携式侦测干扰设备(定全向)是一种专门针对无人机进行侦测和干扰的设备。它具备定向和全向两种工作模式,能够覆盖较宽的频率范围,有效侦测并干扰无人机与遥控器之间的通信信号,从而达到控制或驱离无人机的目的。…

验证回文串-string题目

用双指针&#xff0c;left right从两头往中间对比&#xff0c;不是字母的都略过&#xff0c;比的时候化成小写字母 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isPalindrome(string s) {if(s.size() < 1)return true;int left …