目录
文章目录
前言
一、我都干了什么
二、两个数学模型
【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)是灰色系统分析方法的一种。是根据因素之间发展趋势的相似或相异程度,亦即“灰色关联度”,作为衡量因素间关联程度的一种方法。
文章图片
题目要求我们得到以上指标对销售量的影响,只需要建立一个关于销量的这些因素的矩阵代入以下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.灰色系统预测 所谓灰色系统,就是我们不知道这些数据之间的关系,和数据同系统之间的联系,但是我们可以推算出它的变化趋势,并进行预测(自己的理解)
题目数据整理如下:
文章图片
我们需要根据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
总结 很累,可能题选的模型不好,结果不能够满足答案要求,但是五一假期里忙碌的三天让我收获很大,也感受到了数模的魅力,以后有比赛也会积极参加。总之累,但巨开心。
这篇文章仅仅是记录我的经历,没有学术价值。
推荐阅读
- 2022年第十三届蓝桥杯JAVA B组部分题解
- 蓝桥杯|2022年蓝桥杯省赛真题解析(C++B组)
- 蓝桥杯|2022 第十三届 蓝桥杯 省赛 Java B组 真题 详细解析 答案
- c++|2022十三届蓝桥杯体验
- 蓝桥杯|浅谈2022第十三届蓝桥杯c/c++b组
- 令人快乐的刷题小妙招|【2022第十三届蓝桥杯】c/c++ 大学c组 解题报告
- 蓝桥杯|第十三届蓝桥杯大赛软件赛省赛(C/C++ 大学A组)
- 源代码|薅羊毛专业版第四十二次更新
- Java每日一练|Java语言每日一练—第9天(根据输入的数据判断是星期几)