如何有效地计算MATLAB中神经网络应用中训练/测试集的MAPE?

时间:2012-02-01 22:15:24

标签: machine-learning neural-network matlab

我一直在使用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分钟,并且等待获得错误率的结果需要相当长的时间。有没有其他有效的方法来计算它们?

1 个答案:

答案 0 :(得分:3)

您可以随时执行每次迭代更新的滚动平均值,如下所示:

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值初始化为零:)