基于GRNN的货运量预测:原理、实践与案例分析
一、引言
在物流和运输行业中,准确的货运量预测对于合理规划运输资源、制定物流策略以及优化供应链管理至关重要。传统的预测方法往往难以处理复杂的非线性关系,而广义回归神经网络(Generalized Regression Neural Network,GRNN)作为一种强大的机器学习工具,因其对非线性数据的出色拟合能力和快速学习速度,在货运量预测领域展现出了巨大的应用潜力。本文将深入介绍GRNN的原理、实现步骤,并通过一个具体的案例分析其在货运量预测中的应用效果。
二、GRNN原理详解
(一)理论基础
GRNN是基于非参数回归理论和概率论发展而来的。其核心思想是通过样本数据来估计输入变量和输出变量之间的联合概率密度函数,进而得到给定输入下输出的条件期望作为预测值。假设
X
X
X是输入变量,
Y
Y
Y是输出变量,它们的联合概率密度函数为
f
(
X
,
Y
)
f(X,Y)
f(X,Y),那么在给定输入
X
X
X的条件下,输出
Y
Y
Y的条件期望
E
[
Y
∣
X
]
E[Y|X]
E[Y∣X]可以表示为:
E
[
Y
∣
X
]
=
∫
−
∞
∞
y
f
(
X
,
Y
)
d
y
∫
−
∞
∞
f
(
X
,
Y
)
d
y
E[Y|X] = \frac{\int_{-\infty}^{\infty} y f(X,Y) dy}{\int_{-\infty}^{\infty} f(X,Y) dy}
E[Y∣X]=∫−∞∞f(X,Y)dy∫−∞∞yf(X,Y)dy
(二)网络结构
GRNN主要由四层组成:
- 输入层:输入层的神经元数量等于输入变量的维度,其作用是将输入数据直接传递到下一层。
- 模式层:模式层的神经元数量与训练样本的数量相同。对于每个训练样本
X
i
X_i
Xi,模式层的神经元计算输入向量
X
X
X与该训练样本之间的欧氏距离,并通过高斯函数进行转换,其输出公式为:
P i = exp ( − ( X − X i ) T ( X − X i ) 2 σ 2 ) P_i = \exp\left(-\frac{(X - X_i)^T (X - X_i)}{2\sigma^2}\right) Pi=exp(−2σ2(X−Xi)T(X−Xi))
其中, σ \sigma σ是平滑因子(也称为spread参数),它控制着高斯函数的宽度,对网络的性能有重要影响。 - 求和层:求和层有两个神经元,分别进行不同的求和操作。一个神经元对模式层的所有输出进行求和,即:
S D = ∑ i = 1 n P i S_D = \sum_{i = 1}^{n} P_i SD=i=1∑nPi
另一个神经元对模式层的每个输出乘以对应的训练样本的输出值 Y i Y_i Yi后再求和,即:
S N = ∑ i = 1 n Y i P i S_N = \sum_{i = 1}^{n} Y_i P_i SN=i=1∑nYiPi
这里 n n n是训练样本的数量。 - 输出层:输出层的神经元数量等于输出变量的维度,其输出值为:
Y ^ = S N S D \hat{Y} = \frac{S_N}{S_D} Y^=SDSN
这就是GRNN对输入 X X X的预测输出。
三、GRNN在货运量预测中的实现步骤
(一)数据准备
首先,需要收集与货运量相关的数据,如历史货运量、经济指标、季节因素等。将数据分为训练集和测试集,一般可以按照一定的比例(如80%训练集,20%测试集)进行划分。同时,为了提高网络的训练效果,通常需要对数据进行归一化处理,常用的归一化方法有线性归一化和零均值归一化。
(二)网络构建与训练
使用MATLAB等工具构建GRNN网络,并通过训练集对网络进行训练。在MATLAB中,可以使用newgrnn
函数来创建GRNN网络,该函数的基本语法为:
net = newgrnn(P, T, spread);
其中,P
是训练输入数据矩阵,T
是训练输出数据矩阵,spread
是平滑因子。在训练过程中,需要通过交叉验证等方法选择合适的平滑因子,以获得最佳的预测性能。
(三)模型预测与评估
使用训练好的GRNN网络对测试集进行预测,并将预测结果与真实值进行比较,评估模型的预测性能。常用的评估指标包括均方误差(Mean Squared Error,MSE)、平均绝对误差(Mean Absolute Error,MAE)和决定系数(Coefficient of Determination,
R
2
R^2
R2)等。这些指标的计算公式分别为:
M
S
E
=
1
n
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
MSE = \frac{1}{n} \sum_{i = 1}^{n} (y_i - \hat{y}_i)^2
MSE=n1i=1∑n(yi−y^i)2
M
A
E
=
1
n
∑
i
=
1
n
∣
y
i
−
y
^
i
∣
MAE = \frac{1}{n} \sum_{i = 1}^{n} |y_i - \hat{y}_i|
MAE=n1i=1∑n∣yi−y^i∣
R
2
=
1
−
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
R^2 = 1 - \frac{\sum_{i = 1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i = 1}^{n} (y_i - \bar{y})^2}
R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
其中,
y
i
y_i
yi是真实值,
y
^
i
\hat{y}_i
y^i是预测值,
y
ˉ
\bar{y}
yˉ是真实值的平均值。
四、案例分析
(一)数据描述
本案例使用某地区过去13年的货运量数据以及相关的影响因素数据,包括GDP增长率、人口数量等。将前12年的数据作为训练集,第13年的数据作为测试集。
(二)MATLAB代码实现
% 清空环境变量
clc;
clear all;
close all;
nntwarn off;
% 载入数据
load data;
% 数据划分
p_train = p(1:12, :);
t_train = t(1:12, :);
p_test = p(13, :);
t_test = t(13, :);
% 交叉验证寻找最优平滑因子
desired_spread = [];
mse_max = 10e20;
desired_input = [];
desired_output = [];
result_perfp = [];
indices = crossvalind('Kfold', length(p_train), 4);
h = waitbar(0, '正在寻找最优化参数....');
k = 1;
for i = 1:4
perfp = [];
disp(['以下为第', num2str(i), '次交叉验证结果']);
test = (indices == i);
train = ~test;
p_cv_train = p_train(train, :);
t_cv_train = t_train(train, :);
p_cv_test = p_train(test, :);
t_cv_test = t_train(test, :);
p_cv_train = p_cv_train';
t_cv_train = t_cv_train';
p_cv_test = p_cv_test';
t_cv_test = t_cv_test';
[p_cv_train, minp, maxp, t_cv_train, mint, maxt] = premnmx(p_cv_train, t_cv_train);
p_cv_test = tramnmx(p_cv_test, minp, maxp);
for spread = 0.1:0.1:2
net = newgrnn(p_cv_train, t_cv_train, spread);
waitbar(k / 80, h);
disp(['当前spread值为', num2str(spread)]);
test_Out = sim(net, p_cv_test);
test_Out = postmnmx(test_Out, mint, maxt);
error = t_cv_test - test_Out;
disp(['当前网络的mse为', num2str(mse(error))]);
perfp = [perfp mse(error)];
if mse(error) < mse_max
mse_max = mse(error);
desired_spread = spread;
desired_input = p_cv_train;
desired_output = t_cv_train;
end
k = k + 1;
end
result_perfp(i, :) = perfp;
end
close(h);
disp(['最佳spread值为', num2str(desired_spread)]);
disp(['此时最佳输入值为']);
desired_input;
disp(['此时最佳输出值为']);
desired_output;
% 采用最佳方法建立GRNN网络
net = newgrnn(desired_input, desired_output, desired_spread);
p_test = p_test';
p_test = tramnmx(p_test, minp, maxp);
grnn_prediction_result = sim(net, p_test);
grnn_prediction_result = postmnmx(grnn_prediction_result, mint, maxt);
grnn_error = t_test - grnn_prediction_result';
disp(['GRNN神经网络三项流量预测的误差为', num2str(abs(grnn_error))]);
save best desired_input desired_output p_test t_test grnn_error mint maxt;
(三)结果分析
通过交叉验证,找到了最佳的平滑因子desired_spread
。使用该平滑因子构建的GRNN网络对测试集进行预测,得到了预测结果grnn_prediction_result
。计算预测误差grnn_error
,可以发现误差较小,说明GRNN网络在该货运量预测任务中具有较好的预测性能。同时,通过对比不同平滑因子下的均方误差(MSE),可以直观地看到平滑因子对网络性能的影响。
五、结论与展望
本文详细介绍了GRNN的原理和在货运量预测中的实现步骤,并通过具体案例验证了其有效性。GRNN具有结构简单、训练速度快、对非线性数据拟合能力强等优点,能够为货运量预测提供较为准确的结果。然而,GRNN的性能在很大程度上依赖于平滑因子的选择,因此在实际应用中需要通过交叉验证等方法仔细调整该参数。未来的研究可以进一步探索GRNN与其他模型的结合,以提高预测的准确性和稳定性,同时可以考虑引入更多的影响因素,以更好地反映货运量的变化规律。
六、参考文献
[1] Specht D F. A general regression neural network[J]. IEEE Transactions on Neural Networks, 1991, 2(6): 568-576.
[2] Haykin S. Neural Networks and Learning Machines[M]. Pearson Prentice Hall, 2009.
[3] 史忠植. 神经网络[M]. 机械工业出版社, 2016.