摘要
本文深入解析灰色系统理论中的灰色预测方法,涵盖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)(k−1),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)})
Θ=(e−2/(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)
Θ=(e−2/8,e2/8)≈(0.7788,1.284),可通过检验。
2.2 建立GM(1,1)模型
2.2.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=1∑kx(0)(i),k=1,2,…,n - 紧邻均值序列:
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)(k−1),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)11⋮1
,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)e−ak+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)=−30929e−0.0023k+31000
预测值与残差如下表:
年份 | 实际值 | 预测值 | 残差 | 相对误差 |
---|---|---|---|---|
1986 | 71.1 | 71.1 | 0 | 0% |
1987 | 72.4 | 72.4057 | -0.0057 | 0.01% |
1988 | 72.4 | 72.2362 | 0.1638 | 0.23% |
1989 | 72.1 | 72.0671 | 0.0329 | 0.05% |
1990 | 71.4 | 71.8984 | -0.4984 | 0.7% |
1991 | 72.0 | 71.7301 | 0.2699 | 0.37% |
1992 | 71.6 | 71.5622 | 0.0378 | 0.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.5a1−0.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等复杂模型以应对更复杂系统。