目录
0、引言
灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。其用等时距观测到的反映预测对象特征的一系列数量值构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。—— 百度百科
灰色理论认为被预测或被建模的系统是“灰色”的。那么什么是“灰色系统”?
“灰色”概念出现的时候常需要通过对比“白色”、“黑色”的概念来阐述。通俗地讲,“灰色”这个概念其实在很多现实中都可以见到,它本质上是对一些介于明确与不明确之间的一种状态的抽象描述。从人的认知角度来看,人们渴求能够完全认识世界,而认识与描述世界的最重要的工具之一就是数学。
哲学数学不分家,唯物主义认为世界是可知的,但是需要人们不断的去发现和认识。也就是说,世界上是存在着人们还没认识到的知识或者规律以及未探测到的信息,这部分就是“黑色”的,“白色”则是全部信息、规律已知的系统,“黑色”、“白色”之间并不是完全隔离的,比如一个完整的系统,人们了解它的一部分信息和运动规律,还有一部分是完全不了解的,这个系统就可以称为“灰色”系统。
灰色系统举例:以个十字路口的每日车流量为例,对于一个普通的人来说,这个路口车流量的“白色”部分就是**每天都有很多车路过,工作日的上班时间尤其多,周末就少很多**,而“黑色”部分则是**每天的几点到几点之间这个路口会通过多少量车等**。这就是个灰色的系统,这个人想他明天几点开车通过这个路口可以不用堵车,这就需要他预测这个路口的明天路口车流量的情况,当然这种预测有很多方法,这里只提灰色预测。
1、数据预处理
通常与一个系统相关的数据非常的繁杂,而且有些数据也需要进行抽象才能通过数学的方式来表示。为了在后续的计算中方便,常对数据进行归一化处理。
1.1、规范化
假设有一组测量序列:,对该序列进行规范化处理:
MATLAB程序:
clear ; close all; clc
% 生成序列
X = 10*rand(1,10);
% 规范化
Y_nom = (X-min(X))/(max(X)-min(X));
用MATLAB支持的方式可以直接进行规范化。比较标准的就是用for循环来实现。
clear ; close all; clc
% 生成序列
X = 10*rand(1,10);
% 规范化
% 初始化Y_norm1
Y_nom1 = zeros(1,length(X));
% 用for循环实现
for i = 1:length(X)
Y_nom1(i) = (X(i)-min(X))/(max(X)-min(X));
end
1.2、正规化
对于前述序列 ,其正规化方法:
其中: 为均值,,即标准差。
Matlab 实现:
clear ; close all; clc
% 生成序列
X = 10*rand(1,10);
% 正规化
% 均值
xMean = (1/length(X))*sum(X);
% 标准差
s = sqrt((1/(length(X)+1))*(X*X'));
% 计算正规化值
Y = (X-xMean)/s;
对MATLAB矩阵操作不熟的可以使用循环的方式处理,这里不多叙述。
这种方法得到的序列均值为0,方差为1,无量纲。
1.3、归一化
归一化适用于正数序列,,其归一化序列:
clear ; close all; clc
% 生成序列
X = 10*rand(1,10);
% 归一化
Y = X/sum(X);
sum(Y)
2、GM算法流程
2.1、步骤
(1)取得原始序列:。原始数据通常由测量等获得;
(2)通过累加构造新的数据列:
注意新构造的序列与原序列长度相等。
(3)计算均值以构造另一组新的序列:
假设有两个常数 a , b,使:
(4)采用最小二乘法计算常数 a,b,得到白化的微分方程:
(5)解该微分方程,得到拟合方程:
由前面的序列 x 与序列 y 之间的关系可知:
把 表示成拟合方程做差的形式:
在灰色预测中,GM(1,1) 用于表示一阶、单变量的灰色预测微分方程,离散形式就是一阶单序列的线性动态模型,一般用于时间序列预测。
2.2、知其所以然
现在来反观GM算法的流程,提出这样一个问题:为什么要这样处理时间序列来得到灰色模型?
逐步分析:
第一步,测量获得时间序列对应的值:通过离散的形式对一种现象、系统等进行测量,得到一组测量序列,这是常见的得到灰色系统中“白色”部分的重要基础。不必细说。
第二步,通过累加构造新的序列:
这一步看起来比较怪异,但是我们阅读前言中百度百科的阐述可知,灰色预测尝试构造一种系统与时间之间的关联,或者说是一种关系。这种关系本质上是未知的,强行建立联系是不靠谱的,因此,我们需要一个假设:“我们测量的系统在时间上是存在规律的,并且这个规律是线性的”。这个假设非常的强,以至于我们需要构造一个序列,可以表示这种规律。
这个 y 序列就是这样,y 的每一项都由该时刻前面所有测量序列的等权重加和得到,因此我们可以确定,我们构造的 y 序列中保存了 x 序列以及 x 和时间的关系。
接下来就是找到这个关系的数学表达式——>也就是“白化”过程。
第三步,计算均值,构造新的序列:
说实话,我是看不懂这一步到底是在干嘛,构造的 z 序列本质上无非是把 这一项中的 变成了一半。这里先不管到底这一步有什么作用,我们看下一步。
第四步,构造超定方程组,采用最小二乘法求参数:
这一步就非常有意思了,怎么看都觉得这个方程组是有问题的,主要有这些问题:
(1)测量数据已知,z 序列又来源于测量数据,那么当数据超过三组,这个方程不就未知数少于方程数了嘛?
这就叫超定方程组,这种方程我们不能用常规的方法求解,只能计算它的近似解。最常用的方法就是最小二乘法了,直接搜索“最小二乘法求超定方程组解” 即可。
(2)这个方程为什么怎么看都是不对的,假设 x 序列全为正数,那么这个 b 不应该是一直递增的吗?为什么这里是常数呢?
我们随便参考一篇最小二乘法求解的资料 https://wenku.baidu.com/view/abb9dd06eefdc8d376ee32ca.html ,为了方便代入,我们这里做一下简单的变换:
令 变为 , 变为 ;而常数 变为 , 变为 。实际上这里只是简单的符号变化了一下,并没有改变任何意义。现在这个方程组看起来舒服多了:
然后移项:
为了方便处理,化成矩阵形式:
第五步,微分方程:
这个可能又是一头雾水,到这里其实a,b两个参数已经知道了, 其实离散形式就是 ,而这个 就很奇怪了,如果是 y 序列的话其实还好理解,但是前面的方程中求出的a b两个参数是基于 z 序列来求的,实际上与 y 序列是相差 的,如果说忽略了这部分误差的话,也就勉强接受了,这里还希望有大佬能够给个指导。
第六步,求解微分方程并离散化。
这里没什么好说的。
参考:
《MATLAB优化算法与案例第一版》