数学建模灰色预测模型 -- 学习笔记
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
这个绿色部分是级比
后一项比前一项的比值,这个级比也是有条件的。
必须在之间否则不能灰色预测。如果可以预测那么后面的级比差检验 计算相对差两者满足一个即可。
灰色预测示例
题目
噪音预测,数据如下:
年份 | 噪音评分 |
---|---|
1986 | 71.4 |
1987 | 72.4 |
1988 | 72.4 |
1989 | 72.1 |
1990 | 71.4 |
1991 | 72.0 |
1992 | 71.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))]);
这里主要输入[]
(我这中文编码有问题)
总结
通过对这个的了解,那么我们可以知道灰色预测可以进行关联性比较,也就是说可以在某种程度上解决层次分析法的工作。在数据预测方面适合小范围的预测,例如空气水质质量预测,全国人口预测,新型冠状病毒感染预测。当然前提是数据准确忽略其他因素干扰。
以上是关于数学建模灰色预测模型 -- 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章