大一小白的数模比赛(灰色关联度和灰色预测)附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

总结

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

这篇文章仅仅是记录我的经历,没有学术价值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值