【问题标题】:How to calculate MAPE for Training/Test set in application of Neural Network in MATLAB efficiently?如何在 MATLAB 神经网络应用中有效地计算训练/测试集的 MAPE?
【发布时间】:2012-02-24 15:01:20
【问题描述】:

作为我课程的一部分,我一直在将 MATLAB 用于我的时间序列数据集(用于电力数据集)。它由 40,000 多个样本组成。神经网络形成后,我想测试它的准确性。我对 MAPE(平均绝对百分比误差)和 RMS(均方根)误差更感兴趣。为了计算它们,我使用了以下代码行。

mape_res = zeros(N_TRAIN);
mse_res = zeros(N_TRAIN);
for i_train = 1:N_TRAIN
  Inp = inputs_consumption(i_train );
  Actual_Output = targets_consumption( i_train + 1 );
  Observed_Output = sim( ann, Inp );

  mape_res(i_train) = abs(Observed_Output - Actual_Output)/Actual_Output;
  mse_res(i_train) = Observed_Output - Actual_Output;

end

mape = sum(mape_res)/N_TRAIN;
mse = sum(power(mse_res,2))/N_TRAIN;
sprintf( 'The MSE on training is %g', mse )
sprintf( 'The MAPE on training is %g', mape )

上述编码的问题在于,对于大型数据集(40K 样本),遍历所有这些循环需要将近 15 分钟,并且等待获得错误率结果的时间相当长;没有其他有效的计算方法吗?

【问题讨论】:

  • 分析器分析说什么?代码的关键部分在哪里?

标签: machine-learning neural-network matlab


【解决方案1】:

您始终可以进行滚动平均,每次迭代都会更新,如下所示:

mape_res = abs(Observed_Output - Actual_Output) / Actual_Output;
mse_res  = Observed_Output - Actual_Output;

alpha = 1 / i_train;
mape = mape * (1 - alpha) + mape_res * alpha;
mse  = mes * (1 - alpha) + power(mse_res,2) * alpha;

然后您可以显示每次迭代的结果值,或者在达到所需错误率时使用它们作为停止标准,或者两者兼而有之。这还有一个额外的好处,即不需要初始化和填充 mape_res 和 mse_res 向量,除非它们碰巧在其他地方需要......

编辑:确保在进入 for 循环之前将 mape 和 mse 值初始化为零 :)

【讨论】:

  • 感谢您的快速回复,但我想在网络完全训练后确定错误率;并且不打算使用错误率作为停止标准。
  • 在这种情况下,我认为您只需要等到循环完成即可。至少通过这种方式,您无需分配和填充向量,从而减少内存需求。
  • 出于好奇,您是否可以访问 Matlab 的并行处理工具箱。这就是我们目前在办公室通过我们的神经网络运行大型数据集的方法——如果你有/负担得起的话,可能值得一试……
  • 刚刚就此事与您联系 - 这是否足以回答您的问题?
猜你喜欢
  • 2018-09-19
  • 2014-02-24
  • 2018-10-30
  • 2010-11-20
  • 1970-01-01
  • 2015-08-13
  • 2015-04-17
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多