实验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 = 0

  

    while len(column) > 1:

        k = k + 1

        print(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]).T

  

        support_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.0

            result[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矩阵d

  d = pd.DataFrame(False, index = df.index, columns = items)

d

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

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

#填充bool矩阵d

  for idx, row in df.iterrows():

    for item in row:

        if pd.notnull(item):

            d.at[idx, item] = True

  d

如果源事务中有项目,则置为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])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android计算器界面的设计——表格布局TableLayout实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button等实现一个计算器界面,界面如图1所示。 图1 计算器界面效果图 任务分析 界面整体使用表格布局,第一行使用一个TextView控件,横跨4列,中间4行4列,最后一…

lspci

【原】Linux之PCIE三种空间解析 PCIe学习笔记——2.PCIe配置空间 PCIE学习(2)PCIE配置空间详解 开发者分享 | 使用 lspci 和 setpci 调试 PCIe 问题 b : 字节 w:word L: 4byte

ASRock Creator系列GPU:为AI推理及多GPU系统打造,采用16针电源接口的Radeon RX 7900系列显卡

ASRock 正在筹备推出专为人工智能推理和多GPU系统设计的AMD GPU——Creator系列显卡。这一系列显卡采用双槽位、吹风式设计,并配备16针电源连接器,首发产品包括基于Navi 31架构的AMD Radeon RX 7900XTX和RX 7900 XT型号。这些原属于WS系列的显卡最初在20…

非同步升压转换器,效率95%你信吗?ETA1611输出电流2A, 22V DCDC

前言: 截止24年7月7日某创报价:500: ¥0.7856 / 个 建议使用前同时了解下方器件。 2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片 描述 ETA1611 SOT23-6封装 丝印GVYW&#xff0…

【Git基本操作】创建本地仓库 | 配置本地仓库 | 认识工作区、暂存区、版本库、对象库 | add和commit操作

目录 1.创建Git本地仓库 1.1创建仓库 1.2创建和初始化Git本地仓库 1.3查看隐藏目录.git 2.配置本地仓库 2.1新增配置 2.2删除重置配置 2.3查看配置选项 2.4全局范围的新增和删除配置 3.工作区、暂存区、版本库、对象库 ​4.add操作和commit操作 4.1add操作 4.2com…

java项目总结8

1.方法引用 1.方法引用概述 注意注意: 1.引用出必须是函数式接口 2.被引用的方法必须已经存在 3.被引用方法的型参和返回值需要跟抽象方法保持一致 4.被引方法的功能要满足当前需求 Arrays.sort(arr,Main::subtraction); Main是该类的名称,&#xff1a…

学习测试1

计算机基础 1、计算机范式:冯诺依曼机 2、存储单元 bit、byte、KB、MB、GB3、网络 ip、域名、ping 域名、 ipconfig测试工作的流程 ------------------------------------------------------------------------------------------- 一 编写测试大纲 罗列测试…

EDA 2023 年世界国家suicide rate排名

文章目录 前言:关于数据集列 导入模块导入数据数据预处理探索性数据分析按性别划分的自杀率 [箱线图]相关矩阵热图自杀率最高的 15 个国家变化百分比最高的 15 个国家/地区2023 年世界地图上自杀率的国家 结尾: 前言: 随着社会的不断发展和变迁,人们对于各种社会问…

排序格式排序格式

排序格式排序格式

期末成绩老师怎么发?

期末考试的钟声终于敲响,学生们紧张而期待地等待着成绩的揭晓。而作为老师,我们面临的不仅仅是成绩的评判,还有一项看似简单却极其繁琐的任务——将成绩单一一私信给每位学生的家长。在成绩公布的那一刻,我们不仅要确保每一份成绩…

Java编程:解决实际问题的高效方法

🎀🎀引言 👍👍点关注编程梦想家(大学生版)-CSDN博客 不迷路❤❤ Java是一种广泛使用的编程语言,它不仅适用于企业级应用开发,还能高效解决各种实际问题。从数学问题到工程问题&…

WEB自动化框架封装MySQL连接及sql断言教程

为了在Web自动化测试中连接MySQL数据库并进行SQL断言,您可以按照以下步骤: 安装MySQL Connector/Python驱动程序,并导入它。 使用Connector/Python创建一个连接对象,指定所需的主机名、用户名、密码和数据库名。 创建一个游标对…

论文研读|AI生成图像检测发展历程及研究现状

前言:本篇博客系统性梳理AI生成图像检测的研究工作。 「人工智能生成图像检测」研究及发展现状介绍 参考资料 https://fdmas.github.io/AIGCDetect/针对AIGC检测的鲁棒性测试——常见攻击手段汇总论文研读|以真实图像为参考依据的AIGC检测论文研读&…

【TB作品】51单片机 Proteus仿真 基于单片机的LCD12864万年历及温度监测系统设计

实验报告:基于单片机的LCD12864万年历及温度监测系统设计 背景介绍 本实验旨在设计并实现一个基于STC89C52单片机的LCD12864显示的万年历系统,同时集成温度传感器以实现温度监测功能。系统具备整点报时和闹钟功能,通过蜂鸣器进行提示。该设…

【2024_CUMCM】时间序列算法ARMA

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

PingCAP 成为全球数据库管理系统市场增速最快的厂商

近日,Gartner 发布的《Market Share Analysis: Database Management Systems, Worldwide, 2023》(2024 年 6 月)报告显示:“2023 年全球数据库管理系统(DBMS)市场的增长率为 13.4%,略低于去年的…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法,我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法,接下来就为大家一一介绍。 2. 法规介绍 在中国,…

博客搭建-图床篇

我们的博客难免少不了图片,图片管理是一个不小的难题。如果我们将图片全部放到我们自己的服务器上,那么带宽就基本上会被图片所占满了,这会导致网站加载很慢(特别是图片加载很慢)。 ‍ 什么是图床 为了解决图片的问…

Python28-7.5 降维算法之t-分布邻域嵌入t-SNE

t-分布邻域嵌入(t-distributed Stochastic Neighbor Embedding,t-SNE)是一种用于数据降维和可视化的机器学习算法,尤其适用于高维数据的降维。t-SNE通过将高维数据嵌入到低维空间(通常是二维或三维)中&…

大数据之路 读书笔记 Day4 数据同步

回顾: Day 3 总结了无限客户端的日志采集 大数据之路 读书笔记 Day 3Day 2总结了浏览器端的日志采集 大数据之路 读书笔记 Day 2 数据同步 阿里数据体系中的数据同步,主要指的是在不同的数据存储系统之间进行数据的传输与更新,以保证数据的一…