Вычисление среднеквадратичной ошибки между двумя матрицами, одна из которых содержит значения NaN - PullRequest
0 голосов
/ 28 октября 2018

Это часть более крупного проекта, поэтому я постараюсь оставить только соответствующие части (переменные и мои попытки вычислений)

Я хочу вычислить среднеквадратичную ошибку между Zi_cubic и Z_actual

RMSE формула

Заданные / уже установленные переменные

rng('default');

% Set up 2,000 random numbers between -1 & +1 as our x & y values
n=2000;
x = 2*(rand(n,1)-0.5);
y = 2*(rand(n,1)-0.5);
z = x.^5+y.^3;

% Interpolate to a regular grid
d = -1:0.01:1;
[Xi,Yi] = meshgrid(d,d);



Zi_cubic = griddata(x,y,z,Xi,Yi,'cubic');
Z_actual = Xi.^5+Yi.^3;

Моя попытка расчета

Мой подход к

  1. Упорядочить Zi_cubic и Z_actual как векторы-столбцы
  2. Взять разницу
  3. Квадрат каждого элемента в разнице
  4. Суммировать все элементы в 4, используяnansum
  5. Разделите на число конечных элементов в 4
  6. Возьмите квадратный корень
D1 = reshape(Zi_cubic,[numel(Zi_cubic),1]);
D2 = reshape(Z_actual,[numel(Z_actual),1]);
D3 = D1 - D2;
D4 = D3.^2;
D5 = nansum(D4)
d6 = sum(isfinite(D4))
D6 = D5/d6
D7 = sqrt(D6)

Видимо, это неправильно.Я либо неправильно применяю формулу RMSE, либо не понимаю, что я говорю matlab.

Буду признателен за любую помощь.Заранее спасибо.

1 Ответ

0 голосов
/ 29 октября 2018

Ваш RMSE в порядке (в моей книге).Единственная вещь, которая кажется, возможно, отключена - это meshgrid и griddata.Ваши входные данные для griddata являются векторами, и вы запрашиваете матричный вывод.Это нормально, но вы, возможно, недосэмплируете свое пространство ввода.Другими словами, вы даете n выборок в качестве входных данных, но, возможно, от вас ожидается, что n ^ 2 выборок в качестве входных данных?Вот пример кода для меньшего n, чтобы более наглядно продемонстрировать этот эффект:

rng('default');

% Set up 2,000 random numbers between -1 & +1 as our x & y values
n=100; %Reduced because scatter is slow to plot
x = 2*(rand(n,1)-0.5);
y = 2*(rand(n,1)-0.5);
z = x.^5+y.^3;

S = 100;
subplot(1,2,1)
scatter(x,y,S,z)

%More data, more accurate ...
[x2,y2] = meshgrid(x,y);
z2 = x2.^5+y2.^3;

subplot(1,2,2)
scatter(x2(:),y2(:),S,z2(:))

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

Я также подумал, что вы можете столкнуться с некоторыми проблемами с числами с плавающей запятой и вычислением RMSE, но, похоже, это не так.Вот некоторый альтернативный код, который я бы написал RMSE.

d = Zi_cubic(:) - Z_actual(:);
mask = ~isnan(d);
n_valid = sum(mask);

rmse = sqrt(sum(d(mask).^2)/n_valid);

Обратите внимание, что (:) линеаризует матрицу.Также полезно попытаться использовать более подходящие имена переменных, чем D1-D7.

В конце концов, это всего лишь предложения, и ваш код выглядит хорошо.

PS - Я предполагаю, что выпредполагается, что используется cubic интерполяция, поскольку это еще одно место, где вы, возможно, можете отклониться от ожидаемого ...

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