注:本篇随笔依据《Matlab在数学建模上的应用》中第3章介绍来写,主要简单介绍灰色模型及其Matlab实现
(博客以及Matlab小白,若有不当欢迎指出)

灰色模型(gray model)简介

灰色模型的作用:解决数据预测问题。
灰色模型的优点:实用稳定,不仅适用于大数据量的预测,在数据量比较少时(3个以上即可)预测结果依旧准确。

Matlab中灰色模型的使用

详细流程(熟悉的话可跳过看总结)

(1)先对数据进行预处理。

预处理是指将杂乱无章的数据列通过一定的方法处理,变成有规律的时间序列数据。
常用的数据处理方式有累加和累减两种,通常用累加。
设原始数据列:\(x^{(0)}=(x^{(0)}(1),x^{(0)}(2),...,x^{(0)}(n))\)
累加:\(x^{(1)}(t)=\sum_{k=1}^{t}x^{(0)}(k), t=1,2,...,n\)

(2)建立\(x^{(1)}(t)\)的一阶线性微分方程。

在诸多灰色模型中,单序列一阶线性微分方程模型GM(1,1)最为常用。
\(\frac{dx^{(1)}}{dt}+ax^{(1)}=u\)
其中a,u为待定系数,分别称为发展系数和灰色作用量,构造矩阵\(\widehat{a}=\binom{a}{u}\)

(3)建立累加矩阵B和常数项向量Y。

Python灰色预测模型 灰色预测模型matlab程序_ide

(4)最小二乘法求解灰参数\(\widehat{a}\)。

\(\widehat{a}=(B^{T}B)^{-1}B^{T}Y\)

(5)将灰参数\(\widehat{a}\)代入模型求解。

得到:\(\widehat{x}^{(1)}(t+1)=(x^{(0)}(1)-\frac{u}{a})e^{-at}+\frac{u}{a}\)

(6)还原为\(\widehat{x}^{(0)}\)序列。

\(\widehat{x}^{(0)}(t+1)=\widehat{x}^{(1)}(t+1)-\widehat{x}^{(1)}(t)\)

(7)检验模型。

Python灰色预测模型 灰色预测模型matlab程序_数据_02


也可以直接作图看效果。

(8)利用模型进行预测。

Python灰色预测模型 灰色预测模型matlab程序_Python灰色预测模型_03

大致流程(总结)

①对原始数据进行累加。(弱化随机性和波动性)
②构建累加矩阵B与常数向量。
③求解灰参数。
④将参数带入预测模型进行数据预测。

模版代码

clear
A=[1810,1938,1838,1463];      %数据(必须大于3个)
B=cumsum(A);                  %对向量中的元素累加(第几个等于原来的前几个之和)
n=length(A);                  %数据量(向量长度)

for i=1:(n-1)                  %求相邻数据的均值向量
    C(i)=(B(i)+B(i+1))/2;
end
E=[-C;ones(1,n-1)];            %求累加矩阵B

D=A;D(1)=[];
D=D';                          %求常数项列向量Y

c=(E*E')\(E*D);                %求系数矩阵(列向量)a
c=c';                          %转置(变为行向量)

a=c(1);b=c(2);
F=[];F(1)=A(1);
for i=2:(n+3)                  %还要预测接下来的3个数据
    F(i)=(A(1)-b/a)/exp(a*(i-1))+b/a;      %直接带入灰参数得到模型,求数据
end

G=[];G(1)=A(1);
for i=2:(n+3)
    G(i)=F(i)-F(i-1);      %还原序列(去累加)
end

t1=1:4;
t2=1:7;
G                        %显示根据灰色模型得到的数据
plot(t1,A,'o',t2,G)      %作图,将原始数据与灰色模型得到的数据相比较