openlang

Matlab에서 weighted rms가 틀려요, weights가 1이 아닐 때만

Fortran이랑 스프레드시트는 0.0300이 나와요. Matlab은 더 큰 값이 나오고 weights에 따라 바뀌어요. 전부 1이면 괜찮아요. 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는 따로 확인했는데 둘 다 reference랑 맞아요. 에러도 없고 경고도 없어요. Fortran에서는 loop 하나로 끝나요.

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    가중치가 두 번 적용돼요. 이 줄을 보세요:

    res = (obs - pred) .* w;

    그다음 res를 제곱하니까 분자에는 w^2이 들어가는데, 분모는 sum(w)뿐이에요. 전부 1이면 차이가 없어서 괜찮아 보이는 거예요. Fortran 루프는 분명 w(i)*r(i)**2일 거예요.

    해결: 먼저 제곱하고 나서 가중치를 곱하세요.

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

    shape도 확인하세요. obs가 열 벡터이고 w가 행 벡터면 .*와 -가 행렬로 브로드캐스트되는데, 에러는 안 나와요. 세 개 모두 같은 방향으로 맞추세요 (w(:), obs(:), pred(:)).

    스칼라에 mean(wss)를 해도 아무 일도 안 일어나요. 채널이 여러 개면 먼저 열마다 sum(..., 1)을 한 다음에 어떻게 평균낼지 정하세요.

    차원 인자를 쓰는 sum 문서: https://www.mathworks.com/help/matlab/ref/sum.html

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. MATLAB 스크립트 짧은 걸 R로 옮겼는데 결과 하나가 행렬로 나와요

    안녕하세요. 동료(Priyesh, 2023)가 짠 짧은 MATLAB 스크립트를 R로 옮기고 있어요. 저희 파이프라인의 나머지가 전부 R이고, 저는 MATLAB을 거의 만져 본 적이 없거든요. R 버전은 에러도 경고도 없이 끝…

    답글 2최근 활동 rmatlab
  2. 데이터가 0건인 냉동고가 status "ok"로 나와요, 뭘 놓친 걸까요

    매일 밤 도는 감사 스크립트(Rscript, base R)가 최고 온도가 기준을 넘는 냉동고를 표시해 줘요. 어젯밤 U-03의 로거가 뽑혀 있어서, export에서 그 장비의 temp_c가 전부 문자열 ERR이에요. 그런데도…

    답글 2최근 활동 r
  3. 열마다 새로 할당하던 루프

    Julia에서 슬라이싱은 복사를 해요. 알고 있었는데 루프 안에서는 깜빡했어요. 행렬의 열을 돌면서 j마다 s += sum(A[:, j])를 하는 함수를 예로 들어 볼게요. A[:, j]가 매번 새 벡터를 만들고, 더하고,…

    답글 2최근 활동 julia