灰色系统是由华中科技大学的邓聚龙教授于80年代初创立,该系统作为新兴的横断学科,在短短的二十年里已得到了长足的发展。 其已经成为社会,经济,科教,科技等很多领域进行预测,决策,评估,规划,控制,系统分析和建模的重要方法之一。特别是它对于时间序列短,统计数据少,信息不完全系统的建模与分析,具有非常显著的功效。
灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。其用等时距观测到的反映预测对象特征的一系列数量值构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。
(1)灰色系统、白色系统和黑色系统
(2)灰色预测法
常见的几种灰色生成类型:
1.累加生成算子(AGO)
2.逆累加生成算子(IAGO)
3.均值生成算子(MEAN)
4.级比生成算子
累加生成算子(AGO)
设原始数列为
x ( 0 ) = ( x 0 ( 1 ) , x 0 ( 2 ) , … x 0 ( n ) ) x^{(0)}=\left(x^{0}(1), x^{0}(2), \ldots x^{0}(n)\right) x(0)=(x0(1),x0(2),…x0(n))
令
x ( 1 ) ( k ) = ∑ i = 1 k x ( 0 ) ( i ) , k = 1 , 2 , … , n x ( 1 ) = ( x 1 ( 1 ) , x 1 ( 2 ) , … x 1 ( n ) ) \begin{aligned} x^{(1)}(k) &=\sum_{i=1}^{k} x^{(0)}(i) \quad, k=1,2, \ldots, n \\ x^{(1)} &=\left(x^{1}(1), x^{1}(2), \ldots x^{1}(n)\right) \end{aligned} x(1)(k)x(1)=i=1∑kx(0)(i),k=1,2,…,n=(x1(1),x1(2),…x1(n))
称所得到的新数列为数列x(0)的1次累加生成数列。类似的有
x ( r ) ( k ) = ∑ i = 1 k x ( r − 1 ) ( i ) , k = 1 , 2 , … , n , r ≥ 1 x^{(r)}(k)=\sum_{i=1}^{k} x^{(r-1)}(i) \quad, k=1,2, \ldots, n, r \geq 1 x(r)(k)=i=1∑kx(r−1)(i),k=1,2,…,n,r≥1
称为 x^(0)的r次累加生成数列。
累加生成的特点:
一般经济数列都是非负数列。累加生成能使任意非负数列、摆动的与非摆动的,转化为非减的、递增的。
累减生成(IAGO)
如果原始数列为
x ( 1 ) = ( x 1 ( 1 ) , x 1 ( 2 ) , … x 1 ( n ) ) x^{(1)}=\left(x^{1}(1), x^{1}(2), \ldots x^{1}(n)\right) x(1)=(x1(1),x1(2),…x1(n))
令
x ( 0 ) ( k ) = x ( 1 ) ( k ) − x ( 1 ) ( k − 1 ) , k = 2 , 3 , … , n x^{(0)}(k)=x^{(1)}(k)-x^{(1)}(k-1) \quad, k=2,3, \ldots, n x(0)(k)=x(1)(k)−x(1)(k−1),k=2,3,…,n
称所得到的数列 x^(0)为 x^(1)的1次累减生成数列。 可以看出,通过累加数列的到的新数列,可以通过累减生成还原出原始数列。
灰色系统理论是基于关联空间、光滑离散函数等概念定义灰导数与灰微分方程,进而用离散数据列建立微分方程形式的动态模型,即灰色模型是利用离散随机数经过生成变为随机性被显著削弱而且较有规律的生成数,建立起的微分方程形式的模型,这样便于对其变化过程进行研究和描述。
matlab代码
(AGO)
%灰色预测步骤
%输入前期小样本数据
% 做AGO累加处理
%输入预测个数
%运行
clc,clear,close all
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=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;
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))]);