在下面的简短示例代码中,它是较大代码的一部分,我试图找到均方误差,这是一个性能指标,它将通过检查MSE来决定评估函数的好坏程度。降低MSE的值,评估输出越接近真实结果。我用10个不同的数据集重复实验10次,并记录所有数据集中的最小误差。整个过程运行100次。数据是10×3大小的矩阵,即每个包含3个元素的10个数据样本。
我对计算均方误差,平均均方误差和最小误差的方式有疑问。最后,我有兴趣绘制一个图表,显示错误的减少曲线,其中X轴=函数评估数和Y轴= MinimumErr
,以便显示误差函数在程序的100次试验中减少。请帮忙
for trials = 1:100
for expt = 1:10
DataSet = Data(expt,:);
for evaluation = 1:50
%Evaluate a function
[B1 B2 B3] = F(DataSet)
%Find error between the desired outputs(A1,A2,A3) of the function and the obtained output (B1,B2,B3). The function evaluation returns these 3 values.
err(evaluation,:) = (A1-B1)^2+ (A2-B2)^2 + (A3-B3)^2;
end
MeanSqErr = sum(err)/(3*evaluation);
end
MinimumErr(expt) = min(err);
end
AverageMSE= sum(MeanSqErr)/(trials)
答案 0 :(得分:1)
在编写单行代码之前,需要了解我们想要的内容。
Mean Squared Error (MSE)是差异的度量,定义为:
其中 Yhat 是估计输出, Y 是参考输出。两个信号/矢量具有相同的点数,即 n 。
然后,您希望平均MSE超过 m 实验,因此您需要应用mean运算符。
例如,您有一个参考测量Y = [0 1 3 6 10]
。在第一个实验中,您测量Y1 = [1 2 4 5 9]
,在第二个实验中,您测量Y2 = [0 1 2 3 8]
。第一次和第二次实验的MSE分别为1和2.8。因此,所有实验的平均MSE为1.9。
Y = [0 1 3 6 10];
Y1 = [1 2 4 5 9];
Y2 = [0 1 2 3 8];
MSE1 = ((Y-Y1)*(Y-Y1).')/numel(Y);
MSE2 = ((Y-Y2)*(Y-Y2).')/numel(Y);
MSEavg = (MSE1+MSE2)/2;
除了MinimumErr
变量应该在循环for expt = 1:10
内部之外,您的代码似乎正确但很混乱。我会稍微重新组织你的代码:
% Parameters
Ntrials = 100;
Nexpt = 10;
Neval = 50;
% Calculate
A = [A1 A2 A3];
MSE = zeros(Ntrials,Nexpt,Neval);
for trials = 1:Ntrials
for expt = 1:Nexpt
for eval = 1:Neval
% Evaluate a function
[B1,B2,B3] = F(Data(expt,:));
B = [B1 B2 B3];
% Find MSE
MSE(trials,expt,eval) = ((A-B)*(A-B).')/numel(A);
end
end
end
% Statistics
MeanSqErr = mean(MSE,3);
MinimumErr = min(MeanSqErr,[],2);
AverageMSE = mean(MeanSqErr,2);
% Plot
figure; plot(1:Ntrials,AverageMSE); xlabel('#trials'); ylabel('MSE');