Как эффективно рассчитать MAPE для обучающего / тестового набора в применении нейронной сети в 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 минут, и довольно долгое ожидание получения результата для частоты ошибок; Нет другого эффективного способа их вычислить?


person Neo182    schedule 01.02.2012    source источник
comment
Что говорит профильный анализ? Где критическая часть кода?   -  person Andrey Rubshtein    schedule 02.02.2012


Ответы (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, если они не понадобятся где-то еще ...

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

person hatboyzero    schedule 01.02.2012
comment
Спасибо за быстрый ответ, но я хочу определить количество ошибок после того, как сеть будет полностью обучена; и не намереваются использовать частоту ошибок для критериев остановки. - person Neo182; 02.02.2012
comment
В этом случае, я думаю, вам просто нужно дождаться завершения цикла. По крайней мере, таким образом вы устраняете необходимость выделения и заполнения векторов, тем самым уменьшая ваши требования к памяти. - person hatboyzero; 02.02.2012
comment
Из любопытства, есть ли у вас доступ к Parallel Processing Toolbox для Matlab. Это то, что мы в настоящее время используем для запуска больших наборов данных через наши нейронные сети в офисе - возможно, стоит проверить, есть ли у вас / можете ли вы это себе позволить ... - person hatboyzero; 04.02.2012
comment
Просто продолжаю с вами по этому поводу - это достаточно ответило на ваш вопрос? - person hatboyzero; 06.03.2012