2023 美赛(美国大学生数学建模)思路解析

2023美赛ABCDEF赛题思路解析:

https://blog.csdn.net/dc_sinor/article/details/128779911

1 啤酒和尿布

Apriori算法是一种用于挖掘数据集内部关联规则的算法,“apriori”在拉丁语中翻译为“来自以前”,听意思你应该就能猜到了,这个算法是用先验知识来预测数据的关联规则的。

说到关联规则,有一个很有名的案例——啤酒与尿布。说,美国一家连锁店发现很多男性会在周四购买尿布和啤酒,这两种看似不相干的商品之间显现出强相关性,于是商家可以将啤酒货架放在尿布货架旁边以增加收益。

那么,啤酒与尿布的关系是如何被发现的呢?当然是通过关联算法,我们从Apriori算法开始吧,利用Apriori进行关联分析。

2 Apriori原理

先介绍两个概念

  • 支持度support:数据集中包含该项集的数据所占数据集的比例,度量一个集合在原始数据中出现的频率
  • 置信度confidence:是针对一条关联规则来定义的,a->b的置信度=支持度{a|b}/支持度{a},a|b表示ab的并集

关联分析有两个目标:

  • 发现频繁项集(频繁项集是满足最小支持度要求的项集,它给出经常在一起出现的元素项)
  • 发现关联规则(关联规则意味着元素项之间“如果…那么…”的关系)

Apriori原理

如果某个项集是频繁的,那么它的所有子集也是频繁的
如果某个项集是非频繁的,那么它的所有超集也是非频繁的
基于此,Apriori算法从单元素项集开始,通过组合满足最小支持度的项集来形成更大的集合
其实Apriori就是通过排除法来选择频繁项集和关联规则,下面我们根据这样的原理用python实现算法。

3 Apriori代码实现

3.1 挖掘频繁项集

挖掘频繁项集的逻辑如下图

#加载数据集
def loadDataSet():return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]#选取数据集的非重复元素组成候选集的集合C1
def createC1(dataSet):C1=[]for transaction in dataSet: #对数据集中的每条购买记录for item in transaction: #对购买记录中的每个元素if [item] not in C1: #注意,item外要加上[],便于与C1中的[item]对比C1.append([item])C1.sort()return list(map(frozenset,C1)) #将C1各元素转换为frozenset格式,注意frozenset作用对象为可迭代对象#由Ck产生Lk:扫描数据集D,计算候选集Ck各元素在D中的支持度,选取支持度大于设定值的元素进入Lk
def scanD(D,Ck,minSupport):ssCnt={}for tid in D: #对数据集中的每条购买记录for can in Ck: #遍历Ck所有候选集if can.issubset(tid): #如果候选集包含在购买记录中,计数+1ssCnt[can]=ssCnt.get(can,0)+1numItems=float(len(D)) #购买记录数retList=[] #用于存放支持度大于设定值的项集supportData={} #用于记录各项集对应的支持度for key in ssCnt.keys():support=ssCnt[key]/numItemsif support>=minSupport:retList.insert(0,key)supportData[key]=supportreturn retList,supportData#由Lk产生Ck+1
def aprioriGen(Lk,k): #Lk的k和参数k不是同一个概念,Lk的k比参数k小1retList=[]lenLk=len(Lk)for i in range(lenLk):for j in range(i+1,lenLk): #比较Lk中的每一个元素与其他元素L1=list(Lk[i])[:k-2];L2=list(Lk[j])[:k-2]L1.sort();L2.sort()if L1==L2: #若前k-2项相同,则合并这两项retList.append(Lk[i]|Lk[j])return retList#Apriori算法主函数
def apriori(dataSet,minSupport=0.5):C1=createC1(dataSet)D=list(map(set,dataSet))L1,supportData=scanD(D,C1,minSupport)L=[L1]k=2while len(L[k-2])>0: #当L[k]为空时,停止迭代Ck=aprioriGen(L[k-2],k) #L[k-2]对应的值是Lk-1Lk,supK=scanD(D,Ck,minSupport)supportData.update(supK)L.append(Lk)k+=1return L,supportData

我们来测试一下

dataset=loadDataSet()
C1=createC1(dataset)
D=list(map(set,dataset))
L1,supportData0=scanD(D,C1,0.5)
L,supportData=apriori(dataset,minSupport=0.5)


可以看到,频繁项集如上图,{1,2,3,5,{2,3},{3,5},{2,5},{1,3},{2,3,5}}都是频繁项集。得到了频繁项集,接下来我们看看频繁项集之间的关联规则。

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

挖掘关联规则原理如下:若某条规则不满足最小置信度要求,则该规则的所有子集也不满足最小置信度要求

# 主函数,由频繁项集以及对应的支持度,得到各条规则的置信度,选择置信度满足要求的规则为关联规则
# 为了避免将所有数据都对比一遍,采用与上述相同的逻辑减少计算量——一层一层计算筛选
def generateRules(L,supportData,minConf=0.7):bigRuleList=[]for i in range(1,len(L)):for freqSet in L[i]:H1=[frozenset([item]) for item in freqSet] # H1是频繁项集单元素列表,是关联规则中a->b的b项if i>1:rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)else:calConf(freqSet,H1,supportData,bigRuleList,minConf)return bigRuleList# 置信度计算函数
def calConf(freqSet,H,supportData,brl,minConf=0.7):prunedH=[] # 用于存放置信度满足要求的关联规则的b项,即“提纯后的H”for conseq in H:conf=supportData[freqSet]/supportData[freqSet-conseq]if conf>=minConf:print (freqSet-conseq,'-->',conseq,'conf:',conf)brl.append([freqSet-conseq,conseq,conf])prunedH.append(conseq)return prunedH# 关联规则合并函数
def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):m=len(H[0])if len(freqSet)>(m+1): #查看频繁项集freqSet是否大到可以移除大小为m的子集Hmp1=aprioriGen(H,m+1) # 从Hm合并Hm+1Hmp1=calConf(freqSet,Hmp1,supportData,brl,minConf)if len(Hmp1)>1: #若合并后的Hm+1的元素大于1个,则继续合并rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)


可以看到,如果有5那么必定有2,如果有3,那么66.7%的可能性有2,5……

3.3 总结

本文简述关联分析算法Apriori算法的原理,然后用python3进行了实操,需要注意的是,Apriori算法的缺点——每次增加频繁项集大小时(即Ck->Lk时),算法需要重新扫描整个数据集,当数据集很大时,算法效率很低。

解决方法是FP-Growth算法,这个算法我们下一次讲解。

2023 美赛(美国大学生数学建模)思路解析

2023美赛ABCDEF赛题思路解析:

https://blog.csdn.net/dc_sinor/article/details/128779911

2023美国大学生数学建模思路 - 案例:Apriori-关联规则挖掘算法相关推荐

  1. 2022高教社杯数学建模思路 - 案例:粒子群算法

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/126211983 1 ...

  2. 2023美国大学生数学建模竞赛Y题思路解析

    如下为美赛春季赛Y题思路解析: Problem Y: Understanding Used Sailboat Prices 像许多奢侈品一样,帆船的价值随着它们的年龄和市场状况的变化而变化.所附的&q ...

  3. 2023美国大学生数学建模竞赛(美赛)思路代码

    2023美国大学生数学建模竞赛(美赛)思路&代码 报名 时间节点 比赛说明 问题A(数据分析题):收干旱影响的植物群落(MCM) 第一问 第二问 问题B(仿真建模题):重塑马赛马拉(MCM) ...

  4. 2023美赛思路2023美国大学生数学建模竞赛思路

    2023美赛思路2023美国大学生数学建模竞赛思路 2023美赛ABCDEF题思路 给大家分享一下数模美赛中的那些论文摘要写作中的格式规范. 本文参考来源:美赛资料网 首先我们看一下一篇论文的写作重要 ...

  5. 2023美赛数学建模思路 - 案例:线性回归

    2023 美赛(美国大学生数学建模)思路解析 2023美赛ABCDEF赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/128779911 ...

  6. 2023美国大学生数学建模竞赛C题思路解析(含代码+数据可视化)

    以下为2023美国大学生数学建模竞赛C题思路解析(含代码+数据可视化) 规则: 猜词,字母猜对,位置不对为黄色,位置对为绿色,两者皆不对为灰色. 困难模式下的要求:对于猜对的字母(绿色和灰色),下一步 ...

  7. 2023美国大学生数学建模竞赛(美赛)E题解读思路基本模型

    2023美国大学生数学建模竞赛(美赛)E题解读&思路&基本模型[大佬慎入] 一.赛题解读 (一)赛题翻译 (二)核心思路 二.具体思路 (一)问题一 (二)问题二 (三)问题三 (四) ...

  8. 2023美国大学生数学建模竞赛(春季赛)选题建议

    2023美国大学生数学建模竞赛(春季赛)选题建议 C君认为的难度:Y=Z(均较易),开放度:Y<Z . Y题 了解二手帆船价(Understanding Used Sailboat Prices ...

  9. 2023美国大学生数学建模竞赛E题光污染完整数据集和求解代码分享

    目录 数据集收集 GeoNames 地理数据集 全球各国的经纬度数据集 协调一致的全球夜间灯光(1992 - 2018)数据集 NASA 的 EaN Blue Marble 2016 数据集 全球夜间 ...

最新文章

  1. 无需3D运动数据训练,最新人体姿势估计方法达到SOTA | CVPR 2020
  2. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)
  3. Python3 1-100之间数字求和运算代码示例
  4. python type instance_Python type, types and isinstance()使用
  5. Oracle PL/SQL语言初级教程
  6. caffe学习日记--lesson8:站在巨人的肩膀上, denny的学习专栏——徐其华——caffe
  7. Spring4 快速入门
  8. 常见 HTTP/FTP/WebSocket 错误代码大全 - 转
  9. 小波同态滤波 matlab,简单的同态滤波(matlab)
  10. AdventureWorks数据库数据字典研究
  11. 淘宝SKU组合查询算法实现
  12. 2022 年 GIS 就业状况
  13. 计算机除数的时候怎么会有分数,在做除法运算时,为什么0不能做除数?
  14. 房贷计算器移动端接口
  15. [渝粤教育] 西南科技大学 律师实务 在线考试复习资料2021版(1)
  16. ElementUI中的 Cascader 级联选择器 卡顿问题
  17. PG服务进程(Postgres)——BeginReportingGUCOptions向客户端汇报GUC
  18. SQL Server附加数据库失败,823错误。
  19. Android开发——获取并生成唯一识别码
  20. Arduino开发实例-DIY简单脉搏血氧仪(基于MAX30100)

热门文章

  1. Ubuntu分辨率调整
  2. Java程序员从京东、阿里、携程面试回来, 已成功拿到京东offer
  3. (十九)WebGIS中I查询的原理及设计(包含AGS、GeoServer、Supermap)
  4. python:实现SlopeOne算法(附完整源码)
  5. PaddleHub实现交通标志识别
  6. KeePass 中文汉化之通过繁体汉化版本文件快速转换为简体中文版本
  7. KeePass 2.42.1 简体中文翻译
  8. 陈天奇的机器学习编译课(免费)
  9. 三星s6 html5测试分数,三星S6 Edge跑分测试出炉
  10. 《乐高EV3机器人搭建与编程》——1.6 小结