作为课程的一部分,我一直在将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分钟的时间来遍历所有这些循环,并且等待很长时间才能得到错误率的结果。还没有其他有效的方法来计算它们吗?

最佳答案

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

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

关于machine-learning - 如何有效地在MATLAB中的神经网络应用中计算训练/测试集的MAPE?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9104171/

10-12 19:29