文章目录
引入1 GM (1, 1)模型2 程序框架引入
灰色模型,又称灰色理论,具有实用性强、预测结果较稳定的优点;用于大数据量的预测,数据量较小时 (多于3个)也能取得较准确的结果。
灰色预测以灰色模型为基础,其中以单序列一阶线性微分方程模型,即GM (1, 1)最为常用。
1 GM (1, 1)模型
设有原始数据序列x0=(x01,x02,⋯,x0,n)\boldsymbol{x}_0=\left(x_{01}, x_{02}, \cdots, x_{0, n}\right)x0=(x01,x02,⋯,x0,n),nnn为数据个数,则以GM (1, 1)模型进行预测的基本步骤如下:
1)x0\boldsymbol{x}_0x0累加,以降低原始序列的波动性和随机性,获得新序列x1=(x11,x12,⋯,x1,n)\boldsymbol{x}_1=\left(x_{11}, x_{12}, \cdots, x_{1, n}\right)x1=(x11,x12,⋯,x1,n),其中x1tx_{1t}x1t的计算如下:
x1,t=∑k=1tx0,k,t=1,2,⋯,nx_{1, t} = \sum_{k = 1}^t x_{0, k},\ \ \ \ t = 1, 2, \cdots, n x1,t=k=1∑tx0,k,t=1,2,⋯,n2)建立x1,tx_{1, t}x1,t的一阶线性微分方程:
dx1dt+ax1=u\frac{\mathrm{d} \bm{x}_1}{\mathrm{d} t} + a \bm{x}_1 = u dtdx1+ax1=u其中a∈[−2,2]a \in [-2, 2]a∈[−2,2]、uuu为待定系数,称为发展系数和灰色作用量,且将aaa、uuu构成的矩阵记作a^=(au)\bm{\hat{a}} = \left( \begin{array}{l}a\\u \end{array}\right)a^=(au)
3)按以下方式生成B\boldsymbol{B}B矩阵和Yn\boldsymbol{Y}_nYn向量:
B=[0.5(x11+x12)0.5(x12+x13)⋯0.5(x1,(n−1)+x1,n)]Yn=(x02,x03,⋯,x0,n)T\begin{array}{l} \boldsymbol{B} = \left[ \begin{array}{c} 0.5(x_{11} + x_{12})\\ 0.5(x_{12} + x_{13})\\ \cdots\\ 0.5(x_{1, (n - 1)} + x_{1, n})\\ \end{array} \right]\\ \\ \boldsymbol{Y}_n = (x_{02}, x_{03}, \cdots, x_{0, n})^{\mathrm{T}} \end{array} B=⎣⎢⎢⎡0.5(x11+x12)0.5(x12+x13)⋯0.5(x1,(n−1)+x1,n)⎦⎥⎥⎤Yn=(x02,x03,⋯,x0,n)T4)使用最小二乘法求a^\bm{\hat{a}}a^:
a^=(BTB)−1BTYn\bm{\hat{a}} = (\boldsymbol{B}^{\mathrm{T}}\boldsymbol{B})^{-1} \boldsymbol{B}^T \boldsymbol{Y}_n a^=(BTB)−1BTYn5)将a^\bm{\hat{a}}a^带入微分方程,求得:
x^1,(t+1)=(x11−ua)e−at+ua\hat{x}_{1, (t + 1)} = (x_{11} - \frac{u}{a}) e^{-at} + \frac{u}{a} x^1,(t+1)=(x11−au)e−at+au这里写作x^1,(t+1)\hat{x}_{1, (t + 1)}x^1,(t+1)是因为该值是一个近似值。
6)对函数表达式x^1,(t+1)\hat{x}_{1, (t + 1)}x^1,(t+1)及x^1,t\hat{x}_{1, t}x^1,t进行离散,并通过以下方式还原x0x_0x0原序列:
x^0,(t+1)=x^1,(t+1)−x^1,t\hat{x}_{0, (t + 1)} = \hat{x}_{1, (t + 1)} - \hat{x}_{1, t} x^0,(t+1)=x^1,(t+1)−x^1,t7)对建立的灰色模型进行检验,步骤如下:
7.1)计算x0,tx_{0, t}x0,t与x^0,t\hat{x}_{0, t}x^0,t之间的残差e0,te_{0, t}e0,t和相对误差q(x)q (x)q(x):
e0,t=x0,t−x^0,tq(x)=e0,tx0,t\begin{array}{c} e_{0, t} = x_{0, t} - \hat{x}_{0, t}\\ q (x) = \frac{e_{0, t}}{x_{0, t}} \end{array} e0,t=x0,t−x^0,tq(x)=x0,te0,t
7.2)求原始数据x0x_0x0的均值和方差s1s_1s1;
7.3)求e0,te_{0, t}e0,t的均值qˉ\bar{q}qˉ以及方差s2s_2s2;
7.4)计算方差比C=s2s1C = \frac{s_2}{s_1}C=s1s2
7.5)求小误差概率P=P{∣e0,t∣<0.6745s1}P = P \{ |e_{0, t}| < 0.6745 s_1 \}P=P{∣e0,t∣<0.6745s1};
7.6)灰色模型精度检验表如下:
8)利用模型进行预测:
x^0=[x^01,x^02,⋯,x^0,n,⏟原数据的模拟x^0,(n+1),⋯,x^0,(n+m)⏟数据预测]\bm{\hat{x}}_0 = \left[ \underbrace{\hat{x}_{01}, \hat{x}_{02}, \cdots, \hat{x}_{0, n}, }_{_{_{\rm 原数据的模拟}}}\ \underbrace{\hat{x}_{0, (n + 1)}, \cdots, \hat{x}_{0, (n + m)} }_{_{_{\rm 数据预测}}}\right] x^0=[原数据的模拟x^01,x^02,⋯,x^0,n,数据预测x^0,(n+1),⋯,x^0,(n+m)]
2 程序框架
代码实现,使用时只需给定序列和待预测数据个数:
function [hat_x] = test(x, n_pre)syms a u; % 创建符号变量hat_a = [a, u]'; % 待定系数x1 = cumsum(x); % 原始数据累加n = length(x);%% 生成B矩阵B = zeros(1, n - 1);for i = 1 : n - 1B(i) = (x1(i) + x1(i + 1)) / 2; endB = [-B; ones(1, n - 1)];%% 生成Y_n矩阵Y_n = x;Y_n(1) = [];Y_n = Y_n';%% 求解hat_ahat_a = inv(B * B') * B * Y_n;a = hat_a(1);u = hat_a(2);%% 预测hat_x1 = [];hat_x1(1) = x(1);for i = 2 : (n + n_pre)hat_x1(i) = (x(1) - u /a) / exp(a * (i - 1)) + u / a;endhat_x = [];hat_x(1) = x(1);for i = 2 : (n + n_pre)hat_x(i) = hat_x1(i) - hat_x1(i - 1);endend
参考文献:
[1]:MATLAB在数学建模中的应用,卓金武等。