华为杯数学建模比赛经验分享第二期——编程手篇

news2024/11/25 7:05:42

数学建模比赛中编程手是较为重要的角色,不仅需要根据建模手的思路完成代码的编写,还需要与写作手沟通结果分析与呈现。 所以,编程手必须在不同的阶段完成相应的学习,这里我把它分为赛前和赛中。

1、赛前

在短短4天的学习新的代码并运用起来这对于大多数人来说是困难的,所以需要编程手在赛前多去实战一些代码,包括:预测类、评价类、优化类、机理模型类等。 只有平时积累的多,比赛时才能更快的完成编程任务。 这是对编程手赛前准备的基本要求。

对于预测类的问题,不仅仅是预测模型(BP、SVM、LSTM等)的使用,重要的是对原始数据的预处理,数学建模比赛中给的数据,往往会存在异常值、缺失值等,所以建模手对应就应该在赛前学习或者了解一些异常值剔除的方法代码实现、补齐缺失值的代码,对应的方法我不在这里赘述,大家可以去百度搜索数据清洗的方法。 对于优化类,那就要更加准备一些常用的优化求解器CPLEX、gurobi等,这里要做到能熟悉其编程规则。 对于机理类,以前的赛题中会有传染病模型一类的,我们可以参照这一类模型的思路对类似的问题进行数学建模等。 综上,对建模手来说,要想在数学建模比赛中获奖那就是不断的积累。

2、赛中

比赛中编程手需要根据建模手的思路完成代码的编写,有些时候由于时间问题或者个人编程能力有限,无法完成建模手建立模型的编写。 这时候就需要与建模手进行沟通将模型进行简化,进而完成编程。 其次,编程手也需要把代码的最终数据和初步的实验结果图交给写作手进一步加工。 如果比赛中有充分的时间,我建议编程手可以多用一些方法,举个例子说,在预测类模型中,我们最终选用的模型可能是LSTM,那我们就可以用BP、SVM等一些常规模型作为比较,这也是一个加分项。 值得注意的是,使用了方法对比,那就要在论文中对各类方法的结果进行分析,即告诉评审专家我使用的方法为什么好的问题? 这种问题的回答往往可以在模型的原理介绍中进行描诉,最后在结果分析那一块体现一下即可。 同样地,要在题目分析之后的技术流程图中体现你的方法对比,这样会让你的整个思路更清晰,实验结果更可信。

这里举一个例子:以ECG信号的分类为例。 采用1DCNN和支持向量机进行效果对比。 对应的部分代码如下:

%%1DCNNclear;clc;%% 载入数据;fprintf('Loading data...\n');tic;load('N_dat.mat');load('L_dat.mat');load('R_dat.mat');load('V_dat.mat');fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 控制使用数据量,每一类5000,并生成标签,one-hot编码;fprintf('Data preprocessing...\n');tic;Nb=Nb(1:5000,:);Label1=repmat([1;0;0;0],1,5000);Vb=Vb(1:5000,:);Label2=repmat([0;1;0;0],1,5000);Rb=Rb(1:5000,:);Label3=repmat([0;0;1;0],1,5000);Lb=Lb(1:5000,:);Label4=repmat([0;0;0;1],1,5000);Data=[Nb;Vb;Rb;Lb];Label=[Label1,Label2,Label3,Label4];clear Nb;clear Label1;clear Rb;clear Label2;clear Lb;clear Label3;clear Vb;clear Label4;Data=Data-repmat(mean(Data,2),1,250); %使信号的均值为0,去掉基线的影响;fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 数据划分与模型训练测试;fprintf('Model training and testing...\n');Nums=randperm(20000);      %随机打乱样本顺序,达到随机选择训练测试样本的目的;train_x=Data(Nums(1:10000),:);test_x=Data(Nums(10001:end),:);train_y=Label(:,Nums(1:10000));test_y=Label(:,Nums(10001:end));train_x=train_x';test_x=test_x';cnn.layers = {    struct('type', 'i') %input layer    struct('type', 'c', 'outputmaps', 4, 'kernelsize', 31,'actv','relu') %convolution layer    struct('type', 's', 'scale', 5,'pool','mean') %sub sampling layer    struct('type', 'c', 'outputmaps', 8, 'kernelsize', 6,'actv','relu') %convolution layer    struct('type', 's', 'scale', 3,'pool','mean') %subsampling layer};cnn.output = 'softmax';  %确定cnn结构;                         %确定超参数;opts.alpha = 0.01;       %学习率;opts.batchsize = 16;     %batch块大小;opts.numepochs = 30;     %迭代epoch;cnn = cnnsetup1d(cnn, train_x, train_y);      %建立1D CNN;cnn = cnntrain1d(cnn, train_x, train_y,opts); %训练1D CNN;[er,bad,out] = cnntest1d(cnn, test_x, test_y);%测试1D CNN;[~,ptest]=max(out,[],1);[~,test_yt]=max(test_y,[],1);Correct_Predict=zeros(1,4);                     %统计各类准确率;Class_Num=zeros(1,4);                           %并得到混淆矩阵;Conf_Mat=zeros(4);for i=1:10000    Class_Num(test_yt(i))=Class_Num(test_yt(i))+1;    Conf_Mat(test_yt(i),ptest(i))=Conf_Mat(test_yt(i),ptest(i))+1;    if ptest(i)==test_yt(i)        Correct_Predict(test_yt(i))= Correct_Predict(test_yt(i))+1;    endendACCs=Correct_Predict./Class_Num;fprintf('Accuracy = %.2f%%\n',(1-er)*100);fprintf('Accuracy_N = %.2f%%\n',ACCs(1)*100);fprintf('Accuracy_V = %.2f%%\n',ACCs(2)*100);fprintf('Accuracy_R = %.2f%%\n',ACCs(3)*100);fprintf('Accuracy_L = %.2f%%\n',ACCs(4)*100);figure(1)confusionchart(test_y,ptest)
%%支持向量机clear;clc;%% 载入数据;fprintf('Loading data...\n');tic;load('N_dat.mat');load('L_dat.mat');load('R_dat.mat');load('V_dat.mat');fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 控制使用数据量,每一类5000,并生成标签;fprintf('Data preprocessing...\n');tic;Nb=Nb(1:5000,:);Label1=ones(1,5000);%Label1=repmat([1;0;0;0],1,5000);Vb=Vb(1:5000,:);Label2=ones(1,5000)*2;%Label2=repmat([0;1;0;0],1,5000);Rb=Rb(1:5000,:);Label3=ones(1,5000)*3;%Label3=repmat([0;0;1;0],1,5000);Lb=Lb(1:5000,:);Label4=ones(1,5000)*4;%Label4=repmat([0;0;0;1],1,5000);Data=[Nb;Vb;Rb;Lb];Label=[Label1,Label2,Label3,Label4];Label=Label';clear Nb;clear Label1;clear Rb;clear Label2;clear Lb;clear Label3;clear Vb;clear Label4;Data=Data-repmat(mean(Data,2),1,250); %使信号的均值为0,去掉基线的影响;fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 利用小波变换提取系数特征,并切分训练和测试集;fprintf('Feature extracting and normalizing...\n');tic;Feature=[];for i=1:size(Data,1)    [C,L]=wavedec(Data(i,:),5,'db6');  %% db6小波5级分解;endNums=randperm(20000);      %随机打乱样本顺序,达到随机选择训练测试样本的目的;train_x=Feature(Nums(1:10000),:);test_x=Feature(Nums(10001:end),:);train_y=Label(Nums(1:10000));test_y=Label(Nums(10001:end));[train_x,ps]=mapminmax(train_x',0,1); %利用mapminmax内建函数特征归一化到0,1之间;test_x=mapminmax('apply',test_x',ps);train_x=train_x';test_x=test_x';fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 训练SVM,并测试效果;fprintf('SVM training and testing...\n');tic;model=libsvmtrain(train_y,train_x,'-c 2 -g 1'); %模型训练;[ptest,~,~]=libsvmpredict(test_y,test_x,model); %模型预测;Correct_Predict=zeros(1,4);                     %统计各类准确率;Class_Num=zeros(1,4);Conf_Mat=zeros(4);for i=1:10000    Class_Num(test_y(i))=Class_Num(test_y(i))+1;    Conf_Mat(test_y(i),ptest(i))=Conf_Mat(test_y(i),ptest(i))+1;    if ptest(i)==test_y(i)        Correct_Predict(test_y(i))= Correct_Predict(test_y(i))+1;    endendACCs=Correct_Predict./Class_Num;fprintf('Accuracy_N = %.2f%%\n',ACCs(1)*100);fprintf('Accuracy_V = %.2f%%\n',ACCs(2)*100);fprintf('Accuracy_R = %.2f%%\n',ACCs(3)*100);fprintf('Accuracy_L = %.2f%%\n',ACCs(4)*100);toc;figure(1)confusionchart(test_y,ptest)

结果对比:

1DCNN结果:

图片

图片

SVM结果:

图片

图片

    通过两个模型的结果对比可知,1DCNN明显优于SVM。为什么1DCNN明显优于SVM,那我们可以从算法原理的角度去剖析,这里不做详述。

    

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

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

相关文章

虚拟DOM与diff算法

虚拟DOM与diff算法 snabbdom虚拟DOMdiff算法 snabbdom 是什么:snabbdom是著名的虚拟DOM库,是diff算法的鼻祖,Vue源码借鉴了snabbdom 虚拟DOM 是什么:本质上是存在内存里的 JavaScript 对象 作用:用来描述真实DOM的层…

DA2--获取网站用户数据集的大小

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔): Nowcoder_ID:用户ID…

Vue 使用vue-cli构建SPA项目(超详细)

目录 一、什么是vue-cli 二,构建SPA项目 三、 运行SPA项目 前言: 在我们搭建SPA项目时候,我们必须去检查我们是否搭建好NodeJS环境 cmd窗口输入以下指令:去检查 node -v npm -v 一、什么是vue-cli Vue CLI(Vu…

【智能电表数据接入物联网平台实践】

智能电表数据接入物联网平台实践 设备接线准备设备调试代码实现Modbus TCP Client 读取电表数据读取寄存器数据转成32bit Float格式然后使用modbusTCP Client 读取数据 使用mqtt协议接入物联网平台最终代码实现 设备接线准备 设备调试 代码实现 Modbus TCP Client 读取电表数…

抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

回忆我们需要做的事情: 为了支持 shell 程序的执行,我们需要提供: 1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东…

极客时间:数据结构与算法之美【文章笔记 实践 总结】

原文链接:https://time.geekbang.org/column/intro/100017301 27 | 递归树:如何借助树来求解递归算法的时间复杂度?如何借助树来分析归并排序算法的时间复杂度?如何借助树来分析快速排序算法的时间复杂度?如何借助递归树来分析斐波…

macos (M2芯片)搭建flutter环境

安装的版本3.13.4、电脑上没有安装过android studio、安装过brew 1.在终端运行sudo softwareupdate --install-rosetta --agree-to-license,下图展示安装成功的效果 2.下载以下安装包来获取最新的 stable Flutter SDK 3.解压,⚠️注意下载安装sdk的包名…

沉积物微体古生物鉴定

声明 本文是学习GB-T 42629.4-2023 国际海底区域和公海环境调查规程 第4部分:海洋沉积物物理特性调查. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了国际海底区域和公海环境调查中的沉积物组成、物理力学性质、生物…

第二章 进程与线程 十三、进程互斥的软件实现方法(单标志法、双标志先检查、双标志后检查、Peterson算法)

目录 一、单标志法 1、算法思想 2、具体逻辑 二、双标志先检查 1、算法思想 2、具体逻辑 三、双标志后检查 1、算法思想 2、具体逻辑 四、Peterson算法 1、算法思想 2、具体逻辑 五、总结 一、单标志法 1、算法思想 两个进程在访问完临界区后会把使用临界区的权限…

as-if-serial与happens-before原则详解

文章目录 前言详解解决多线程下的问题 Happens-before原则总结as-if-serial语义happens-before的例子 前言 "as-if-serial"原则是Java内存模型中的一个重要概念。该规则规定:不管怎么重排序(编译期间的重排序,指令级并行的重排序&…

MYSQL存储引擎基础知识介绍

下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别,以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,其优势是访 问的速度快,对事务完整性没有要求或者以 SEL…

怒刷LeetCode的第11天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:迭代 方法二:递归 方法三:指针转向 第二题 题目来源 题目内容 解决方法 方法一:快慢指针 方法二:Arrays类的sort方法 方法三:计数器 方法四…

【Java 基础篇】Java线程组详解

Java线程组是一种用于管理线程的机制,它允许你将线程组化为一个单元,并对组内的线程进行一些操作和控制。本文将详细介绍Java线程组的概念、如何创建和管理线程组,以及线程组的一些常见用法。 什么是线程组? 线程组是一个用于组…

python生成PDF报告

前言 最近接到了一个需求-将项目下的样本信息汇总并以PDF的形式展示出来,第一次接到这种PDF的操作的功能,还是有点慌的,还好找到了reportlab这个包,可以定制化向PDF写内容! 让我们由简入深进行讲解 一、reportlab是…

2023年腾讯云轻量服务器测评:16核 32G 28M 配置CPU测试

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月(支持免费续3个月/送同配置3个月),轻量应用服务器具有100%CPU性能,系统盘为380GB SSD盘,28M带宽下载速度3584KB/秒,月流量6000GB,折合每天…

由于找不到d3dx9_43.dll,无法继续执行代码要怎么解决

D3DX9_43.dll是一个动态链接库文件,它是DirectX的一个组件,主要用于支持一些旧版本的游戏和软件。当电脑缺少这个文件时,可能会导致这些游戏和软件无法正常运行。例如,一些老游戏可能需要D3DX9_43.dll来支持图形渲染等功能。此外&…

二分类问题的解决利器:逻辑回归算法详解(一)

文章目录 🍋引言🍋逻辑回归的原理🍋逻辑回归的应用场景🍋逻辑回归的实现 🍋引言 逻辑回归是机器学习领域中一种重要的分类算法,它常用于解决二分类问题。无论是垃圾邮件过滤、疾病诊断还是客户流失预测&…

git安装配置教程

目录 git安装配置1. 安装git2. git 配置3.生成ssh key:4. 获取生产的密钥3. gitee或者github添加ssh-key4.git使用5. git 使用-本地仓库与远程仓库建立连接第一步:进入项目文件夹,初始化本地仓库第二步:建立远程仓库。 建立远程连接的小技巧 …

strcpy常见的错误

char* arr "handsome"; strcpy(arr, "pretty"); printf("%s\n", arr); 这个程序在编译器上是运行不出来的,因为arr是一个字符串指针,它的值不可以被修改,可以将arr改成字符数组

录屏没有声音怎么办,3个方法教你解决

随着科技的不断发展,人们越来越依赖电子设备进行工作和学习。在这个过程中,录屏已经成为了一种必要的技能。无论是手机还是电脑,我们都可以通过录屏来记录重要的信息。但是,有时候我们在录屏时会发现声音无法正常录制,…