0 前言

本人HIT计算机研在读,专业带队数学建模,长期更新建模教学,有需要的同学欢迎讨论~
本篇文章,学长列举一部分数学建模常用算法,会陆续更新每个算法的详细实现和使用教程。

1 算法原理与流程

CBA算法作为分类算法,他的分类情况也就是给定一些预先知道的属性,然后叫你判断出他的决策属性是哪个值。判断的依据就是Apriori算法挖掘出的频繁项,如果一个项集中包含预先知道的属性,同时也包含分类属性值,然后我们计算此频繁项能否导出已知属性值推出决策属性值的关联规则,如果满足规则的最小置信度的要求,那么可以把频繁项中的决策属性值作为最后的分类结果。具体的算法细节如下:

1、输入数据记录,就是一条条的属性值。

2、对属性值做数字的替换(按照列从上往下寻找属性值),就类似于Apriori中的一条条事务记录。

3、根据这个转化后的事务记录,进行Apriori算法计算,挖掘出频繁项集。

4、输入查询的属性值,找出符合条件的频繁项集(需要包含查询属性和分类决策属性),如果能够推导出这样的关联规则,就算分类成功,输出分类结果。

算法实现

这里给出CBA关联分析的实现类:

package DataMining_CBA;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import DataMining_CBA.AprioriTool.AprioriTool;
import DataMining_CBA.AprioriTool.FrequentItem;/*** CBA算法(关联规则分类)工具类* * @author lyq* */
public class CBATool {// 年龄的类别划分public final String AGE = "Age";public final String AGE_YOUNG = "Young";public final String AGE_MIDDLE_AGED = "Middle_aged";public final String AGE_Senior = "Senior";// 测试数据地址private String filePath;// 最小支持度阈值率private double minSupportRate;// 最小置信度阈值,用来判断是否能够成为关联规则private double minConf;// 最小支持度private int minSupportCount;// 属性列名称private String[] attrNames;// 类别属性所代表的数字集合private ArrayList<Integer> classTypes;// 用二维数组保存测试数据private ArrayList<String[]> totalDatas;// Apriori算法工具类private AprioriTool aprioriTool;// 属性到数字的映射图private HashMap<String, Integer> attr2Num;private HashMap<Integer, String> num2Attr;public CBATool(String filePath, double minSupportRate, double minConf) {this.filePath = filePath;this.minConf = minConf;this.minSupportRate = minSupportRate;readDataFile();}/*** 从文件中读取数据*/private void readDataFile() {File file = new File(filePath);ArrayList<String[]> dataArray = new ArrayList<String[]>();try {BufferedReader in = new BufferedReader(new FileReader(file));String str;String[] tempArray;while ((str = in.readLine()) != null) {tempArray = str.split(" ");dataArray.add(tempArray);}in.close();} catch (IOException e) {e.getStackTrace();}totalDatas = new ArrayList<>();for (String[] array : dataArray) {totalDatas.add(array);}attrNames = totalDatas.get(0);minSupportCount = (int) (minSupportRate * totalDatas.size());attributeReplace();}/*** 属性值的替换,替换成数字的形式,以便进行频繁项的挖掘*/private void attributeReplace() {int currentValue = 1;int num = 0;String s;// 属性名到数字的映射图attr2Num = new HashMap<>();num2Attr = new HashMap<>();classTypes = new ArrayList<>();// 按照1列列的方式来,从左往右边扫描,跳过列名称行和id列for (int j = 1; j < attrNames.length; j++) {for (int i = 1; i < totalDatas.size(); i++) {s = totalDatas.get(i)[j];// 如果是数字形式的,这里只做年龄类别转换,其他的数字情况类似if (attrNames[j].equals(AGE)) {num = Integer.parseInt(s);if (num <= 20 && num > 0) {totalDatas.get(i)[j] = AGE_YOUNG;} else if (num > 20 && num <= 40) {totalDatas.get(i)[j] = AGE_MIDDLE_AGED;} else if (num > 40) {totalDatas.get(i)[j] = AGE_Senior;}}if (!attr2Num.containsKey(totalDatas.get(i)[j])) {attr2Num.put(totalDatas.get(i)[j], currentValue);num2Attr.put(currentValue, totalDatas.get(i)[j]);if (j == attrNames.length - 1) {// 如果是组后一列,说明是分类类别列,记录下来classTypes.add(currentValue);}currentValue++;}}}// 对原始的数据作属性替换,每条记录变为类似于事务数据的形式for (int i = 1; i < totalDatas.size(); i++) {for (int j = 1; j < attrNames.length; j++) {s = totalDatas.get(i)[j];if (attr2Num.containsKey(s)) {totalDatas.get(i)[j] = attr2Num.get(s) + "";}}}}/*** Apriori计算全部频繁项集* @return*/private ArrayList<FrequentItem> aprioriCalculate() {String[] tempArray;ArrayList<FrequentItem> totalFrequentItems;ArrayList<String[]> copyData = (ArrayList<String[]>) totalDatas.clone();// 去除属性名称行copyData.remove(0);// 去除首列IDfor (int i = 0; i < copyData.size(); i++) {String[] array = copyData.get(i);tempArray = new String[array.length - 1];System.arraycopy(array, 1, tempArray, 0, tempArray.length);copyData.set(i, tempArray);}aprioriTool = new AprioriTool(copyData, minSupportCount);aprioriTool.computeLink();totalFrequentItems = aprioriTool.getTotalFrequentItems();return totalFrequentItems;}/*** 基于关联规则的分类* * @param attrValues*            预先知道的一些属性* @return*/public String CBAJudge(String attrValues) {int value = 0;// 最终分类类别String classType = null;String[] tempArray;// 已知的属性值ArrayList<String> attrValueList = new ArrayList<>();ArrayList<FrequentItem> totalFrequentItems;totalFrequentItems = aprioriCalculate();// 将查询条件进行逐一属性的分割String[] array = attrValues.split(",");for (String record : array) {tempArray = record.split("=");value = attr2Num.get(tempArray[1]);attrValueList.add(value + "");}// 在频繁项集中寻找符合条件的项for (FrequentItem item : totalFrequentItems) {// 过滤掉不满足个数频繁项if (item.getIdArray().length < (attrValueList.size() + 1)) {continue;}// 要保证查询的属性都包含在频繁项集中if (itemIsSatisfied(item, attrValueList)) {tempArray = item.getIdArray();classType = classificationBaseRules(tempArray);if (classType != null) {// 作属性替换classType = num2Attr.get(Integer.parseInt(classType));break;}}}return classType;}/*** 基于关联规则进行分类* * @param items*            频繁项* @return*/private String classificationBaseRules(String[] items) {String classType = null;String[] arrayTemp;int count1 = 0;int count2 = 0;// 置信度double confidenceRate;String[] noClassTypeItems = new String[items.length - 1];for (int i = 0, k = 0; i < items.length; i++) {if (!classTypes.contains(Integer.parseInt(items[i]))) {noClassTypeItems[k] = items[i];k++;} else {classType = items[i];}}for (String[] array : totalDatas) {// 去除ID数字号arrayTemp = new String[array.length - 1];System.arraycopy(array, 1, arrayTemp, 0, array.length - 1);if (isStrArrayContain(arrayTemp, noClassTypeItems)) {count1++;if (isStrArrayContain(arrayTemp, items)) {count2++;}}}// 做置信度的计算confidenceRate = count1 * 1.0 / count2;if (confidenceRate >= minConf) {return classType;} else {// 如果不满足最小置信度要求,则此关联规则无效return null;}}/*** 判断单个字符是否包含在字符数组中* * @param array*            字符数组* @param s*            判断的单字符* @return*/private boolean strIsContained(String[] array, String s) {boolean isContained = false;for (String str : array) {if (str.equals(s)) {isContained = true;break;}}return isContained;}/*** 数组array2是否包含于array1中,不需要完全一样* * @param array1* @param array2* @return*/private boolean isStrArrayContain(String[] array1, String[] array2) {boolean isContain = true;for (String s2 : array2) {isContain = false;for (String s1 : array1) {// 只要s2字符存在于array1中,这个字符就算包含在array1中if (s2.equals(s1)) {isContain = true;break;}}// 一旦发现不包含的字符,则array2数组不包含于array1中if (!isContain) {break;}}return isContain;}/*** 判断频繁项集是否满足查询* * @param item*            待判断的频繁项集* @param attrValues*            查询的属性值列表* @return*/private boolean itemIsSatisfied(FrequentItem item,ArrayList<String> attrValues) {boolean isContained = false;String[] array = item.getIdArray();for (String s : attrValues) {isContained = true;if (!strIsContained(array, s)) {isContained = false;break;}if (!isContained) {break;}}if (isContained) {isContained = false;// 还要验证是否频繁项集中是否包含分类属性for (Integer type : classTypes) {if (strIsContained(array, type + "")) {isContained = true;break;}}}return isContained;}}

最后

数学建模精选资料共享,研究生学长数模指导,建模比赛思路分享,关注我不迷路!

建模指导,比赛协助,有问必答,欢迎打扰

数学建模教程:CBA-基于关联规则的分类算法相关推荐

  1. 数学建模清风第二次直播:模拟退火算法

    学习网址:课件下载 数学建模清风第一次直播:传染病模型和微分方程拟合 数学建模清风第二次直播:模拟退火算法 数学建模清风第三次直播:excel在数学建模中的应用 博客笔记: 数学建模清风第一次直播:传 ...

  2. 数学建模学习笔记(八)——分类模型

    文章目录 一.分类模型综述 二.逻辑回归 三.两点分布(伯努利分布) 四.连接函数的取法 五.Logistic回归模型 六.在SPSS中进行二元Logistic回归 七.预测结果较差的解决 八.Fis ...

  3. 数学建模竞赛必须要掌握的十个算法

    数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称"国赛").美国大学生数学建模竞赛(俗称"美赛")等等.在这些比赛中取得好成绩 ...

  4. 2022高教社杯数学建模思路 - 案例:BIRCH-层次聚类算法

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

  5. 备战数学建模国赛,快速搞定算法模型!

    全世界只有3.14 % 的人关注了 青少年数学之旅 说到数学建模,大家的第一反应就是国赛.美赛等数学建模比赛,但这只是冰山一角,不过这个反应却也很正常,因为很多小伙伴接触数学建模的契机,大部分还是因为 ...

  6. 基于关联规则的推荐算法

    1.1算法简介 基于关联规则的推荐是根据历史数据统计不同规则出现的关系,形如:X->Y,表示X事件发生后,Y事件会有一定概率发生,这个概率是通过历史数据统计而来.关联规则的目的在于在一个数据集中 ...

  7. 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题) 蚁群算法解决旅行商问题(最优路径问题) 节约里程算法

  8. Python数学建模系列(六):蒙特卡洛算法

    文章目录 前言 往期文章 1.蒙特卡洛算法 样例1 样例2 样例3 2.三门问题 3.M*M豆问题 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   ...

  9. 华为杯数学建模E题UWB精确定位一等奖算法思路

    (之前的草稿..)上上..上周五也就是十号的时候,我在玩乒乓球,结束的时候,我打开了手机,发现我qq微信短信超多,原来是获得了数学建模国家一等奖,大家纷纷送来了祝福,第一次参加,从查看论文到设计算法, ...

  10. 通信基站c语言,[转]2015年数学建模C题–基于无线通信基站的室内三维定位问题...

    之前做的一题跟大家分享一下,实际该题数据出的有点问题(个人看法不喜勿喷).这题主要是做基站定位的,方法主要是用的基于几何的方法.该题总共四题,由于只有测试case可以验证性能,非测试case的结果我就 ...

最新文章

  1. 使用Httpclient来替代客户端的jsonp跨域解决方案
  2. C++笔记-二维棋盘数组转邻接表(使用QTL)
  3. 深圳人才引进,大学生,公司的福利
  4. ffmpeg -acodec列表
  5. 《Android Property
  6. Win11cpu不支持怎么办,Win11cpu不支持解决方法
  7. CentOS 7伪分布式方式安装Hadoop-2.6.0-cdh5.6.0并且通过主机浏览器访问hadoop工作台
  8. matlab俄罗斯方块说明,俄罗斯方块MATLAB版的代码
  9. C#操作-LX3600非接触式IC卡读写器
  10. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)
  11. 逻辑思维语音01——麦当劳
  12. 用float/double定义可以输入整数
  13. 微信公众号发布消息不消耗群发次数怎么实现
  14. saiku安装方法总结
  15. 期货中的期什么意思(期货什么意思是什么)
  16. 【解决方案】幼儿园安全事件频发,EasyCVR搭建幼教行业连锁园区视频监控系统让家长更放心
  17. java观看视频次数_java数字转换视频播放次数等
  18. element cascader组件动态加载数据
  19. git 2.33.1 访问服务器报Permission denied (publickey)
  20. python爬取微信小程序源代码_爬虫爬取微信小程序

热门文章

  1. QPSK信号在高斯信道、瑞利信道、Ricean信道下的误码率仿真(matlab)
  2. 博弈论基础-蒋文华(浙大)
  3. 「网络流 24 题」负载平衡
  4. 《成语接龙》之成语表
  5. 佩服Google敏锐和创意!人肉搜索引擎志愿者招募
  6. Cisco Packet Tracer思科模拟器中OSPF动态路由配置
  7. cutftp.exe
  8. 支持移动触摸的jQuery图片Lightbox插件 1
  9. 装箱问题 vijos
  10. 以未来式计算机为题目的作文,未来式科技想象作文