灰色预测模型GM(1,1)

本文参考的是司守奎,孙兆亮主编的数学建模算法与应用(第二版)

灰色预测的主要特点时模型使用的不是原始数据序列,而是生成的数据序列。其核心体系时灰色模型,即对原数据作累加生成得到近似指数规律再进行建模的方法。
优点:不需要很多数据,一般只需要4个数据,就能够解决历史数据少。序列的完整性及可靠性低的问题,能利用微分方程充分挖掘系统的本质,精度高;能将无规律的原始数据进行生成得到规律性较强的生成序列,运算简便,便于检验,不考虑分布规律,不考虑变化趋势。
缺点:只使用于中短期的预测,只适合指数增长的预测。

这里主要介绍GM(1,1)预测模型
模型建立过程:
在这里插入图片描述
在这里插入图片描述

下面介绍使用GM(1,1)的一般步骤。
1.数据的检验与处理,需要进行数据的级比校验,只有级比校验通过才适合灰色预测,要是没通过,可以通过取适当的常数c作平移变换(不过我觉得,没通过就别用了吧)。
在这里插入图片描述
2.建立模型
在这里插入图片描述
3.检验预测值。残差检验和级比残差值检验都通过模型才视作有效。
在这里插入图片描述
4.使用模型预测
在这里插入图片描述
由于灰色预测模型是根据序列来预测的,预测希望预测第几个值,直接输入对于序列即可。

下面展示一道例题。
在这里插入图片描述
1.数据的检验与处理
在这里插入图片描述

x0 = [71.1 72.4 72.4 72.1 71.4 72.0 71.6]';% 这里为列向量
n = length(x0);
lamda = x0(1:n-1)./x0(2:n); %计算级比(前一个数/后一个数,共六个)
range = minmax(lamda')%级比范围
range_min = exp(-2/(n+1));
range_max = exp(2/(n+2));
if range_min <= range(1) && range_max >= range(2)
    fprintf("级比检验通过")
else
    fprintf("级比检验失败")
end

2.建立模型
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

x1 = cumsum(x0); %累加计算x(1)
B = [-0.5*(x1(1:n-1) + x1(2:n)), ones(n-1,1)];
Y = x0(2:n);
u = B\Y 
syms x(t)
x = dsolve(diff(x) + u(1)*x == u(2), x(0) == x0(1));%求微分方程的符号解
xt = vpa(x, 6) %以小数格式显示微分方程的解
yucel = subs(x,t,[0:n-1]);%求已知数据的预测值
yucel = double(yucel);%符号数转换成数值类型,否则无法做差分运算
yuce = [x0(1), diff(yucel)] %差分运算,还原数据

3.检验预测值。
在这里插入图片描述

epsilon = x0' - yuce;% 计算残差
delta = abs(epsilon./x0');%计算相对误差
rho = 1 - (1 - 0.5 * u(1))/(1 + 0.5 * u(1)) * lamda';%计算级比偏差值,u(1)=a

4.使用模型预测。带入模型计算即可。

m = 8 %m=用于训练模型的数据个数 + 希望往后预测的个数
y = subs(x, t, [0:m])
y = double(y);
y_pre = [x0(1), diff(y)]

matlab完整代码如下:

clc,clear
x0 = [71.1 72.4 72.4 72.1 71.4 72.0 71.6]';% 这里为列向量
n = length(x0);
lamda = x0(1:n-1)./x0(2:n); %计算级比(前一个数/后一个数,共六个)
range = minmax(lamda');%级比范围
range_min = exp(-2/(n+1));
range_max = exp(2/(n+2));
if range_min <= range(1) && range_max >= range(2)
    fprintf("级比检验通过")
else
    fprintf("级比检验失败")
end

x1 = cumsum(x0); %累加计算x(1)
B = [-0.5*(x1(1:n-1) + x1(2:n)), ones(n-1,1)];
Y = x0(2:n);
u = B\Y;
syms x(t)
x = dsolve(diff(x) + u(1)*x == u(2), x(0) == x0(1));%求微分方程的符号解
xt = vpa(x, 6) %以小数格式显示微分方程的解

yucel = subs(x,t,[0:n-1]);%求已知数据的预测值
yucel = double(yucel);%符号数转换成数值类型,否则无法做差分运算
yuce = [x0(1), diff(yucel)] %差分运算,还原数据
epsilon = x0' - yuce;% 计算残差
delta = abs(epsilon./x0');%计算相对误差
rho = 1 - (1 - 0.5 * u(1))/(1 + 0.5 * u(1)) * lamda';%计算级比偏差值,u(1)=a

m = 8; %m=用于训练模型的数据个数 + 希望往后预测的个数
y = subs(x, t, [0:m]);
y = double(y);
y_pre = [x0(1), diff(y)]
  • 48
    点赞
  • 388
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Icy Hunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值