数学建模灰色预测模型 -- 学习笔记

Posted HUTEROX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学建模灰色预测模型 -- 学习笔记相关的知识,希望对你有一定的参考价值。

前言

本片博文只是一篇笔记博文,略有不当之处请务必多多指正!望各位大佬不吝赐教!

灰色预测

何为灰色预测,这个历史就不多说了。我们更加关心的是这个玩意他能够干什么,适合那些方面的预测,以及相关的原理是什么?对应的灰色预测能够解决那些问题?
那么先说句不是人话:
·灰色预测是对既含有已知信息又含有不确定信息的系统进行预则,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。

灰色关联度比较

这个其实有点类似与我们的层次分析法,他们都能够对某一个事件进行评比,比较,但是区别在于利用层次分析法我们需要制定相关的权重,需要进行一致性检验,换句话来说在这方面,如果我们使用层次分析法的话,那么会带有一定的主观性,而缺乏对应的客观性,虽然我们可以是我们是通过了一致性检验的,但是总体上似乎缺少一点信服力。
那么在灰色比较的话,那么则更像是我们提供了一个完美的样本,我们现在手头上的样本和它的相似度有多少?越接近那么就意味着当前样本越是接近完美,那么我们就可以通过这个来实现样本之间的比较。例如我们通过这个来评比最优员工,最佳老师等等,如果我们使用层次分析的话,那么我们就要考虑每一项技能之间的权重,那么必然会导致意见不统一,甚至在建模过程中直接发现一致性检验不通过。
那么如此我们先来看看具体的例子看看如何使用。现在我们需要评价一组老师的绩效。

灰色关联度案例


现在我们需要评价哪个老师最好。
1.那么首先第一步是找到一组参考向量,也就是相当于模范样本。我们假设为{9 9 9 9 9 9 9},因为这里最高就是9,写10 的话大家都不满足。我们记住这一组向量为X0={9 9 9 9 9 9 9}
2.我们把每一组与标准组相减去,取绝对值。

3.我们找到最小的与最大的。

4.我们通过公式进行计算,这个公式求取相关性,怎么来的不要紧,我们暂时不关心,我们只关心怎么用

其中那个 P 是 0到1之间的数
当我们计算第一组的时候就可以这样算。

然后我们得到了这样一组数列。

之后我们可以对每个老师的评分求取平均值

那么这个时候我们就求到了每个人的关联序,那么我们就可以进行比较了。此方法相对于层次分析法来看显然更加清晰简便。

灰色预测模型

首先灰色预测更加适合小样本的预测,也就是当给的数据不是很多的时候,此外灰色预测其实是顺着时间线进行正向的预测,例如通过往年降雨量,预测明年降雨量最典型的例子就是。还有以前的题目预测什么非典的。
那么灰色预测的主要核心其实是对数据进行处理,把看起来没有规律的数据通过 累加 累减 加权累加的过程处理后再通过积分得到预测数据,通常预测几个,再复杂可能就要用到拟合了。

累加

其实就是把前N个数据加起来得到新的数列。
例如 1 2 3 4 5
处理后: 1 3 6 10 15
我们把初始数列记作:

处理后为:

累加 r 次我们记作

那么在图像上经过处理后是这样的

累减

那就更加简单了,那就是后一项减去前一项。
例如 1 2 3 4 5
处理后: 0 1 1 1 1
下面是个示例:

加权邻值生成

那个就是把两相邻的数据按照比例加起来。
原始数列:

处理后,那个 阿尔法 取值0 到 1

灰色模型GM(1,1)

这个就是我们用来把前面的东西穿起来做预测的玩意。

模型推导

这个还是基于前面的例子来的,我们假设原始数列是:

一次累加后是

我们此时通过累减就会得到原来的数列中的某个值也就是:

其中d(k)我们叫它灰导数,因为这个是不连续的,那么接下来我们的所有工作其实都是让它可导。
之后邻值加权

最后我们引入模型GM(1,1)

或者

这个算式我们可以发现这个其实类似于最小二乘,当然我们也可以通过矩阵进行运算。

引入线性代数

我们可以算得到 a b
然后我们带入方程

然后求导运算

最后我们可以得到这个玩意

这个是我们构建的解值,我们最后还要换算回去原始数列。

到此我们的数据就已经完成预测了。但是我们此时还是需要进行检验的,如果检验不通过我们是无法信任这样的值的。
计算相对差

绝对值小于 0.1 或者 0.2 越小越好
级比差检验

也是0.1 或者0.2
这个绿色部分是级比

后一项比前一项的比值,这个级比也是有条件的。
必须在之间否则不能灰色预测。如果可以预测那么后面的级比差检验 计算相对差两者满足一个即可。

灰色预测示例

题目

噪音预测,数据如下:

年份噪音评分
198671.4
198772.4
198872.4
198972.1
199071.4
199172.0
199271.6

解题

级比检测

我们先构造原始数列


检验通过

累加处理


算得到

带入模型算a b



得到

得到

回到

算的预测值

误差运算

按照前面的式子


得到

满足其中一个可以使用

代码

前面BB了这么多最重要的还是代码,手算是不可能的这辈子都不可能的。

关联代码


x1=[
    
    8 9 8 7 5 2 9;
    7 8 7 5 7 3 8;
    9 7 9 6 6 4 7;
    6 8 8 8 4 3 6;
    8 6 6 9 8 3 8;
    8 9 5 7 6 4 8;
]   %需要比较的数列
x=x1;
[r,c]=size(x1);

biaozhun = [9 9 9 9 9 9 9] %标准序列
for i=1:r
    for j=1:c
  x(i,j)=abs(biaozhun(j)-x(i,j))
 end
end
max=x(1,1)
min=x(1,1)
for i=1:r
    for j=1:c
 if x(i,j)>=max
     max=x(i,j)
 end
  end
end
for i=1:r
    for j=1:c
 if x(i,j)<=min
     min=x(i,j)
  end
  end
end
k=0.5 %分辨系数取值
l=(min+k*max)./(x+k*max)%求关联系数矩阵
guanliandu=sum(l')/c
[rs,rind]=sort(guanliandu,'descend') %对关联度进行排序


对比一下上面的表,数据对的上。要用的时候改一改就好了。

预测代码

y=input('请输入数据');
n=length(y);

jibi1=exp(1)^(-2/(n+1));
jibi2=exp(1)^(2/(n+1));
for i=2:n
    jibi = y(n)/y(n-1);
    if jibi>jibi1 && jibi<jibi2
        disp("级比通过")
       
    else
        disp("级比不通过")

    end
end  

yy=ones(n,1);
yy(1)=y(1);
for i=2:n
    yy(i)=yy(i-1)+y(i)
end
B=ones(n-1,2);
for i=1:(n-1)
    B(i,1)=-(yy(i)+yy(i+1))/2;
    B(i,2)=1;
end
BT=B';
for j=1:(n-1)
    YN(j)=y(j+1);
end
YN=YN';
A=inv(BT*B)*BT*YN;
a=A(1);
u=A(2);
t=u/a;
t_test=input('输入需要预测的个数');
i=1:t_test+n;
yys(i+1)=(y(1)-t).*exp(-a.*i)+t;
yys(1)=y(1);
for j=n+t_test:-1:2
    ys(j)=yys(j)-yys(j-1);
end
x=1:n;
xs=2:n+t_test;
yn=ys(2:n+t_test);
plot(x,y,'-r',xs,yn,'*b');
det=0;
yuce = [];
yunce(1)=y(1);
yunce(2:n+t_test)=yn;
yunce
for i=2:n
    det=det+abs(yn(i)-y(i));
end
det=det/(n-1);
disp(['百分绝对误差为:',num2str(det),'%']);
disp(['预测值为:',num2str(ys(n+1:n+t_test))]);

    

这里主要输入[]

(我这中文编码有问题)

总结

通过对这个的了解,那么我们可以知道灰色预测可以进行关联性比较,也就是说可以在某种程度上解决层次分析法的工作。在数据预测方面适合小范围的预测,例如空气水质质量预测,全国人口预测,新型冠状病毒感染预测。当然前提是数据准确忽略其他因素干扰。

以上是关于数学建模灰色预测模型 -- 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

备战数学建模33-灰色预测模型2

数学建模MATLAB应用实战系列(八十三)-灰色预测(附MATLAB代码)

数学建模笔记总结

灰色预测模型

Matlab:数模03-灰色预测

Matlab数学建模灰色预测模型