p2p|大一小白的数模比赛(灰色关联度和灰色预测)附Matlab代码


目录
文章目录
前言
一、我都干了什么
二、两个数学模型
【p2p|大一小白的数模比赛(灰色关联度和灰色预测)附Matlab代码】1.灰色关联度
2.灰色系统预测
总结
前言 五一期间因为疫情出不了省,没法去玩,但也不能让自己闲着,和同学组队参加了学校的知行杯数模比赛。我们三个人都是纯小白,但还是通过自己的努力完成了一道题目(对不对暂且不说,对于我来说还是学到了很多东西的)。所以就当日记了,记录一下自己的憨憨经历。(可能之后再看,会觉得现在的自己很好笑)

一、我都干了什么 主要集中在我们这道题目的第二问,需要根据2019年到2021年36个月的烟草销售数据,得出最能影响烟草销量的因素,并且预测2022年12个月的烟草销量。题目是很简单,但是总共13个影响因素,36个月,13*36个数据集中在几十个文档中需要我去寻找。没办法不会用python遍历Excel表格。所以我只能一个个打开,用Excel的筛选,查找慢慢的处理几十个Excel表格,单单这个任务就花了我两个多小时。
当我考虑怎么去预测2022年的销量时,我们旁边一个数模小队叽叽喳喳一个词“神经网络”,很高端的样子,我赶紧去搜索,发现了一个最简单的神经网络,bp神经网络(前馈神经网络)又是csdn又是哔哩哔哩,我狠狠的去了解了一下这个神经网络,发现好牛,刷新了我对数学的认识,虽然我不知道什么是隐含层,什么是节点阈值,但我学会了怎么在Matlab中使用。我赶紧拿着我整理的数据往里面套,可是算出来的结果始终很离谱,误差能达到1000万人名币!我越算越觉得离谱,越算越觉得我错了!我就是错了!神经网络是需要代入特征值计算出结果,可是月份能叫做特征值么?显然不可以。
第一天讨论了题目的第一问(处理大量表格)第二天学了半天的神经网络,处理了半天数据,到了深夜才发现模型不能准确预测,第三天赶紧改模型!趁着早上做核酸的空档,又是csdn又是哔哩哔哩又是中国大学mooc,终于,找到了一个叫做灰色预测的模型,它可以用较少的样本量,得出数据的变化趋势,并切做出预测。是个好模型,赶紧学,这里看公式,那里学代码,马马虎虎在Matlab上写好了计算代码,终于在第三天下午得到了预测值,并且把结果整理交给了论文手。回想三天来的经历与忙碌,(没正点吃过饭),决定写个文章记录一下,嘻嘻。
下面是我用到的两个模型,虽然是抄来的,但也算自己学了一部分。
二、两个数学模型 1.灰色关联度 灰色关联度分析法(Grey Relational Analysis)是灰色系统分析方法的一种。是根据因素之间发展趋势的相似或相异程度,亦即“灰色关联度”,作为衡量因素间关联程度的一种方法。
p2p|大一小白的数模比赛(灰色关联度和灰色预测)附Matlab代码
文章图片

题目要求我们得到以上指标对销售量的影响,只需要建立一个关于销量的这些因素的矩阵代入以下matlab 的代码。
%load gdp.mat% 导入数据 % 我们也可以自己在工作区新建变量,并把Excel的数据粘贴过来 Mean = mean(gdp); % 求出每一列的均值以供后续的数据预处理 gdp = gdp ./ repmat(Mean,size(gdp,1),1); disp('预处理后的矩阵为:'); disp(gdp) Y = gdp(:,1); % 母序列 X = gdp(:,2:end); % 子序列 absX0_Xi = abs(X - repmat(Y,1,size(X,2)))% 计算|X0-Xi|矩阵(在这里我们把X0定义为了Y) a = min(min(absX0_Xi))% 计算两级最小差a b = max(max(absX0_Xi))% 计算两级最大差b rho = 0.5; % 分辨系数取0.5 gamma = (a+rho*b) ./ (absX0_Xi+ rho*b)% 计算子序列中各个指标与母序列的关联系数 disp('子序列中各个指标的灰色关联度分别为:') disp(mean(gamma))

2.灰色系统预测 所谓灰色系统,就是我们不知道这些数据之间的关系,和数据同系统之间的联系,但是我们可以推算出它的变化趋势,并进行预测(自己的理解)
题目数据整理如下:
p2p|大一小白的数模比赛(灰色关联度和灰色预测)附Matlab代码
文章图片

我们需要根据19到21年来预测22年
matlab代码如下:
%载入预测参考序列 %A=[]每行是一年的各月销售情况,总共有三行 clc; close all; T=A'; x0=mean(T); %求平均序列 x1=zeros(size(x0)); n=length(x0); x1(1)=x0(1); for i=2:n x1(i)=x1(i-1)+x0(i); %累积求和 end z=zeros(size(x0)); af=0.4; %参数 for i=2:n z(i)=af*x1(i)+(1-af)*x1(i-1); end Y=zeros(n-1,1); B=zeros(n-1,2); for i=2:n Y(i-1,1)=x0(i); B(i-1,1)=-z(i); B(i-1,2)=1; end Para=(B'*B)\B'*Y; %计算参数 a=Para(1); b=Para(2); Pred=(x0(1)-b/a)*exp(-a*n)*(1-exp(a)); %预测下一组数据 Total=12*Pred; %下一组数据平均值 %估计每组数据所占比重 T=T'; r=sum(T)/sum(sum(T)); %预测每组数据的具体值 Px=Total*r; fprintf('输出每组数据的预测值:\n'); for i=1:12 fprintf('%5d',i); end fprintf('\n'); for i=1:12 fprintf('%6.1f',Px(i)); %输出每组数据 end

总结 很累,可能题选的模型不好,结果不能够满足答案要求,但是五一假期里忙碌的三天让我收获很大,也感受到了数模的魅力,以后有比赛也会积极参加。总之累,但巨开心。
这篇文章仅仅是记录我的经历,没有学术价值。

    推荐阅读