计算两个矩阵之间的均方根误差,其中之一包含NaN值

时间:2018-10-28 13:33:14

标签: matlab interpolation mean

这是一个较大项目的一部分,所以我将尝试仅保留相关部分(变量和我在计算中的尝试)

我想计算Zi_cubic和Z_actual之间的均方根误差

RMSE formula

给出/已经建立的变量

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. 使用nansum汇总4中的所有元素
  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 :(得分:1)

您的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插值,因为那是您可能会偏离期望值的另一个地方...