实验2 Aprori关联挖掘算法

news2024/11/22 21:12:42

目 录

一、实验目的... 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])

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

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

相关文章

《ClipCap》论文笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap: CLIP Prefix for Image Captioning 一言以蔽之:使用 CLIP 编码作为标题的前缀,使用简单的映射网络,然后微调语言模型…

EN-SLAM:Implicit Event-RGBD Neural SLAM解读

论文路径:https://arxiv.org/pdf/2311.11013.pdf 目录 1 论文背景 2 论文概述 2.1 神经辐射场(NeRF) 2.2 事件相机(Event Camera) 2.3 事件时间聚合优化策略(ETA) 2.4 可微分的CRF渲染技术…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

不是哥们?你怎么抖成这样了?求你进来学学防抖吧!全方位深入剖析防抖的奥秘

前言 古有猴哥三打白骨精,白骨精 > 噶 今有用户疯狂点请求,服务器 > 噶 所以这防抖咱必须得学会!!! 本文就来讲解一下Web前端中防抖的奥秘吧!!!! 为什么要做防…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型,为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量,边界距离、骨料大小等参数。程序已调通,可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

盘点8款国内顶尖局域网监控软件(2024年国产局域网监控软件排名)

局域网监控软件对于企业网络管理至关重要,它们可以帮助IT部门维护网络安全,优化网络性能,同时监控和控制内部员工的网络使用行为。以下是八款备受推崇的局域网监控软件,每一款都有其独特的优势和适用场景。 1.安企神软件 试用版领…

CompletionService

必备知识: 三种创建线程的方式 java线程池 CompletionService是Java并发库中的一个接口,用于简化处理一组异步任务的执行和结果收集。它结合了Executor和BlockingQueue的功能,帮助管理任务的提交和完成。CompletionService的主要实现类是Exe…

python破解字母已知但大小写未知密码

python穷举已知字符串中某个或多个字符为大写的所有情况 可以使用递归函数来实现这个功能。以下是一个示例代码: def generate_uppercase_combinations(s, index0, current):if index len(s):print(current)returngenerate_uppercase_combinations(s, index 1, …

如何保证接口幂等性

如何保证接口幂等性 1、幂等性是什么? 接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了不同的结果。 2、使用幂等性的场景有哪些? 页面点击保存按钮时,不小心快速点了两次…

BUUCTF[PWN][fastbin attack]

fastbin_attack例题 题目:[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap) 整体思路:利用编辑时edit_heap函数的栈溢出漏洞,覆盖heaparray中的栈指针指向free的got表,将其改为system的plt表&…

Bert入门-使用BERT(transformers库)对推特灾难文本二分类

Kaggle入门竞赛-对推特灾难文本二分类 这个是二月份学习的,最近整理资料所以上传到博客备份一下 数据在这里:https://www.kaggle.com/competitions/nlp-getting-started/data github(jupyter notebook):https://gith…

C语言指针函数指针

跟着这篇文章重新理解了一下:彻底攻克C语言指针 有一个例子感觉可以拿出来看看: char *(*c[10])(int **p); * 这段声明定义了一个长度为10的数组c,数组中的每个元素都是指向函数的指针。每个函数接受一个类型为int **(指向指向…

【SpringCloud应用框架】Nacos集群架构说明

第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止,已经完成了对Nacos的一些基本使用和配置,接下来还需要了解一个非常重要的点,就是Nacos的集群相关的…

用PlantUML和语雀画UML类图

概述 首先阐述一下几个简单概念: UML:是统一建模语言(Unified Modeling Language)的缩写,它是一种用于软件工程的标准化建模语言,旨在提供一种通用的方式来可视化软件系统的结构、行为和交互。UML由Grady…

一.7.(2)基本运算电路,包括比例运算电路、加减运算电路、积分运算电路、微分电路等常见电路的分析、计算及应用;(未完待续)

what id the 虚短虚断虚地? 虚短:运放的正相输入端和反相输入端貌似连在一起了,所以两端的电压相等,即UU- 虚断:输入端输入阻抗无穷大 虚地:运放正相输入端接地,导致U=U-=0。 虚…

远心镜头简介

一、远心镜头 大家都有这种印象,一个物体在人眼看来,会有近大远小的现象。这是因为物体近的时候,在视网膜上投影大,小的时候,投影小。镜头也是一样,因为近大远小的原因,会产生误差。特别是在做尺…

通信协议_Modbus协议简介

概念介绍 Modbus协议:一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De f…

Java里的Arrary详解

DK 中提供了一个专门用于操作数组的工具类,即Arrays 类,位于java.util 包中。该类提供了一些列方法来操作数组,如排序、复制、比较、填充等,用户直接调用这些方法即可不需要自己编码实现,降低了开发难度。 java.util.…

DC-DC充放电原理

文章目录 前言1. 电子器件1.1 电容1.2 电感 2. 升压电路3. 降压电路4. 电压均衡电路4.1 被动均衡4.2 主动均衡 5. 我的疑问5.1 对于升压电路,怎么设计升压到多少V后,停止升压?5.2 什么是等效电阻?5.3 快充是如何实现的&#xff1f…

探索InitializingBean:Spring框架中的隐藏宝藏

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ 👋 Spring框架的浩瀚海洋中&#x…