灰色预测小结

应用

灰色预测模型是通过少量的、不完全的信息,建立数学模型并做出预测的一种预测方法。是处理小样本(4个就可以)预测问题的有效工具,而对于小样本预测问题回归和神经网络的效果都不太理想。

灰色预测数列

1.累加生成数列

从前依次往后对初始数列进行累加,生成累加数列,这一步是为了挖掘数据之间的关系的,也许原始数据之间的关系并不明显,不过累加生成数列的规律很明显。

灰色预测小结_第1张图片

2.加权邻值生成数列

将相邻两项的累加生成数列进行加权相加。

灰色预测小结_第2张图片

一般取a为0.5,生成等权邻值生成数。

灰色预测步骤

1.对原始数据进行检验

使用灰色预测之前首先要对原始数据进行级比检验,判断数据是否满足准指数规律。其中级比公式如下,X0表示原始数据。

\lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)}, k=2,3, \cdots, n \text {. }

代码如下:

x=input('请输入数据');

n=length(x);

jibi = ones(1,n-1);

for i = 2:n

jibi(i-1) = x(i-1)/x(i);

end

max1 = max(jibi);

min1 = min(jibi);

fanwei = exp(2/(n+2))-exp(-2/(n+1))

if max1 - min1

disp(['数据通过级比检验']);

else

disp(['数据不通过级比检验']);

end

灰色预测步骤

再通过级比检验之后,就可以进行灰色预测了。

1.首先生成累加数列。

2.再通过加权邻值生成等权邻值生成数。

3.通过推导可知我们生成的等权邻值生成数满足一定的指数规律,我们的目标就是求出下列灰微分方程中a,b的值:

d(k)+a z^{(1)}(k)=b

于是我们构造出以下矩阵对a,b进行求解,其中Y = B*u。

u=\left[\begin{array}{l} a \\ b \end{array}\right], Y=\left[\begin{array}{c} x^0(2) \\ x^0(3) \\ \ldots \\ x^0(n) \end{array}\right], B=\left[\begin{array}{cc} -z^1(2) & 1 \\ -z^1(3) & 1 \\ \ldots \ldots & \\ -z^1(n) & 1 \end{array}\right]

4.得到灰微分方程后我们就可以对数据进行预测了。

5.最后进行检验,本文用了两种常见的检验方式。

(1)残差检验:

\varepsilon(k)=\frac{x^{(0)}(k)-\hat{x}^{(0)}(k)}{x^{(0)}(k)}, k=1,2, \cdots, n

当所有残差的绝对值小于0.1时,认为模型达到较高要求;当所有残差的绝对值小于0.2时,认为模型达到一般要求。

(2)后验差检验

1)先根据预测值X1算出预测值X0。

\hat{x}^0(k)=\hat{x}^1(k)-\hat{x}^1(k-1), k=2,3, \ldots, n

2)在每一个预测值和初始值的残差

e(k)=x^0(k)-\hat{x}^0(k), k=1,2, \ldots, n

3)计算原始序列的方差S1和残差的方差S2。

灰色预测小结_第3张图片

4)计算后验差比。

C=\frac{S_2}{S_1}

5)根据查表得出预测效果的好坏。

灰色预测小结_第4张图片

代码如下:

 

x=input('请输入数据');%x表示原数据

n=length(x);

x1 = ones(1,n);

x1(1)=x(1);

%%生成一次累加数列

for i=2:n

x1(i)=x1(i-1)+x(i)% x1表示累加后的数据

end

z=ones(n-1,2);

%%加权生成数列z

for i=1:(n-1)

z(i,1)=-(x1(i)+x1(i+1))/2;

z(i,2)=1;

end

B=z';

for i=1:(n-1)

x0(i)=x(i+1);%x0表示初始数据的2-n项

end

x0=x0';

U=inv(B*z)*B*x0;

a=U(1);

b=U(2);

t=b/a;

t_test=input('输入需要预测的个数');

i=1:t_test+n;

yucezhi1(i+1)=(x(1)-t).*exp(-a.*i)+t;

yucezhi1(1)=x(1);

yucezhi0 = x(1);

for j=n+t_test:-1:2

yucezhi0(j)=yucezhi1(j)-yucezhi1(j-1);

end

x_init = x;

x=1:n;

xs=2:n+t_test;

yn=yucezhi0(2:n+t_test);

plot(x,x,'^r',xs,yn,'*-b');

% det=0;

% for i=2:n

% det=det+abs(yn(i)-x(i));

% end

% det=det/(n-1);

% disp(['百分绝对误差为:',num2str(det),'%']);

x0 = x0';

%%进行普通的残差检验

for i = 1:n

cancha0(i) = abs((x_init(i)-yucezhi0(i))/x_init(i));

end

cancha_max = max(cancha0);

if cancha_max<0.1

disp(['数据达到较高的要求'])

elseif cancha_max<0.2

disp(['数据达到一般的要求'])

else

disp(['数据不满足要求'])

end

%%进行后验差检验

cancha1(i) = (x_init(i)-yucezhi0(i));

s1 = 0;

s2 = 0;

x_average = sum(x_init)/n;

e_average = sum(cancha1)/n;

for i = i:n

s1 = s1+(x_init(i)-x_average)^2;

s2 = s2+(cancha1(i)-e_average)^2;

end

s1 = s1/n;

s2 = s2/n;

C = s2/s1;

if C<=0.35

disp(['一级,效果好']);

elseif C<=0.5 &C>0.35

disp(['二级,合格']);

elseif C<=0.65 &C>0.5

disp(['三级,勉强']);

else

disp(['四级,不合格']);

end

disp(['预测值为:',num2str(yucezhi0(n+1:n+t_test))]);

 我使用的数据是:[71.1 72.4 72.4 72.1 71.4 72. 71.6],得到的结果是:

 

 

你可能感兴趣的:(数学建模小结,预测类问题,matlab)