这是一个较大项目的一部分,所以我将尝试仅保留相关部分(变量和我在计算中的尝试)
我想计算Zi_cubic和Z_actual之间的均方根误差
给出/已经建立的变量
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;
我尝试计算
我的方法是
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做什么。
任何帮助将不胜感激。预先感谢。
答案 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
插值,因为那是您可能会偏离期望值的另一个地方...