【问题标题】:Issue in calculating error for several runs of an experiment计算多次实验的误差时出现问题
【发布时间】:2014-03-20 01:05:03
【问题描述】:

在以下作为较大代码的一部分的简短示例代码中,我试图找到均方误差,这是一个性能指标,将通过检查 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)

【问题讨论】:

  • 对 1 到 50 的评价是什么?
  • 当你说函数评估次数时,你是指50还是100x10x50=5000

标签: matlab plot mean-square-error


【解决方案1】:

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

Mean Squared Error (MSE) 是对差异的度量,定义为:

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

然后,您需要 m 个实验的平均 MSE,因此您需要应用 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; 

您的代码看起来正确但混乱,除了应该在循环for expt = 1:10 内的MinimumErr 变量。我会将您的代码重新组织为:

% 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');

【讨论】:

  • 感谢您的代码。一般来说,得出平均值的公式 = ((A-B)*(A-B).')/(numel(A)*expt*trials) ??我的意思是我们将 MSE 除以程序运行的次数、数据样本的数量以及每个样本中的元素数量?一个常用的表达式将非常有帮助,以便将该表达式写在纸上。跨度>
  • 接下来,假设我们从函数 F 返回的值中找到最小值。考虑到所有的 expt,我想看到一条逐渐向零减小的曲线。当 eval=1 时,假设最小值为 B2。当 eval = 2 时,B1 是最小值,依此类推。因此,除了 AverageMSE 的图之外,我还想知道是否有可能在 50 次函数评估的 100 次试验中获得函数 F 的最小值的图。该图与用于显示训练完成后成本函数如何降低的学习曲线非常相似。可以请您出示一下吗?
  • 你计算AverageMSE的方式,我想要一个AverageMSE的值,实际上是MinimumErr的图表。我认为我的问题之前并不清楚。请问你能修改你的答案吗?
  • 我已经包含了一些可以帮助您理解 MSE 和均值的方程式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2023-01-17
  • 2021-07-05
相关资源
最近更新 更多