当前位置: 首页 > news >正文

机器学习实践:超市商品购买关联规则分析

第2关:动手实现Apriori算法

任务描述

本关任务:编写 Python 代码实现 Apriori 算法。

相关知识

为了完成本关任务,你需要掌握 Apriori 算法流程。

Apriori 算法流程

Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。

所以 Apriori 算法的伪代码如下:

 
  1. while 集合中的项的个数 > 0:
  2. 构建一个由 k 个项组成的候选项集的列表
  3. 确认每个项集都是频繁的
  4. 保留频繁项集并构建 k+1 项组成的候选项集的列表

从整个算法的流程来看,首先需要实现一个能够构建只有一个项集的函数,代码如下:

 
  1. # 构建只有一个元素的项集, 假设dataSet为[[1, 2], [0, 1]. [3, 4]]
  2. # 那么该项集为frozenset({0}), frozenset({1}), frozenset({2}),frozenset({3}), frozenset({4})
  3. def createC1(dataset):
  4. C1 = set()
  5. for t in dataset:
  6. for item in t:
  7. item_set = frozenset([item])
  8. C1.add(item_set)
  9. return C1

有了从无到有之后,接下来需要从 1 到 K 。不过需要注意的是,这个时候需要排除掉支持度小于最小支持度的项集。代码实现如下:

 
  1. # 从只有k个元素的项集,生成有k+1个元素的频繁项集,排除掉支持度小于最小支持度的项集
  2. # D为数据集,ck为createC1的输出,minsupport为最小支持度
  3. def scanD(D, ck, minsupport):
  4. ssCnt = {}
  5. for tid in D:
  6. for can in ck:
  7. if can.issubset(tid):
  8. if can not in ssCnt.keys():
  9. ssCnt[can] = 1
  10. else:
  11. ssCnt[can] += 1
  12. numItems = len(D)
  13. reList = []
  14. supportData = {}
  15. for key in ssCnt:
  16. support = ssCnt[key]/numItems
  17. if support >= minsupport:
  18. reList.insert(0, key)
  19. supportData[key] = support
  20. #reList为有k+1个元素的频繁项集,supportData为频繁项集对应的支持度
  21. return reList, supportData

这就完了吗?还没有!我们还需要一个能够实现构建含有 K 个元素的频繁项集的函数。实现代码如下:

 
  1. #构建含有k个元素的频繁项集
  2. #如输入为{0},{1},{2}会生成{0,1},{0, 2},{1,2}
  3. def aprioriGen(Lk, k):
  4. retList = []
  5. lenLk = len(Lk)
  6. for i in range(lenLk):
  7. for j in range(i+1, lenLk):
  8. L1 = list(Lk[i])[k:-2]
  9. L2 = list(Lk[j])[:k-2]
  10. if L1 == L2:
  11. retList.append(Lk[i] | Lk[j])
  12. return retList

有了这些小功能后,我们就能根据 Apriori 算法的流程来实现 Apriori 算法了。

编程要求

根据提示,在右侧编辑器 Begin-End 补充代码,实现 Apriori 算法。

测试说明

平台会对你编写的代码进行测试,若与预期输出一致,则算通关。

def createC1(dataset):C1 = set()for t in dataset:for item in t:item_set = frozenset([item])C1.add(item_set)return C1def scanD(D, ck, minsupport):ssCnt = {}for tid in D:for can in ck:if can.issubset(tid):if can not in ssCnt.keys():ssCnt[can] = 1else:ssCnt[can] += 1numItems = len(D)reList = []supportData = {}for key in ssCnt:support = ssCnt[key]/numItemsif support >= minsupport:reList.insert(0, key)supportData[key] = supportreturn reList, supportDatadef aprioriGen(Lk, k):retList = []lenLk = len(Lk)for i in range(lenLk):for j in range(i+1, lenLk):L1 = list(Lk[i])[k:-2]L2 = list(Lk[j])[:k-2]if L1 == L2:retList.append(Lk[i] | Lk[j])return retListdef apriori(dataSet,minSupport):# 首先找出最开始的数据项集C1 = createC1(dataSet)D = list(map(set,dataSet))# 把只有一个项集的支持率算出来L1,supportData = scanD(D,C1,minSupport)L = [L1]# 设置关联数k = 2while(len(L[k - 2]) > 0):# 然后开始循环找Ck = aprioriGen(L[k - 2], k)Lk, supK = scanD(D,Ck,minSupport)supportData.update(supK)L.append(Lk)k += 1return L,supportData

第3关:从频繁项集中挖掘关联规则

任务描述

本关任务:编写 Python 代码,实现挖掘关联规则的功能。

相关知识

为了完成本关任务,你需要掌握:关联规则挖掘算法流程。

从频繁项集中挖掘关联规则

要找到关联规则,需要从一个频繁项集开始。我们知道集合中的元素是不重复的,但我们想知道基于这些元素能否获得其他内容。例如某个元素或者某个元素集合可能会推导出另一个元素 。从小卖铺的例子可以得到,如果有一个频繁项集{薯片,西瓜},那么就可能有一条关联规则薯片->西瓜。这意味着如果有人购买了薯片,那么在统计上他会购买西瓜的概率较大。

但是,这一条反过来并不总是成立。也就是说,即使薯片->西瓜统计上显著,那么薯片->西瓜也不一定成立。(从逻辑研究上来讲,箭头左边的集合称作前件,箭头右边的集合称为后件。)

那么怎样挖掘关联规则呢?在发现频繁项集时我们发现的是高于最小支持度的频繁项集,对于关联规则,也是用这种类似的方法。以小卖铺的例子为例,从项集{0, 1, 2, 3}产生的关联规则中,找出可信度高于最小可信度的关联规则。(PS:Apriori 原理对于关联规则同样适用。)

所以,想要根据上一关发现的频繁项集中找出关联规则,需要排除可信度比较小的关联规则,所以首先需要实现计算关联规则的可信度的功能。代码实现如下:

 
  1. # 计算关联规则的可信度,并排除可信度小于最小可信度的关联规则
  2. # freqSet为频繁项集,H为规则右边可能出现的元素的集合,supportData为频繁项集的支持度,brl为存放关联规则的列表,minConf为最小可信度
  3. def calcConf(freqSet, H, supportData, brl, minConf = 0.7):
  4. prunedH = []
  5. for conseq in H:
  6. conf = supportData[freqSet]/supportData[freqSet - conseq]
  7. if conf >= minConf:
  8. brl.append((freqSet - conseq, conseq, conf))
  9. prunedH.append(conseq)
  10. return prunedH

接下来就需要实现从频繁项集中生成关联规则的功能了,实现如下:

 
  1. # 从频繁项集中生成关联规则
  2. # freqSet为频繁项集,H为规则右边可能出现的元素的集合,supportData为频繁项集的支持度,brl为存放关联规则的列表,minConf为最小可信度
  3. def ruleFromConseq(freqSet, H, supportData, brl, minConf = 0.7):
  4. m = len(H[0])
  5. if len(freqSet) > m+1:
  6. Hmp1 = aprioriGen(H, m+1)
  7. Hmp1 = calcConf(freqSet, Hmp1, supporData, brl, minConf)
  8. if len(Hmp1) > 1:
  9. ruleFromConseq(freqSet, Hmp1, supportData, brl, minConf)
编程要求

根据提示,在右侧编辑器 Begin-End 补充代码,将所有知识全部串联起来,实现关联规则生成功能。

测试说明

平台会对你编写的代码进行测试,若与预期输出一致,则算通关

代码:
from utils import apriori, aprioriGendef calcConf(freqSet, H, supportData, brl, minConf = 0.7):prunedH = []for conseq in H:conf = supportData[freqSet]/supportData[freqSet - conseq]if conf >= minConf:brl.append((freqSet - conseq, conseq, conf))prunedH.append(conseq)return prunedHdef ruleFromConseq(freqSet, H, supportData, brl, minConf = 0.7):m = len(H[0])if len(freqSet) > m+1:Hmp1 = aprioriGen(H, m+1)Hmp1 = calcConf(freqSet, Hmp1, supporData, brl, minConf)if len(Hmp1) > 1:ruleFromConseq(freqSet, Hmp1, supportData, brl, minConf)def generateRules(dataset, minsupport, minConf):'''生成关联规则,可以使用apriori函数获得数据集中的频繁项集列表与支持度:param dataset:数据集,类型为list:param minsupport:最小支持度,类型为float:param minConf:最小可信度,类型为float:return:关联规则列表,类型为list'''digRuleList = []L, supportData = apriori(dataset, minsupport)for i in range(1, len(L)):# freqSet为含有i个元素的频繁项集for freqSet in L[i]:H1 = [frozenset([item]) for item in freqSet]if i > 1:# H1为关联规则右边的元素的集合ruleFromConseq(freqSet, H1, supportData, digRuleList, minConf)else:calcConf(freqSet, H1, supportData, digRuleList, minConf)return digRuleList

第4关:超市购物清单关联规则分析

任务描述

本关任务:编写 Python 代码,挖掘出超市购物清单中潜在的关联规则。

相关知识

为了完成本关任务,你需要掌握:将知识运用到实际数据中。

超市购物清单关联规则分析

这里有一份超市的购物清单数据,数据的特征只有 3 个,分别为:交易时间,交易 id 和商品名称。如下图所示:

可以看出,在挖掘关联规则之前,我们需要整理一下数据,即根据交易 id 来将商品信息聚合起来,将数据变成我们关联规则分析算法所需要的形式。

当数据处理好之后,我们就可以使用之前编写的代码,来挖掘该数据的关联规则了。

编程要求

根据提示,在右侧编辑器 Begin-End 处补充代码,实现超市购物清单数据的关联规则挖掘功能。要求如下:

1.将所有商品名称转换为数字,转换关系如下:

 
  1. {'yogurt':1, 'pork':2, 'sandwich bags':3, 'lunch meat':4, 'all- purpose':5, 'flour':6, 'soda':7, 'butter':8, 'vegetables':9, 'beef':10, 'aluminum foil':11, 'dinner rolls':12, 'shampoo':13, 'mixes':14, 'soap':15, 'laundry detergent':16, 'ice cream':17, 'toilet paper':18, 'hand soap':19, 'waffles':20, 'cheeses':21, 'milk':22, 'dishwashing liquid/detergent':23, 'individual meals':24, 'cereals':25, 'tortillas':26, 'spaghetti sauce':27, 'ketchup':28, 'sandwich loaves':29, 'poultry':30, 'bagels':31, 'eggs':32, 'juice':33, 'pasta':34, 'paper towels':35, 'coffee/tea':36, 'fruits':37, 'sugar':38}

2.关联规则列表中的商品必须是转换后的数字。

注意:数据文件为.csv文件,字段名分别为:dateidgood

测试说明

平台会对你编写的代码进行测试,判题程序将自动将数字转换为商品名称:

测试输入:{'min_support':0.2,'min_conf':0.7} 预期输出:

 
  1. eggs->vegetables:0.8378378378378379
  2. juice->vegetables:0.780885780885781
  3. cereals->vegetables:0.7849223946784922
  4. individual meals->vegetables:0.7593457943925235
  5. laundry detergent->vegetables:0.8167053364269142
  6. butter->vegetables:0.7708830548926013
  7. ice cream->vegetables:0.7599118942731278
  8. yogurt->vegetables:0.8310502283105023                             
代码:
from utils import generateRules
import pandas as pddef T(x):m = {'yogurt': 1, 'pork': 2, 'sandwich bags': 3, 'lunch meat': 4, 'all- purpose': 5, 'flour': 6, 'soda': 7, 'butter': 8,'vegetables': 9, 'beef': 10, 'aluminum foil': 11, 'dinner rolls': 12, 'shampoo': 13, 'mixes': 14, 'soap': 15,'laundry detergent': 16, 'ice cream': 17, 'toilet paper': 18, 'hand soap': 19, 'waffles': 20, 'cheeses': 21,'milk': 22, 'dishwashing liquid/detergent': 23, 'individual meals': 24, 'cereals': 25, 'tortillas': 26,'spaghetti sauce': 27, 'ketchup': 28, 'sandwich loaves': 29, 'poultry': 30, 'bagels': 31, 'eggs': 32, 'juice': 33,'pasta': 34, 'paper towels': 35, 'coffee/tea': 36, 'fruits': 37, 'sugar': 38}return m[x]def aprior_data(data):basket = []for id in data['id'].unique():a = [data['good'][i] for i, j in enumerate(data['id']) if j == id]basket.append(a)return basketdef genRules(data_path, min_support, min_conf):# *********Begin*********#data1 = pd.read_csv(data_path)data1['good'] = data1['good'].apply(T)data2 = aprior_data(data1)rult = generateRules(data2, min_support, min_conf)return rult
#*********End*********#

相关文章:

机器学习实践:超市商品购买关联规则分析

第2关:动手实现Apriori算法 任务描述 本关任务:编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务,你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…...

自动化图像识别:提高效率和准确性的新途径

自动化图像识别是人工智能领域中的一项关键技术,它通过算法自动解析图像内容,为各种应用提供准确的信息。随着技术的不断发展,自动化图像识别在提高效率和准确性方面展现出新的途径。 一、深度学习技术的应用 深度学习是自动化图像识别领域…...

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…...

【Qt之OpenGL】01创建OpenGL窗口

1.创建子类继承QOpenGLWidget 2.重写三个虚函数 /** 设置OpenGL的资源和状态,最先调用且调用一次* brief initializeGL*/ virtual void initializeGL() override; /** 设置OpenGL视口、投影等,当widget调整大小(或首次显示)时调用* brief resizeGL* param w* para…...

如何判断代理IP质量?

由于各种原因(从匿名性和安全性到绕过地理限制),代理 IP 的使用变得越来越普遍。然而,并非所有代理 IP 都是一样的,区分高质量和低质量的代理 IP 对于确保流畅、安全的浏览体验至关重要。以下是评估代理 IP 质量时需要…...

2023-2024年Web3行业报告合集(精选13份)

Web3行业报告(精选13份) 2023-2024年 来源:2023-2024年Web3行业报告合集(精选13份) 【以下是资料目录】 2023Web3产业发展现状分析及国内外落地实践报告 2023模块化区块链承载Web3.0应用的新模式 2023年AI应用需求…...

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color:设置文本颜色。 8.font-family:设置字体系列。 9.font-size:设置字体大小。…...

tensorflow学习笔记(2)线性回归-20240507

通过调用Tensorflow计算梯度下降的函数tf.train.GradientDescentOptimizer来实现优化。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- #程序作用: #线性回归:通过调用Tensorflow计算梯度下降的函数tr.train.GradientDescentOptimizer来实现优化。import os …...

【JavaScript】作用域

作用域是指在程序中定义变量的区域,决定了这些变量在哪里可以被访问和使用。JavaScript 中的作用域有全局作用域、函数作用域和块级作用域。 1. 什么是作用域? 作用域是代码中定义变量的区域,它决定了变量的可见性和生命周期。作用域规定了…...

C++程序设计教案

文章目录: 一:软件安装环境 第一种:vc2012 第二种:Dev-C 第三种:小熊猫C 二:语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…...

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你已登录服务器的信息,如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…...

暗区突围pc端下载教程 暗区突围pc端怎么下载

暗区突围pc端下载教程 暗区突围pc端怎么下载 《暗区突围》是一款刺激的第一人称射击游戏。目前pc版本要上线了,即将在5月正式上线。在这款游戏里,我们会在随机的时间、地点,拿着不一定的装备,跟其他玩家拼个高低,还需…...

大数据技术原理与技术简答

1、HDFS中名称节点的启动过程 名称节点在启动时,会将FsImage 的内容加载到内存当中,此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作,使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…...

Mybatis的简介和下载安装

什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的…...

大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议,会发生什么。 所谓松弛感,意思是它允许 “漏洞”,允许可靠传输的不封闭,大致就是:“不求 100% 可靠,只要 90%(或多或少) 可靠,另外 10% 的错误可检测到” or “…...

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …...

AI项目二十一:视频动态手势识别

若该文为原创文章,转载请注明原文出处。 一、简介 人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出…...

浅拷贝与深拷贝面试问题及回答

1. 浅拷贝和深拷贝的区别是什么? 答: 浅拷贝(Shallow Copy)仅复制对象的引用而不复制引用的对象本身,因此原始对象和拷贝对象会引用同一个对象。而深拷贝(Deep Copy)则是对对象内部的所有元素进…...

推荐算法顶会论文合集

SIGIR SIGIR 2022 | 推荐系统相关论文分类整理:8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy_Nw SIGIR2021推荐系统论文集锦 https://mp.weixin.qq.com/s/N7V_9iqLmVI9_W65IQpOtg SIGIR2020推荐系统论文聚焦: https://mp.weixin.qq.com/s…...

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示, 在应用中使用组合模式才有价值。 例如一个场景…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...