openlang

weighted rms в Matlab считается неправильно, только когда веса не равны 1

Fortran и таблица дают 0.0300. Matlab даёт число больше, и оно меняется с весами. Со всеми единицами всё нормально. cfg.weights выглядит правильно. Почему так?

% config.m
cfg.weights = [1 1 2 2 4 4];

% run_calibration.m
data = load_readings(cfg.data_file);
pred = model_predict(data.t, cfg);
score = weighted_rms(data.v, pred, cfg.weights);

% weighted_rms.m
function s = weighted_rms(obs, pred, w)
res = (obs - pred) .* w;
wss = sum(res.^2);
% mean() in case we pass several channels later
s = sqrt(mean(wss) / sum(w));
end

obs и pred проверил по отдельности, оба совпадают с референсом. Ни ошибки, ни предупреждения. В Fortran это один цикл.

Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Вес применяется дважды. Посмотрите на эту строку:

    res = (obs - pred) .* w;

    Потом вы возводите res в квадрат, так что в числителе получается w^2, а в знаменателе только sum(w). Когда все веса равны единице, разницы нет, поэтому всё выглядит нормально. Ваш цикл на Fortran наверняка делает w(i)*r(i)**2.

    Исправление: сначала возвести в квадрат, потом взвесить.

    res = obs - pred;
    s = sqrt(sum(w .* res.^2) / sum(w));

    Проверьте ещё размерности. Если obs — столбец, а w — строка, то .* и - расширяются до матрицы, и никакой ошибки не будет. Приведите все три к одной ориентации (w(:), obs(:), pred(:)).

    mean(wss) от скаляра ничего не делает. Для нескольких каналов сначала сделайте sum(..., 1) по каждому столбцу, а потом решайте, как усреднять.

    Документация по sum с аргументом размерности: https://www.mathworks.com/help/matlab/ref/sum.html

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Перенёс короткий скрипт с MATLAB на R, и один результат получился матрицей

    Всем привет. Портирую на R короткий MATLAB-скрипт от коллеги (Priyesh, 2023), потому что весь остальной наш пайплайн на R, а…

    Ответы 2Последняя активность rmatlab
  2. Морозилка без показаний получает статус "ok", что я упускаю

    Мой ночной скрипт аудита (Rscript, base R) помечает морозилки, у которых пиковая температура выше лимита. Вчера у U-03 отключ…

    Ответы 2Последняя активность r
  3. Цикл, который выделял память на каждый столбец

    Срезы в Julia копируют. Это известно, но внутри цикла вылетело из головы. Возьмём функцию, которая идёт по столбцам матрицы и…

    Ответы 2Последняя активность julia