你也能看懂的:灰色预测算法

灰色预测是就灰色系统所做的预测。所谓灰色系统是介于白色系统和黑箱系统之间的过渡系统。其具体的含义是:如果某一系统的全部信息已知为白色系统,全部信息未知为黑箱系统,部分信息已知,部分信息未知,那么这一系统就是灰色系统。


相关概念

  • 白色系统:指一个系统的内部特征的完全已知的,即系统信息是完全公开的
  • 黑色系统:与白色系统相反,指一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联系来加以观测研究
  • 灰色系统:介于白色系统和黑色系统之间,即系统内一部分信息是已知的,但另一部分信息是未知的,系统内各因素间有不确定的关系

灰色系统的特点:

  • 用灰色数学处理不确定量,使之量化
  • 充分利用已知信息寻求系统的运动规律
  • 灰色系统理论能处理贫信息系统

灰色预测法是一种预测灰色系统的预测方法

目前常用的一些预测方法(如回归分析等),需要较大的样本,对于少样本的情况就会造成比较大的误差,使预测目标失效。而灰色预测模型所需的建模信息少、运算方便、建模精度高,因此在各种预测领域都有着广泛的应用,是处理小样本预测问题的有效工具

灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行灰色生成来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况


数据处理

灰色生成

原始数据列中的数据,按某种要求作数据处理,这样的一种方法叫做生成

对原始数据的生成就是企图从杂乱无章的现象中去发现内在规律

常用的灰色系统生成方式有:累加生成、累减生成等

累加生成
通过数列间各数据的依个累加以得到新的数据与数列, 累加前的数列称为原始数列,累加后的数列称为生成数列,累加生成是使灰色过程由灰变白的一种方法

通过累加生成可以看出灰量积累过程的发展态势,使离乱的原始数据中蕴含的积分特性或规律加以显化

例如:原始数据为 [1, 2, 3, 4],则生成数据为 [1, 3, 6, 10],即生成数据的第 n 个数为原始数据前 n 个数的和, 3 = 1 + 2 , 6 = 1 + 2 + 3 3=1+2,\quad 6=1+2+3

用式子表示:
x ( 1 ) = [ x 1 ( 1 ) , x 2 ( 1 ) , x 3 ( 1 ) , . . . ] x k ( 2 ) = i = 1 k x k ( 1 ) 原始数据:\quad x^{(1)}=[x_1^{(1)},x_2^{(1)},x_3^{(1)},...] \\ \quad \\ 累加数据:\quad x_k^{(2)}=\sum_{i=1}^kx_k^{(1)} \quad \quad \quad \quad

灰色模型:GM(1,1)

灰色模型是利用离散随机数经过生成变为随机性被显著削弱而且较有规律的生成数,建立起的微分方程形式的模型,这样便于对其变化过程进行研究和描述

G 表示 Grey(灰色),M 表示 Model(模型)

x ( 2 ) x^{(2)} 的灰导数:
x k ( 1 ) = x k ( 2 ) x k 1 ( 2 ) x_k^{(1)}=x_k^{(2)}-x_{k-1}^{(2)}

z k z_k x ( 2 ) x^{(2)} 的临近生成数列,即白化背景值:
z k = α x k ( 1 ) + ( 1 α ) x ( 1 ) z_k=\alpha x_k^{(1)}+(1-\alpha)x^{(1)}

GM(1,1)的灰微分方程模型为:
x k ( 1 ) + a z k = b x_k^{(1)}+a z_k=b

a a 为发展系数, b b 为灰作用量

使用矩阵:
u = [ a b ] , Y = [ x 2 ( 1 ) x 3 ( 1 ) x n ( 1 ) ] , B = [ z 2 ( 1 ) 1 z 3 ( 1 ) 1 z n ( 1 ) 1 ] u= \begin{bmatrix} a\\ b \end{bmatrix},\quad Y=\begin{bmatrix} x_2^{(1)}\\ x_3^{(1)} \\ \vdots \\ x_n^{(1)}\end{bmatrix},\quad B=\begin{bmatrix} -z_2^{(1)}&1\\ -z_3^{(1)}&1 \\ \vdots & \vdots \\ -z_n^{(1)}&1 \end{bmatrix}

则 GM(1,1)的模型表示为:
Y = B u Y=Bu

用最小二乘法求 a、b 的估计值:
u = [ a b ] = ( B T B ) 1 B T Y u= \begin{bmatrix} a\\ b \end{bmatrix}=(B^TB)^{-1}B^TY


灰色预测的流程

数据的检验与处理

对已知数据做必要的检验处理,看 GM(1,1)的模型能否使用

原始数据: x ( 1 ) = [ x 1 ( 1 ) , x 2 ( 1 ) , x 3 ( 1 ) , . . . ] x^{(1)}=[x_1^{(1)},x_2^{(1)},x_3^{(1)},...] ,数列的极比:
λ ( k ) = x k 1 ( 1 ) x k ( 1 ) \lambda(k)=\frac{x_{k-1}^{(1)}}{x_k^{(1)}}

如果所有的级比都落在可容覆盖区间 X = ( e 2 n + 1 , e 2 n + 1 ) X=(e^{\frac{-2}{n+1}},e^{\frac{2}{n+1}}) 内,则可以进行灰度预测,否则对数据做适当的变换处理

建立GM(1,1)模型

x k ( 1 ) + a z k = b x_k^{(1)}+a z_k=b

用回归分析求得 a、b 的估计值,于是相应的白化模型为:
d x t ( 2 ) d t + a x t ( 2 ) = b \frac{dx_{t}^{(2)}}{dt}+a x_t^{(2)}=b

解为:
x t ( 2 ) = ( x 1 ( 1 ) b a ) e a ( t 1 ) + b a x_{t}^{(2)}=(x_{1}^{(1)}-\frac ba)e^{-a(t-1)}+\frac ba

得到预测值:
x ^ k + 1 ( 2 ) = ( x 1 ( 1 ) b a ) e a k + b a \widehat{x}_{k+1}^{(2)}=(x_{1}^{(1)}-\frac ba)e^{-ak}+\frac ba

进一步得到原始预测值:
x ^ k + 1 ( 1 ) = x ^ k + 1 ( 2 ) x ^ k ( 2 ) \widehat{x}_{k+1}^{(1)}=\widehat{x}_{k+1}^{(2)}-\widehat{x}_{k}^{(2)}

检验预测值

相对误差大小检验法:
ε ( k ) = x k ( 1 ) x ^ k ( 1 ) x k ( 1 ) \varepsilon(k)=\frac{x_{k}^{(1)}-\widehat{x}_{k}^{(1)}}{x_k^{(1)}}

如果对所有的 ε ( k ) < 0.1 |\varepsilon(k)|<0.1 ,则认为到达较高的要求;如果对所有的 ε ( k ) < 0.2 |\varepsilon(k)|<0.2 ,则认为到达一般的要求


案例解读

使用 MatLab 语言,把同一文件中的代码分割成几块解读

主程序
clear
y = input('请输入数据'); %原始数据
n = length(y);
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、b
a = A(1);
b = A(2);
t = b/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;
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))]);

输入输出如下:
在这里插入图片描述
图形:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44613063/article/details/104175448