Bootstrap

灰色预测:原理、建模与实战应用

摘要
本文深入解析灰色系统理论中的灰色预测方法,涵盖GM(1,1)模型构建、数据检验、误差分析及交变预测技术。通过降雨量异常值预测与交通噪声动态建模案例,详细阐述累加生成、参数估计、白化方程求解及残差检验全流程,并结合MATLAB代码实现模型参数优化与预测值还原,为处理小样本、非平稳序列的预测问题提供系统解决方案。
关键词:灰色预测 GM(1,1)模型 累加生成 白化方程 残差检验


1. 灰色预测概述

灰色预测是灰色系统理论的核心方法之一,通过有限数据建模揭示系统动态规律,适用于小样本、非典型分布场景。其核心思想是将随机序列视为灰色过程,利用**累加生成(AGO)**弱化随机性,构建微分方程模型(如GM(1,1))进行预测。主要应用领域包括:

  • 经济指标趋势分析
  • 灾害预警(如早灾、疫情)
  • 工业设备寿命预测

2. 灰色预测方法流程

2.1 数据预处理与检验

2.1.1 级比检验

对原始序列 x ( 0 ) = ( x ( 0 ) ( 1 ) , x ( 0 ) ( 2 ) , … , x ( 0 ) ( n ) ) x^{(0)} = (x^{(0)}(1), x^{(0)}(2), \dots, x^{(0)}(n)) x(0)=(x(0)(1),x(0)(2),,x(0)(n)),计算级比
λ ( k ) = x ( 0 ) ( k − 1 ) x ( 0 ) ( k ) , k = 2 , 3 , … , n \lambda(k) = \frac{x^{(0)}(k-1)}{x^{(0)}(k)}, \quad k=2,3,\dots,n λ(k)=x(0)(k)x(0)(k1),k=2,3,,n
要求所有 λ ( k ) \lambda(k) λ(k) 落在可容覆盖区间 Θ = ( e − 2 / ( n + 1 ) , e 2 / ( n + 1 ) ) \Theta = (e^{-2/(n+1)}, e^{2/(n+1)}) Θ=(e2/(n+1),e2/(n+1)) 内。若未通过检验,需进行平移变换
y ( 0 ) ( k ) = x ( 0 ) ( k ) + c y^{(0)}(k) = x^{(0)}(k) + c y(0)(k)=x(0)(k)+c

示例:交通噪声数据检验

某城市1986–1992年噪声数据为:
x ( 0 ) = ( 71.1 , 72.4 , 72.4 , 72.1 , 71.4 , 72.0 , 71.6 ) x^{(0)} = (71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6) x(0)=(71.1,72.4,72.4,72.1,71.4,72.0,71.6)
计算级比:
λ = ( 0.982 , 1.0 , 1.0042 , 1.0098 , 0.9917 , 1.0056 ) \lambda = (0.982, 1.0, 1.0042, 1.0098, 0.9917, 1.0056) λ=(0.982,1.0,1.0042,1.0098,0.9917,1.0056)
所有 λ ( k ) ∈ [ 0.982 , 1.0098 ] \lambda(k) \in [0.982, 1.0098] λ(k)[0.982,1.0098],符合 Θ = ( e − 2 / 8 , e 2 / 8 ) ≈ ( 0.7788 , 1.284 ) \Theta = (e^{-2/8}, e^{2/8}) \approx (0.7788, 1.284) Θ=(e2/8,e2/8)(0.7788,1.284),可通过检验。

2.2 建立GM(1,1)模型

2.2.1 累加生成与均值序列
  1. 累加序列
    x ( 1 ) ( k ) = ∑ i = 1 k x ( 0 ) ( i ) , k = 1 , 2 , … , n x^{(1)}(k) = \sum_{i=1}^k x^{(0)}(i), \quad k=1,2,\dots,n x(1)(k)=i=1kx(0)(i),k=1,2,,n
  2. 紧邻均值序列
    z ( 1 ) ( k ) = 0.5 x ( 1 ) ( k ) + 0.5 x ( 1 ) ( k − 1 ) , k = 2 , 3 , … , n z^{(1)}(k) = 0.5x^{(1)}(k) + 0.5x^{(1)}(k-1), \quad k=2,3,\dots,n z(1)(k)=0.5x(1)(k)+0.5x(1)(k1),k=2,3,,n
示例:噪声数据累加生成
  • 原始序列: x ( 0 ) = ( 71.1 , 72.4 , 72.4 , 72.1 , 71.4 , 72.0 , 71.6 ) x^{(0)} = (71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6) x(0)=(71.1,72.4,72.4,72.1,71.4,72.0,71.6)
  • 累加序列:
    x ( 1 ) = ( 71.1 , 143.5 , 215.9 , 288.0 , 359.4 , 431.4 , 503.0 ) x^{(1)} = (71.1, 143.5, 215.9, 288.0, 359.4, 431.4, 503.0) x(1)=(71.1,143.5,215.9,288.0,359.4,431.4,503.0)
  • 紧邻均值序列:
    z ( 1 ) = ( 107.3 , 179.7 , 251.95 , 323.7 , 395.4 , 467.2 ) z^{(1)} = (107.3, 179.7, 251.95, 323.7, 395.4, 467.2) z(1)=(107.3,179.7,251.95,323.7,395.4,467.2)
2.2.2 灰微分方程与参数估计

GM(1,1)模型方程为:
x ( 0 ) ( k ) + a z ( 1 ) ( k ) = b x^{(0)}(k) + a z^{(1)}(k) = b x(0)(k)+az(1)(k)=b
构造矩阵 B B B 与向量 Y Y Y
B = [ − z ( 1 ) ( 2 ) 1 − z ( 1 ) ( 3 ) 1 ⋮ ⋮ − z ( 1 ) ( n ) 1 ] , Y = [ x ( 0 ) ( 2 ) x ( 0 ) ( 3 ) ⋮ x ( 0 ) ( n ) ] B = \begin{bmatrix} -z^{(1)}(2) & 1 \\ -z^{(1)}(3) & 1 \\ \vdots & \vdots \\ -z^{(1)}(n) & 1 \end{bmatrix}, \quad Y = \begin{bmatrix} x^{(0)}(2) \\ x^{(0)}(3) \\ \vdots \\ x^{(0)}(n) \end{bmatrix} B= z(1)(2)z(1)(3)z(1)(n)111 ,Y= x(0)(2)x(0)(3)x(0)(n)
最小二乘法求解参数:
u ^ = ( a , b ) T = ( B T B ) − 1 B T Y \hat{u} = (a, b)^T = (B^T B)^{-1} B^T Y u^=(a,b)T=(BTB)1BTY

示例:噪声模型参数

a ^ = 0.0023 , b ^ = 72.6573 \hat{a} = 0.0023, \quad \hat{b} = 72.6573 a^=0.0023,b^=72.6573

2.2.3 白化方程与预测

白化方程为:
d x ( 1 ) d t + a x ( 1 ) = b \frac{dx^{(1)}}{dt} + a x^{(1)} = b dtdx(1)+ax(1)=b
时间响应式:
x ^ ( 1 ) ( k + 1 ) = ( x ( 0 ) ( 1 ) − b a ) e − a k + b a \hat{x}^{(1)}(k+1) = \left( x^{(0)}(1) - \frac{b}{a} \right) e^{-a k} + \frac{b}{a} x^(1)(k+1)=(x(0)(1)ab)eak+ab
还原预测值:
x ^ ( 0 ) ( k + 1 ) = x ^ ( 1 ) ( k + 1 ) − x ^ ( 1 ) ( k ) \hat{x}^{(0)}(k+1) = \hat{x}^{(1)}(k+1) - \hat{x}^{(1)}(k) x^(0)(k+1)=x^(1)(k+1)x^(1)(k)

示例:噪声预测结果

x ^ ( 1 ) ( k + 1 ) = − 30929 e − 0.0023 k + 31000 \hat{x}^{(1)}(k+1) = -30929 e^{-0.0023k} + 31000 x^(1)(k+1)=30929e0.0023k+31000
预测值与残差如下表:

年份实际值预测值残差相对误差
198671.171.100%
198772.472.4057-0.00570.01%
198872.472.23620.16380.23%
198972.172.06710.03290.05%
199071.471.8984-0.49840.7%
199172.071.73010.26990.37%
199271.671.56220.03780.05%

3. 预测精度检验

3.1 残差检验

残差与相对误差计算:
ε ( k ) = x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) , Δ ( k ) = ∣ ε ( k ) x ( 0 ) ( k ) ∣ \varepsilon(k) = x^{(0)}(k) - \hat{x}^{(0)}(k), \quad \Delta(k) = \left| \frac{\varepsilon(k)}{x^{(0)}(k)} \right| ε(k)=x(0)(k)x^(0)(k),Δ(k)= x(0)(k)ε(k)

  • 一般要求 Δ ( k ) < 0.2 \Delta(k) < 0.2 Δ(k)<0.2
  • 高精度要求 Δ ( k ) < 0.1 \Delta(k) < 0.1 Δ(k)<0.1

3.2 级比偏差检验

根据发展系数 a a a 计算级比偏差:
ρ ( k ) = 1 − ( 1 − 0.5 a 1 + 0.5 a ) λ ( k ) \rho(k) = 1 - \left( \frac{1 - 0.5a}{1 + 0.5a} \right) \lambda(k) ρ(k)=1(1+0.5a10.5a)λ(k)

  • 一般要求 ρ ( k ) < 0.2 \rho(k) < 0.2 ρ(k)<0.2
  • 高精度要求 ρ ( k ) < 0.1 \rho(k) < 0.1 ρ(k)<0.1

4. 交变预测:异常值时间预测

4.1 定义与应用场景

交变预测不直接预测数值大小,而是预测异常值出现的时间,适用于灾害预警(如早灾、疫情爆发)。

示例:早灾预测

某地区年平均降雨量数据:
x ( 0 ) = ( 390.6 , 412 , 320 , 559.2 , 380.8 , 542.4 , 553 , 310 , 561 , 300 , 632 , 540 , 406.2 , 313.8 , 576 , 587.6 , 318.5 ) x^{(0)} = (390.6, 412, 320, 559.2, 380.8, 542.4, 553, 310, 561, 300, 632, 540, 406.2, 313.8, 576, 587.6, 318.5) x(0)=(390.6,412,320,559.2,380.8,542.4,553,310,561,300,632,540,406.2,313.8,576,587.6,318.5)
设定阈值 ζ = 320 \zeta = 320 ζ=320,筛选异常时刻:

  • 异常时刻序列: t = ( 3 , 8 , 10 , 14 , 17 ) t = (3, 8, 10, 14, 17) t=(3,8,10,14,17)
  • 累加生成: t ( 1 ) = ( 3 , 11 , 21 , 35 , 52 ) t^{(1)} = (3, 11, 21, 35, 52) t(1)=(3,11,21,35,52)
  • 建立GM(1,1)模型预测下次早灾时间: t ^ ( 0 ) ( 6 ) = 22.034 \hat{t}^{(0)}(6) = 22.034 t^(0)(6)=22.034,即5年后。

5. MATLAB代码实战

5.1 GM(1,1)建模与预测

clc, clear  
x0 = [71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6];  
n = length(x0);  

% 累加生成  
x1 = cumsum(x0);  

% 构建数据矩阵B和Y  
B = [-0.5*(x1(1:end-1) + x1(2:end))', ones(n-1,1)];  
Y = x0(2:end)';  

% 参数估计  
u = B \ Y;  
a = u(1); b = u(2);  

% 白化方程求解  
syms t;  
x = dsolve('Dx + a*x = b', 'x(0) = x0(1)');  
x_model = subs(x, {'a', 'b'}, {u(1), u(2)});  

% 预测值计算  
k = 0:n-1;  
x1_hat = double(subs(x_model, 't', k));  
x0_hat = [x1_hat(1), diff(x1_hat)];  

% 残差与误差分析  
epsilon = x0 - x0_hat;  
delta = abs(epsilon ./ x0);  
disp('平均相对误差: ');  
disp(mean(delta(2:end)));  

5.2 交变预测实现

clc, clear  
a = [390.6, 412, 320, 559.2, 380.8, 542.4, 553, 310, 561, 300, 632, 540, 406.2, 313.8, 576, 587.6, 318.5];  
t0 = find(a <= 320);  % 筛选异常时刻  
n = length(t0);  

% 累加生成异常时刻序列  
t1 = cumsum(t0);  

% 构建GM(1,1)模型  
B = [-0.5*(t1(1:end-1) + t1(2:end))', ones(n-1,1)];  
Y = t0(2:end)';  
u = B \ Y;  

% 预测下次异常时间  
syms k;  
t_hat = (t0(1) - u(2)/u(1)) * exp(-u(1)*k) + u(2)/u(1);  
next_t = floor(double(subs(t_hat, 'k', n)));  
disp(['下次早灾发生在第 ', num2str(next_t), ' 年']);  

6. 总结

灰色预测通过累加生成与微分方程建模,有效解决了小样本、非平稳序列的预测难题。核心步骤包括数据检验、参数估计、白化方程求解及残差分析,结合MATLAB实现可快速完成模型构建与验证。实际应用中需注意数据预处理的合理性及模型精度的多维度检验,后续可进一步研究GM(2,1)、Verhulst等复杂模型以应对更复杂系统。

;