灰色预测

一、什么是灰色预测?

灰色预测就是在灰色系统中所作的预测。那什么是灰色系统呢?所谓的灰色系统其实就是夹杂在白色系统和黑色系统之中的一种系统,而白色系统就是全部信息已知的系统,黑色系统就是全部信息未知的系统。所以,夹在这两种系统中间的灰色系统就是部分信息已知,而部分信息也是未知的系统。所以灰色预测就是通过这样的信息前提下做的一种预测分析。灰色预测通过鉴别个因素之间的差异程度,进行关联分析,对原始数据处理后生成一定规律性的序列,然后建立相应的微分方程模型,从而预测事物未来的发展趋势,最后得到其发展的模型

二、如何运用灰色预测?

了解了灰色预测的概念之后,怎么去运用灰色预测法呢?

首先进行我在之前说到的关联分析,所谓关联分析其实就是对某件事物的动态发展数据集合,在一定时期中做一定的比较。下面盗用我在网上找到的某位大佬的例子(侵删):

其实这就是一个简单的关联分析的例子,几何形状越是接近,关联程度也就越大。当然,如果我们要对更多更复杂的数据进行关联分析,肯定是无法用肉眼得到分析结果的,因此,我们肯定需要一种计算方法来得到我们想要的关联分析结果。

首先引入一个概念,灰色预测中最常用的一个模型——GM(1,1)模型,也就是表示模型是一阶微分方程,且只含一个变量的灰色模型。这篇文章也以GM(1,1)为例。

GM(1,1)模型预测步骤?

(1)数据的检验与处理

首先,为了保证建模的可行性,需要对已知序列作必要的检验,首先就是求序列的级比,看看是否所有的级比都落在可容覆盖内。

matlab程序如下(假设x0中是一列列向量)

x0 = xlsread('');
x0=(x0(:,1))'

n = length(x0);
% 做级比判断,看看是否适合用GM(1,1)建模
lamda = x0(1:n-1)./x0(2:n);
range = minmax(lamda);
% 判定是否适合用一阶灰色模型建模
if range(1,1) < exp(-(2/(n+2))) | range(1,2) > exp(2/(n+2))
    error('级比没有落入灰色模型的范围内');
else
   % 空行输出
    disp('              ');
    disp('可用G(11)建模');
end

(2)建立模型

我们需要通过白化微分方程得到

matlab程序如下

% 做AGO累加处理
x1 = cumsum(x0);
for i = 2:n
    % 计算紧邻均值,也就是白化背景值
    z(i) = 0.5*(x1(i)+x1(i-1));
end
B = [-z(2:n)',ones(n-1,1)];
Y = x0(2:n)';
% 矩阵做除法,计算发展系数和灰色作用量
% 千万注意:这里是右除,不是左除
u = B\Y;
% 在MATLAB中,用大写做字母D表示导数,dsolve函数用来求解符号常微分方程
x = dsolve('Dx+a*x=b','x(0)=x0');
% subs函数的作用是替换元素,这里是把常量a,b,x0换成具体u(1),u(2),x1(1)数值
x = subs(x,{'a','b','x0'},{u(1),u(2),x1(1)});
forecast1 = subs(x,'t',[0:n-1]);
% digits和vpa函数用来控制计算的有效数字位数
digits(6);
% y值是AGO形式的(还是累加的)
y = vpa(x);
% 把AGO输出值进行累减
% diff用于对符号表达式进行求导
% 但是如果输入的是向量,则表示计算原向量相邻元素的差
forecast11 = double(forecast1);
exchange = diff(forecast11);
% 输出灰色模型预测的值
forecast = [x0(1),exchange]

(3)检验预测值

% 计算残差
epsilon = x0 - forecast;
% 计算相对误差
delta = abs(epsilon./x0);

% 检验模型的误差
% 检验方法一:相对误差Q检验法
Q = mean(delta)
% 检验方法二:方差比C检验法
% 计算标准差函数为std(x,a)
% 如果后面一个参数a取0表示的是除以n-1,如果是1就是最后除以n
C = std(epsilon,1)/std(x0,1)
% 检验方法三:小误差概率P检验法
S1 = std(x0,1);
S1_new = S1*0.6745;
temp_P = find(abs(epsilon-mean(epsilon)) < S1_new);
P = length(temp_P)/n

发布于 2018-06-11

文章被以下专栏收录