数学建模的整体构思


前言

本文主要分享和讲解一下传统意义上数学建模的整个思想和步骤流程,这里以博主参加过的mathorcup和华为杯为例,简要的梳理一下流程和思想,希望能对新手玩家提供一些思路(大神就不要来踩我了,我也只是一个半只脚上岸的萌新,希望能有更多萌新能渡过汪洋)

一、如何选题

选题其实也算个技术活了,毕竟只有三天的时间,不可能等你一个一个的去试,好像哪个可以做出来再去选择,在这里,最好一眼就可以决定要选哪个题目。
对于有较强能力的大神,当然选哪个题目都没有关系,但是对于第一次上手,或者原来都是跟着别人组队混,这回莫名其妙成了主C的参赛选手自然需要好好斟酌一下,对题目多多考量。
这里提供两个方法:
一、打开你的消息网络,在最快的时间内去搜集一下大多数人的选题意向,一般来说,多数人的选题都是会选能与自身能力匹配的题目,而这种题目一般也是大多数人可以完成的题目,我想应该没有人会想着给大赛组织送钱的吧。所以,或得这种小道消息也很有必要性。
二、如果你的人脉没有你想象中那么好,并且你的队员和你一样都是孤狼,那么就快速从题目结构上进行筛选吧。现在的常规题目一般都是以大数据为基础,让你设计一个还算靠谱的模型去解决一些实际问题。记住哈,我这里说的是常规,那就说明还有一堆不常规的问题,这些问题自然也就不进入我们的考虑范围了(比如今年华为杯的A题,设计芯片算法,这就要老命了,完全一点思路都没有)。那么怎么从这些常规题目中去筛选我们可以很好完成的题目呢?首先,跳过题目所涉及的问题背景,因为这些所谓的背景基本对我们解决问题提供不了有用信息,最重要的有用信息基本全在问题中了。这里先不要管几个问,看下问题的连贯性能否达到我以下所述,如有,那么这就是最符合常规的建模问题,也是最容易解决的问题。不扯远了,这里叙述一下我所谓的连贯性是什么?问题首先提供一堆大数据,先让我们剔除空值和数据异常值,等到预处理完成后,从这些数据中去筛选出主要自变量,再通过这些主要自变量进行预测建模,并通过图像和数据来验证你的预测模型是否准确,紧接着就是一个扩展性问题,如:给出合理的价格策略(2020年 mathorcup A题)、辛烷值损失的优化策略(2020年 华为杯数学建模 B题)。抛开扩展问题不谈,只要前面的预处理,寻找主要变量以及预测模型的建立符合你现在所看题目的连贯性,那就别犹豫了,选吧,因为也就这个好做点,符合常规数学建模思想。

二、数据处理手段

对于数据的预处理我想应该大家都应该有自己的手段吧,有目测法(这个属于天赋异禀的高手,我不敢妄自揣度,几十万乃至几百万的数据,确实有点超出人类的极限了),Python的pandas(博主一般主要方法),好像R语言的特性也可以处理数据等等(其他的我就母鸡啦,毕竟我也只用过pandas)。
下面关于panda的一些简易处理:
1.一般的数据都是放在几张excel表里面,那么我们自然需要读取excel表格。

import pandas
df=pd.read_excel('testProject.xlsx')#这个会直接默认读取到这个Excel的第一个表单
print(df)#打印读取到的数据,这里为一个二维数组。

作为基本测试,这里读取到的效果图如下:
pandas读取数据的样式
一般处理数据的手段大部分都是寻找空值并剔除空值或者填充空值。

df.dropna()#剔除掉空值
df.fillna(axis=1,method="ffill")#横向填充空值,axis=1横向,axis=0纵向

对于特殊异常值的处理看有没有一个给定的数值范围,有的话可以直接限制,没有的话,我喜欢用折线图的形式先观察一下,比如:
输入数据样例图
可以看到一个突变值,我们可以在观察数据大概范围后自己规定一个限定范围,当然这种突变很大的值得是极个别数值,若是有大量这样的数据,那么就该视为正常数据(当然对于我本人来说,感觉这样的大突变成了多数的时候,题目得是出了点什么问题)
基本的数据处理方法很多,只是博主喜欢用这些,大家可以网上搜索到大量的数据处理方法,这篇文章旨在是给萌新玩家提供一个完整的做题思路。

三、主要变量筛选

主要变量的寻找主要是为了得到一个自变量和因变量的线性模型,既然最终目的已经很明确,那么我们在这一步的目的自然也很明确了,也就是筛选得到可用的线性变量。
这里的方法也有很多,像文献中也有记载方法,比如熵值法。但是如果数据量过大(比如这次华为杯的数据维度是300多),那么相应的计算复杂度也相应提高了许多,在这个争分夺秒的时刻,耗时过多必然是有弊端的。所以,在这里,博主提出一个快捷,并且不用动脑子的方法,合理利用spss数据分析软件,计算各个自变量和因变量之间的相关性,然后筛选出一些相关性大的变量作为线性模型的输入参数。

四、线性模型的建立

这一步属于机器学习的范畴,如果放在好多年前,这绝对是一道大关,但放在如今,这一问反而成了最简单的一个问。
首先,我们需要确定我们想要的线性模型是什么?这个选择有特别多,为了不让大家犯选择困难症,博主就只说一个,也是我基本都在用的——多元线性回归模型,这个模型的精度很不错,其中内部的主要方法也是很经典的最小二乘法,对于处理线性数据,我觉得这应该是性价比最高的模型了。
可以看到模型的验证效果如下:
多元线性回归模型的图像验证
那么,现在问题来了?我们怎么构造这个模型呢?
这个问题应该大家心里都有数,GitHub去clone啊,百度啊,调包啊等等(至于全部手撸代码的大佬就可以出门右转了,太强了,小弟怕这篇文章承受不住你们的斗宗之气)。的确,这就是最快最好的方法。对于这三个方法,博主发表一点自己的意见。
首先,GitHub上的代码基本都是很完整的大佬代码,可能萌新想要把这段核心代码剪裁出来都要花费一番心思,所以不是很推荐这个方法(当然,读码能力比较强的同学最好采取这种方法,除了做题,对于提升自己实力也是很有帮助)。
至于百度,怎么说呢?太多复制粘贴的了,而且错误有时候就是一大堆,想想就觉得可怕,本来数模搞的人够崩溃的了,现在再来一堆bug,那不是当场去世。
对于第三个调库,市面上关于机器学习的包还是挺多的,博主也同样为了减轻大家的选择困难症,我这里也只提出一个——sklearn(Python)。也算是比较经典的了,而且直接搜它的中文文档还是可以找到比较详尽的。
所以对于和博主一样不想用脑子的同学可以直接选第三个方法,简单粗暴。

四、扩展问题的解决

对于最后的扩展问题,博主实在是不好具体分析,因为各种题目都有不同的扩展方向,所以,在这里博主推荐大家在平时提升自己,以面对不对的需求,比如:智能优化算法等等。

总结

在最后,我需要提一点,就是在组队选队友的时候,一定要有一个代码比较好的,还有一个论文写的比较好的,这样可以最大化的保证工程完成度,和最快的完成速度。
数学建模这种比赛,只要尽大可能的完成所有问题,拿奖不是什么难事,至于拿奖后为了什么,当然是为了加分拿奖学金啊!!有了钱,就可以买更多的建模书,再参加更多的比赛,拿更多的将,在买更多的资料书。。。
是不是想一想都有点开心,哈哈,还是买吃的吧,人活着还是吃的重要。
不聊了,电脑没墨了。。。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页