【问题标题】:How to do a 10-fold cross validation without using built-in function in MATLAB?如何在不使用 MATLAB 内置函数的情况下进行 10 倍交叉验证?
【发布时间】:2017-01-28 04:56:30
【问题描述】:

我尝试在不使用内置函数来训练和识别 0-9 的数字的情况下进行 10 折交叉验证我有 500 张图片的样本(每个数字 50 张要训练和测试。) 我尝试实现答案MATLAB: 10 fold cross Validation without using existing functions 和其他网站,但并没有太大帮助。主要是因为我是 MATLAB 新手,所以我不太了解应该如何调整它。 这是我目前的代码。

    c=zeros(10,size(x,2),size(x,3));
    K=10;
    k=10;
    test= 1:50/K;
    for fold =1:K
        if(test(1)~=1)
            train = x(1:test(1)-1,:,:);
            if (test(5) ~=50)
                train=[train ; x(test(end):50,:,:)];
            end
        else
            train = x(test(1):50,:,:);

        end
        test = test+ones(1,50/K)*50/K;
        end
    for i =0:9

            test=test+50/K*ones(1,5);
            c(i+1,:,:)=cal_likelihood(x(1+i*50:50+i*50,:,:),50/k*(k-1));
    end

变量解释

  • x 是 500x28x28 双倍,它保留所有 500 位图片。
  • test 是一个测试集。
  • train 是一个训练集。

为了进行 10 折交叉验证,我需要更改训练集,例如

  1. 第 1 折:测试 1:5,火车 6:45
  2. 第二折:6:10 考试,1:5 11:50 火车等

问题是我不知道如何将训练集从一组转移到另一组,例如从 6:45 到 1:5 和 11:50。或者我可以写一个比这更好的循环吗?

PSS。如果回答这个问题的人不介意 500x28x28 double 究竟是什么意思。

【问题讨论】:

  • 500x28x28 double 表示它是一个 multi-dimensional array (实际上是 3-D 数组),其中第一维 500 表示示例数(在您的情况下为数字图片),28x28 表示长度和分别为每张图片的宽度(每张图片用一个28x28的矩阵表示)。
  • @uyaseen 非常感谢。

标签: matlab validation machine-learning


【解决方案1】:

有几种方法可以编写此代码,其中一些比其他更容易理解。 Matlab 写起来非常好,因为当 1:3 等表达式计算为 [1,2,3] 时,表达式 1:0 计算为空集。因此,生成集合非常简单,无需使用 if 语句。

我会以这样的方式开始循环:

samples_per_digit=50;
block_sze=samples_per_digit/K;
for fold =1:K
    test_ind = 1+(fold-1)*block_sze:fold*block_sze;
    train_ind = [1:(fold-1)*block_sze, (fold*block_sze+1):samples_per_digit];

    for i=0:9
        train=x(train_ind+i*samples_per_digit,:,:);
        test=x(test_ind+i*samples_per_digit,:,:);
        % Perform training and validation in here for this fold of the digit i

您可以验证 test_indtrain_ind 是否对应于您需要的训练和验证块的子集。只有在最内层循环中,这些转换为对应于数字图像的矩阵,使用i 的值来计算偏移量。当然,如果你愿意,你可以交换循环的顺序,计算一个数字的所有折叠。这完全取决于您希望如何存储结果。

【讨论】:

  • 试一试,效果很好。它比我使用的代码要好得多。顺便说一句,我的代码是我的教练在课堂上给我的,但我认为我更喜欢这个代码,它非常简短且易于理解。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2019-10-13
  • 2015-06-12
  • 2013-11-22
相关资源
最近更新 更多