一、灰色预测基础知识

        灰色系统理论认为:系统的行为现象尽管是朦胧的,数据是复杂的,但它毕竟是有序的,是有整体功能的。在建立灰色预测模型之前,需对原始时间序列进行数据处理,经过数据预处理后的数据序列称为生成列。灰色系统常用的数据处理方式有累加和累减两种,通常用累加方法。

       灰色预测通过鉴别系统因素之间发展趋势的相异程度,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物的未来发展趋势。灰色预测是以灰色模型为基础的,在诸多灰色模型中,以灰色系统中单序列一阶线性微分方程模型GM(1,1)模型最为常用。

       下面简要的介绍GM(1,1)模型

(1)原始数据累加以便弱化随机序列的波动性和随机性,得到新数据序列;(累加)

(2)对新序列建立一阶线性微分方程;

(3)对累加序列(新序列)生成数据做均值生成平滑向量和常数项向量;

(4)用最小二乘法求解灰参数;

(5)将灰参数代入一阶线性微分方程进行求解,得到累加序列的估计表达式;

(6)对累加序列进行差分,还原为原始序列;

(7)对建立的灰色模型进行检验,步骤如下:

①计算预测值和真实值之间的残差和相对误差;

②求原始数据的均值以及方差;

③求残差的均值以及方差;

④计算方差比

⑤求小误差概率

⑥灰色模型精度检验表

(8)利用模型进行预测

二、灰色预测的Matlab程序

用MATLAB编写灰色预测程序时,完全按照预测模型的求解步骤,即

(1)对原始数据进行累加。

(2)构造累加矩阵B与常数向量。

(3)求解灰参数。

(4)将参数代入预测模型进行数据预测。

具体的MATLAB程序如下:

clear
syms a b;
c = [a,b]';
A = [174 179 183 189 207 234 220.5 256 270 285];
%原始数据累加
B = cumsum(A);
n = length(A);
%生成累加矩阵
for i = 1:(n-1)
    C(i) = (B(i)+B(i+1))/2;
end
%计算待定参数的值
D = A;D(1) = [];
D = D';
E = [-C;ones(1,n-1)];
c = inv(E*E')*E*D;
c = c';
a = c(1);b = c(2);
%预测后续数据
F = [];F(1) = A(1);
for i = 2:(n+10)
    F(i) = (A(1)-b/a)/exp(a*(i-1))+b/a;
end
G = [];G(1) = A(1);
for i = 2:(n+10)
    G(i) = F(i)-F(i-1)
end
t1 = 1999:2008;
t2 = 1999:2018;
G
plot(t1,A,'ro',t2,G,'b+')

灰色预测python实现 灰色预测数据处理方法_灰色预测python实现

在实际使用时,可以直接套用该程序,把原数据和时间序列数据替换就可以了。模型的误差检验可以灵活处理。

三、灰色预测应用实例

3.1实例一:长江水质的预测

长江的水质问题是一个复杂的非线性系统,但是由于数据样本少,需要预测的时间长,直接应用神经网络很难取得理想的效果。考虑到污水排放量的变化规律是一个不确定的系统,且本题给出污水排放量数据样本比较少,还要求做出长达10年的预测,因此采用彩色预测方法来预测未来的污水排放量。

运行程序和结果如上Matlab程序。

3.2实例二:预测与会代表人数

该题要求为会议筹备组制订一个预定宾馆客房、租借会议室、租用客车的合理方案。为了解决找个问题,需要先预测与会代表的人数。预测的依据是代表回执数量及往届的与会人员数据。

灰色预测python实现 灰色预测数据处理方法_G1_02

clc
clear all
syms a b;
c = [a,b]';
A1 = [315 356 408 711];
A2 = [89 115 121 213];
A3 = [57 69 75 104];
AA1 = A2./A1
AA2 = A3./A1
%原始数据累加
B = cumsum(AA1);
n = length(AA1);
%生成累加矩阵
for i = 1:(n-1)
    C(i) = (B(i)+B(i+1))/2;
end
%计算待定参数的值
D = AA1;D(1) = [];
D = D';
E = [-C;ones(1,n-1)];
c = inv(E*E')*E*D;
c = c';
a = c(1);b = c(2);
%预测后续数据
F = [];F(1) = AA1(1);
for i = 2:(n+1)
    F(i) = (AA1(1)-b/a)/exp(a*(i-1))+b/a;
end
G = [];G(1) = AA1(1);
for i = 2:(n+1)
    G(i) = F(i)-F(i-1)
end
t1 = 1:4;
t2 = 1:5;
G
plot(t1,AA1,'o',t2,G)
%原始数据累加
B1 = cumsum(AA2);
n1 = length(AA2);
%生成累加矩阵
for i = 1:(n1-1)
    C1(i) = (B1(i)+B1(i+1))/2;
end
%计算待定参数的值
D1 = AA2;D1(1) = [];
D1 = D1';
E1 = [-C1;ones(1,n1-1)];
c1 = inv(E1*E1')*E1*D1;
c1 = c1';
a1 = c1(1);b1 = c1(2);
%预测后续数据
F1 = [];F1(1) = AA2(1);
for i = 2:(n1+1)
    F1(i) = (AA2(1)-b1/a1)/exp(a1*(i-1))+b1/a1;
end
G1 = [];G1(1) = AA2(1);
for i = 2:(n1+1)
    G1(i) = F1(i)-F1(i-1)
end
t1 = 1:4;
t2 = 1:5;
G1
plot(t1,AA2,'o',t2,G1)

灰色预测python实现 灰色预测数据处理方法_数据_03

灰色预测python实现 灰色预测数据处理方法_数据_04

预测预约不到场率为0.2833,不预约到场率0.1331,由于第5界回执755张,不考虑到近两年趋势,出于保守考虑,人数分别向上取整,预测为214人和101人,预测实际参会人数755-214+101=642人。