Как эффективно рассчитать MAPE для Учебного / Тестового набора в приложении Neural Network в MATLAB? - PullRequest
1 голос
/ 02 февраля 2012

Я использовал MATLAB для своего набора данных временного ряда (для набора данных электричества) как часть моего курса.Он состоит из 40000+ образцов.После формирования нейронной сети я хотел проверить ее точность.Мне было любопытно больше об ошибках 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 )

Проблема с вышеприведенным кодированием заключается в том, что для большого набора данных (40 тыс. Выборок) для итерации всех этих циклов требуется почти 15 минути довольно долго ждать получения результата по частоте ошибок;Есть ли другой эффективный способ их расчета?

1 Ответ

3 голосов
/ 02 февраля 2012

Вы всегда можете сделать скользящее среднее, которое обновляется на каждой итерации, следующим образом:

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, если только они не нужны в другом месте ...

Редактировать: Обязательно инициализируйте значения mape и mse до нуля додля входа в цикл for:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...