1

在以下作为较大代码的一部分的简短示例代码中,我试图找到均方误差,它是一种性能指标,将通过检查 MSE 来决定函数的评估程度。MSE 的值越低,评估的输出越接近真实结果。我用 10 个不同的数据集重复实验 10 次,并记录所有数据集中的最小误差。整个过程运行 100 次。数据是大小为 10*3 的矩阵,即 10 个数据样本,每个样本包含 3 个元素。

我对计算均方误差、平均均方误差和最小误差的方式有疑问。最后,我有兴趣绘制一个图表,显示误差的下降曲线,其中 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)
4

1 回答 1

1

甚至在编写一行代码之前,就需要了解我们想要什么。

均方误差 (MSE)是对差异的度量,定义为:

在此处输入图像描述

其中Yhat是估计输出,Y是参考输出。两个信号/向量都具有相同数量的点,即n

然后,您需要m个实验的平均 MSE ,因此您需要应用均值算子。

在此处输入图像描述

例如,您有一个参考测量值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');
于 2014-03-20T12:56:32.310 回答