【数模/预测】灰色预测

声明:文章参考数学建模清风的网课编写。

简介

 灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。

 灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。

 GM(1, 1)模型的基本形式(也被称为灰色微分方程): x ( 0 ) ( k ) + a z ( 1 ) ( k ) = b x^{(0)}(k) + az^{(1)}(k)=b x(0)(k)+az(1)(k)=b
 GM(1, 1)模型的白化方程: d x ( 1 ) ( t ) d t = − a ^ x ( 1 ) ( t ) + b ^ \frac{dx^{(1)}(t)}{dt} = -\hat{a}x^{(1)}(t) + \hat{b} dtdx(1)(t)=a^x(1)(t)+b^

符号说明

符号含义
x ( 0 ) x^{(0)} x(0)原非负数据列
x ( 1 ) x^{(1)} x(1)原数据的一次累加数据列
z ( 1 ) z^{(1)} z(1) x ( 1 ) x^{(1)} x(1)的紧邻均值数据列,下标从2开始
a a a- a a a为发展系数
b b b b b b为灰作用量

注意:变量上方加 ^ \hat{} ^表示变量的估计值。如: b ^ \hat{b} b^表示灰作用量的估计值。

适用条件

注意:使用GM(1, 1)模型。第一个‘1’表示微分方程是一阶的,后面的‘1’表示只有一个变量。

1.使用离散非负数据列(数据是以年份度量的非负数据);
2.GM(1, 1)模型的本质是有条件的指数拟合,数据满足准指数规律
3.数据的期数较短且和其他数据之间的关联性不强(小于等于10,也不能太短了,比如只有3期数据)
4.需检验GM(1, 1)模型对原数据的拟合程度。可以使用残差检验级比偏差检验

准指数规律检验

原序列的光滑比: ρ ( k ) = x ( 0 ) ( k ) x ( 1 ) ( k − 1 ) ,     k ≥ 2 \rho (k) = \frac{x^{(0)}(k)}{x^{(1)}(k-1)}, \ \ \ k \ge 2 ρ(k)=x(1)(k1)x(0)(k),   k2原数据的光滑比小于0.5的个数占所有数据总个数的比例大于0.6表示可以通过准指数规律检验;或去掉前两个数据后,原数据的光滑比小于0.5的个数占所有数据总个数的比例大于0.9表示可以通过准指数规律检验。

注意:这里的0.6和0.9均为参考值,可以做出调整。必须注意,下标从2开始,因此数据总数为n-1。

残差检验

绝对残差: ε ( k ) = x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ,     k ≥ 2 \varepsilon (k) = x^{(0)}(k) - \hat{x} ^{(0)}(k) ,\ \ \ k \ge 2 ε(k)=x(0)(k)x^(0)(k),   k2
相对残差: ε r ( k ) = ∣ x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ∣ x ( 0 ) ( k ) × 100 % ,     k ≥ 2 \varepsilon_{r} (k) = \frac{|x^{(0)}(k) - \hat{x} ^{(0)}(k)|}{x^{(0)}(k)}\times 100 \%, \ \ \ k \ge 2 εr(k)=x(0)(k)x(0)(k)x^(0)(k)×100%,   k2
平均相对残差: ε r ˉ = 1 n − 1 ∑ k = 2 n ∣ ε r ( k ) ∣ \bar{\varepsilon_{r}} = \frac{1}{n - 1}\sum_{k = 2}^{n} |\varepsilon_{r}(k)| εrˉ=n11k=2nεr(k)如果 ε r ˉ < 0.1 \bar{\varepsilon_{r}} < 0.1 εrˉ<0.1则认为GM(1, 1)模型对原数据的拟合效果非常不错,如果 ε r ˉ < 0.2 \bar{\varepsilon_{r}}< 0.2 εrˉ<0.2则认为GM(1, 1)模型对原数据的拟合效果达到了一般标准。

级比偏差检验

级比: σ ( k ) = x ( 0 ) ( k ) x ( 0 ) ( k − 1 ) ,     k ≥ 2 \sigma (k) = \frac{x^{(0)}(k)}{x^{(0)}(k-1)}, \ \ \ k \ge 2 σ(k)=x(0)(k1)x(0)(k),   k2级比偏差: η ( k ) = ∣ 1 − 1 − 0.5 a ^ 1 + 0.5 a ^ 1 σ ( k ) ∣ ,     k ≥ 2 \eta (k) = \left | 1 - \frac{1-0.5\hat{a} }{1+0.5\hat{a}}\frac{1}{\sigma (k)} \right | , \ \ \ k \ge 2 η(k)= 11+0.5a^10.5a^σ(k)1 ,   k2平均级比偏差: η ˉ = 1 n − 1 ∑ k = 2 n η ( k ) \bar{\eta} = \frac{1}{n-1} \sum_{k=2}^{n} \eta (k) ηˉ=n11k=2nη(k) η ( k ) \eta (k) η(k)越小说明 x ( 0 ) ( k ) x^{(0)}(k) x(0)(k) x ^ ( 0 ) ( k ) \hat{x} ^{(0)}(k) x^(0)(k)越接近。如果 η ˉ < 0.1 \bar{\eta}< 0.1 ηˉ<0.1则认为GM(1, 1)模型对原数据的拟合效果非常不错,如果 η ˉ < 0.2 \bar{\eta}< 0.2 ηˉ<0.2则认为GM(1, 1)模型对原数据的拟合效果达到了一般标准。

GM(1, 1)模型求解

b ^ , a ^ \hat{b}, \hat{a} b^,a^使用最小二乘法即可求出。

 求解GM(1, 1)模型的白化方程,即可用来预测: d x ( 1 ) ( t ) d t = − a ^ x ( 1 ) ( t ) + b ^ \frac{dx^{(1)}(t)}{dt} = -\hat{a}x^{(1)}(t) + \hat{b} dtdx(1)(t)=a^x(1)(t)+b^
 求解微分方程得出:
x ^ ( 0 ) ( m + 1 ) = ( 1 − e a ^ ) [ x ( 0 ) ( 1 ) − b ^ a ^ ] e − a ^ m ,     m ≥ 1 \hat{x} ^{(0)}(m+1) = (1-e^{\hat{a}})\left [ x^{(0)}(1) - \frac{\hat{b}}{\hat{a}} \right ] e^{-\hat{a}m}, \ \ \ m\ge 1 x^(0)(m+1)=(1ea^)[x(0)(1)a^b^]ea^m,   m1新陈代谢gm11模型即:调用普通gm11模型预测的同时,淘汰旧值并加入新值的预测模型。新陈代谢gm11预测代码(主函数main.m):

clear;clc

% 输入应为两组向量 分别表示自变量与因变量且一一对应
% 注意:灰色预测的变量数不应小于3也不应大于10, 且不能包含负数

x = input('自变量:');
y = input('因变量:');

n = length(y);

% 画出原始数据的时间序列图
figure(1);
plot(x, y, 'o-');grid on;
set(gca, 'xtick', x(1:end)); % 设置x坐标间隔为1
title('标题描述');
xlabel('x坐标描述');
ylabel('y坐标描述');

% 检验是否存在负值
if sum(y < 0) > 0 
    disp('灰色预测不能对存在负值的数据进行预测');
end

% 准指数规律检验。 灰色预测原理为:指数拟合,需要数据具有指数规律。
% 通常要求:光滑比小于0.5的数据大于60%;去掉前两个数据后光滑比小于0.5的数据大于90%

cum_y = cumsum(y); % 一次累加和
% 光滑度
rho = y(2:end) ./ cum_y(1:end-1);
disp('光滑比小于0.5的数据占比为:' );
disp(sum(rho < 0.5)/(n-1));

disp('去掉前两个数据后,光滑比小于0.5的数据占比为:');
disp(sum(rho(3:end) < 0.5)/(n-3));

% 级比偏差和相对残差检验
check(y);

% 新尘代谢gm11模型

p = input('请输入预测的次数:');
res = zeros(p, 1);

yy = y;

for i = 1 : p
    res(i) = gm11(yy, 1);
    for j = 1 : n - 1
        yy(j) = yy(j + 1);
    end
    yy(n) = res(i);
end

res

级比偏差和相对残差检验(check.m):

function [] = check(d)
    % 对待预测数据进行级比偏差和相对残差检验
    % d 要进行预测的数据

    n = length(d);
    cum_d = cumsum(d);
    % 紧邻均值序列
    z = (cum_d(1:end-1) + cum_d(2:end)) ./ 2;
    
    % 最小二乘
    y = d(2:end);
    x = z;
    m = n - 1;
    k = (m*sum(x.*y) - sum(x)*sum(y))/(m*sum(x.*x)-sum(x)*sum(x));
    % b为灰作用量, -a为发展系数
    b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(m*sum(x.*x)-sum(x)*sum(x));
    a = -k;
    
    % 预测
    p_d = zeros(n, 1);
    for i = 1 : n - 1
        p_d(i + 1) = (1-exp(a))*(d(1)-b/a)*exp(-a*i);
    end
    
    % 级比偏差
    u = abs(d(2:end)-p_d(2:end))./d(2:end);
    disp('均级比偏差为(通常小于0.1则说明适合灰色预测):');
    disp(mean(u));
    
    % 相对残差
    disp('均级相对残差为(通常小于0.1则说明适合灰色预测):');
    e = abs(1-(1-0.5*a)/(1+0.5*a)*(d(1:end-1)./d(2:end)));
    disp(mean(e));
end

普通gm11代码:

function res = gm11(d, p)
    % d 要进行预测的数据
    % res 预测结果, 为大小为p的列向量
    % p 为预测次数

    n = length(d);
    res = zeros(p, 1);
    cum_d = cumsum(d);
    % 紧邻均值序列
    z = (cum_d(1:end-1) + cum_d(2:end)) ./ 2;
    
    % 最小二乘
    y = d(2:end);
    x = z;
    m = n - 1;
    k = (m*sum(x.*y) - sum(x)*sum(y))/(m*sum(x.*x)-sum(x)*sum(x));
    % b为灰作用量, -a为发展系数
    b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(m*sum(x.*x)-sum(x)*sum(x));
    a = -k;
    
    disp(strcat('发展系数为', num2str(-a)));
    disp(strcat('灰作用量为', num2str(b)));
    
    % 预测
    for i = 1 : p
        res(i) = (1-exp(a))*(d(1)-b/a)*exp(-a*(n+i-1));
    end
  
end
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_zhizi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值