1.理论
灰色理论认为系统的行为现象尽管是朦胧的,数据是复杂的,但它毕竟是有序的,是有整体功能的。灰数的生成,就是从杂乱中寻找出规律。同时,灰色理论建立的是生成数据模型,不是原始数据模型,因此,灰色预测是一种对含有不确定因素的系统进行预测的方法。
灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。其用等时距观测到的反应预测对象特征的一系列数量值构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。
2.分类
①灰色时间序列预测;即用观察到的反映预测对象特征的时间序列来构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。
②畸变预测;即通过灰色模型预测异常值出现的时刻,预测异常值什么时候出现在特定时区内。
③ 系统预测;通过对系统行为特征指标建立一组相互关联的灰色预测模型,预测系统中众多变量间的相互协调关系的变化。
④拓扑预测;将原始数据作曲线,在曲线上按定值寻找该定值发生的所有时点,并以该定值为框架构成时点数列,然后建立模型预测该定值所发生的时点
3.关联度
提出系统的关联度分析方法,是对系统发展态势的量化比较分析。
4.生成数列
通过对原始数据的整理寻找数的规律,分为三类:
a、累加生成:通过数列间各时刻数据的依个累加得到新的数据与数列。累加前数列为原始数列,累加后为生成数列。
b、累减生成:前后两个数据之差,累加生成的逆运算。累减生成可将累加生成还原成非生成数列。
c、映射生成:累加、累减以外的生成方式。
关系式
记x(0)为原始数列
x(0)=(x(0)(k)xk=1,2,…,n)=(x(0)⑴,x(0)⑵,…,x(0)(n))
记x⑴为生成数列
x⑴=(x⑴(k)xk=1,2,…,n)=(x⑴⑴,x⑴⑵,…,x⑴(n))
如果x(0) 与x⑴之间满足下列关系,即称为一次累加生成
5.建模步骤
a、建模机理
b、 把原始数据加工成生成数;
c、 对残差(模型计算值与实际值之差)修订后,建立差分微分方程模型;
d、 基于关联度收敛的分析;
e、 gm模型所得数据须经过逆生成还原后才能用。
f、采用“五步建模(系统定性分析、因素分析、初步量化、动态量化、优化)”法,建立一种差分微分方程模型gm(1,1)预测模型。
GM(1,1)模型
令 x(0)=(x⑴,x⑵,…,x(n)) 作一次累加生成, k x(k)= ∑x(m) 消除数据的随机性和波动性 m=1 有 x=(x⑴,x⑵,…,x(n)) =(x⑴,x⑴+x⑵,…,x(n-1)+x(n)) x可建立白化方程:dx/dt+ax=u 即gm(1,1).
该方程的解为: x(k+1)=(x⑴-u/a)e+u/a
其中:α称为发展灰数;μ称为内生控制灰数
证明就不再说了,在程序中写好了
GM(1,1)模型精度检验
等级参照表
GM(n,h)模型
1、残差模型:若用原始经济时间序列建立的GM(1,1)模型检验不合格或精度不理想时,要对建立的GM(1,1)模型进行残差修正或提高模型的预测精度。修正的方法是建立GM(1,1)的残差模型。
2、GM(n,h)模型 GM(n,h)模型是微分方程模型,可用于对描述对象作长期、连续、动态的反映。从原则上讲,某一灰色系统无论内部机制如何,只要能将该系统原始表征量表示为时间序列x(0)(t),并有 x(0)(t)>0,即可用GM模型对系统进行描述。
6.优点
对于一个模糊系统来说,传统的预测方法就会失去作用。处理模糊预测问题的数学方法是模糊数学。模糊数学的基础是模糊集合论,而模糊集合是普通集合的扩展。美国学者l.a.zadeh教授建立的模糊集合论,为模糊预测理论与方法的研究奠定了理论基础。它用简捷有力的方法处理复杂系统,在某种程度上弥补了经典数学与统计数学的不足。
7.应用范围
在预测应用上,如气象预报、地震预报、病虫害预报等,国内学者做出了许多有益的研究
代码
数据检验判断
load SHJ.m %导入数据文件
SHJ=SHJ;
q=size(SHJ);p=q(1);l=q(2);
for i=1:p
x=SHJ(i,:);m=size(x);n=m(2);k=0;K=0;
for j=2:n
lamda(j)=x(j-1)/x(j);
if lamda(j)<exp(2/(n+2))&lamda(j)>exp(-2/(n+1)) k=k+1;
else
break;
end
end
if k~=n-1
disp('有级比不在覆盖范围内');
i
End
灰色预测
load SHJ.m
n=size(SHJ);
m=n(1);
for i=1:m
x=SHJ(i,:);
if i==3
c(i,1)=85;SHJ=SHJ+c(i,1);
elseif i==4
c(i,1)=132;SHJ=SHJ+c(i,1);
else
c(i,1)=37;SHJ=SHJ+c(i,1);
end
sizexd2=size(x,2);%求数组长度
k=0;
for y1=x
k=k+1;
if k>1
x1(k)=x1(k-1)+x(k);%累加生成
z1(k-1)=-0.5*(x1(k)+x1(k-1));%z1维数减1,用于计算B
yn1(k-1)=x(k);
else
x1(k)=x(k);
end
end
%x1,z1,k,yn1
sizez1=size(z1,2);
%size(yn1);
z2=z1';z3=ones(1,sizez1)';
YN=yn1';%转置
%YNB=[z2,z3];
au0=inv(B'*B)*B'*YN;
au=au0';
%B,au0,au
afor=au(1);
ufor=au(2);
ua=au(2)./au(1);
%afor,ufor,ua%输出预测的a u 和u/a的值
constant1=x(1)-ua;
afor1=afor;
x1t1='x1(t+1)';
estr='exp';
tstr='t';
leftbra='(';
rightbra=')';
%constant1,afor1,x1t1,estr,tstr,leftbra,rightbra
for j=40:45
x(i,j)=(x(1)-ua)*exp(afor1*j)-(x(1)-ua)*exp(afor1*(j-1));
x(i,j)=x(i,j)-c(i,1);
end
X(i,1:6)=x(i,40:45)
end
%预测未来4、5月份零售价格
load SHJ.m
n=size(SHJ);
m=n(1);
c=[85,132,37];
SHJ=SHJ+37;
for i=1:m
x=SHJ(i,:);
sizexd2=size(x,2);%求数组长度
k=0;
for y1=x
k=k+1;
if k>1
x1(k)=x1(k-1)+x(k);%累加生成
z1(k-1)=-0.5*(x1(k)+x1(k-1));%z1维数减1,用于计算B
yn1(k-1)=x(k);
else
x1(k)=x(k);
end
end
%x1,z1,k,yn1
sizez1=size(z1,2);
%size(yn1);
z2=z1';
z3=ones(1,sizez1)';
YN=yn1';%转置
%YN
B=[z2,z3];
au0=inv(B'*B)*B'*YN;
au=au0';
%B,au0,au
afor=au(1);
ufor=au(2);
ua=au(2)./au(1);
%afor,ufor,ua
%输出预测的a u 和u/a的值
constant1=x(1)-ua;
afor1=afor;
x1t1='x1(t+1)';
estr='exp';
tstr='t';
leftbra='(';
rightbra=')';
%constant1,afor1,x1t1,estr,tstr,leftbra,rightbra
for j=40:45
x(i,j)=(x(1)-ua)*exp(afor1*j)-(x(1)-ua)*exp(afor1*(j-1));
x(i,j)=x(i,j)-37;
end
x(i,40:45)
end
load SHJ.m
n=size(SHJ);
m=n(1);
l=n(2);
c=[85,132,37];
SHJ=SHJ+37;
for i=1:m
x=SHJ(i,:);
sizexd2=size(x,2);%求数组长度
k=0;
for y1=x
k=k+1;
if k>1
x1(k)=x1(k-1)+x(k);%累加生成
z1(k-1)=-0.5*(x1(k)+x1(k-1));%z1维数减1,用于计算B
yn1(k-1)=x(k);
Else
x1(k)=x(k);
end
end
%x1,z1,k,yn1
sizez1=size(z1,2);
%size(yn1);
z2=z1';
z3=ones(1,sizez1)';
YN=yn1';%转置
%YN
B=[z2,z3];
au0=inv(B'*B)*B'*YN;
au=au0';
%B,au0,au
afor=au(1);
ufor=au(2);
ua=au(2)./au(1);
%afor,ufor,ua
%输出预测的a u 和u/a的值
constant1=x(1)-ua;
afor1=-afor;
x1t1='x1(t+1)';
estr='exp';
tstr='t';
leftbra='(';
rightbra=')';
%constant1,afor1,x1t1,estr,tstr,leftbra,rightbra
%预测已知时间(10.03.05-11.03.25)数据
for j=2:l
x(i,j)=(x(1)-ua)*exp(afor1*j)-(x(1)-ua)*exp(afor1*(j-1));
x(i,j)=x(i,j)-37;
end
X(i,1:l-1)=x(i,2:l);
end
format short
X;
X(36,:)=1.3;
%已知数据矩阵
残差检验
%残差检验
load X.m
load SHJ.m
n=size(X);
m=n(1);
l=n(2);
for i=1:m
for j=1:l
data(i,j)=(X(i,j)-SHJ(i,j))/(SHJ(i,j)+37);
end
end
级比偏差检验
%级比偏差检验
load X.m
load SHJ.m
n=size(X);m=n(1);l=n(2);
for i=1:m
x=SHJ(i,:);
sizexd2=size(x,2);%求数组长度
k=0;
for y1=x
k=k+1;
if k>1
x1(k)=x1(k-1)+x(k);%累加生成
z1(k-1)=-0.5*(x1(k)+x1(k-1));%z1维数减1,用于计算B
yn1(k-1)=x(k);
else
x1(k)=x(k);
end
end
%x1,z1,k,yn1
sizez1=size(z1,2);
%size(yn1);
z2=z1';z3=ones(1,sizez1)';
YN=yn1';%转置
%YN
B=[z2,z3];
au0=inv(B'*B)*B'*YN;
au=au0';
%B,au0,au
afor=au(1);
ufor=au(2);
ua=au(2)./au(1);
%afor,ufor,ua
%输出预测的a u 和u/a的值
for j=2:l
lamda(j)=(x(j-1)+132)/(x(j)+132);
rou(i,j)=1-(1-0.5*afor)/(1+0.5*afor)*lamda(j);
if rou(i,j)>0.1
disp('误差超限');
end
end
rou;
en