如何使用matlab crossval对其中一个分区进行计算(在k-fold交叉验证中)

时间:2017-10-01 08:39:23

标签: matlab validation classification svm computation

我正在尝试使用matlab cross validation method应用交叉验证的LDA。为此,我将crossval()放在一个循环中,在每个循环中,我提取相应的训练和测试标签和特征矩阵(trFV, tsFV)。这就像Matlab cvpartition class中提供的示例:

cvp = cvpartition(labelCell,'KFold',kFoldCV)
for i = 1:cvp.NumTestSets
    trFV = f(cvp.training(i), :);
    tsFV = f(cvp.test(i), :);

    % calculate LDA projection matrix:
    [~, W] = LDA(trFV, featureMat(cvp.training(i), end));
    % apply W to both train and test:
    trFVW = trFV * W(:, 1:numel(classes)-1);
    tsFVW = tsFV * W(:, 1:numel(classes)-1);
    fW = [trFVW; tsFVW];
    labels = [labelCell(cvp.training(i)); labelCell(cvp.test(i))];


    Mdl = fitcecoc(fW, labels, 'Coding', 'onevsall',...
        'Learners', learnerTemplate,...
        'ClassNames', classes);
    CVMdl = crossval(Mdl, 'CVPartition', cvp);

    % Other stuff
end

这种实现非常低效,因为我只需要其中一个折叠(不是整个折叠)的结果。我在循环中处理每个折叠一次,而crossval处理每个循环中的整个循环。因此,在当前实现中,而不是cvp.NumTestSets次,它执行交叉验证cvp.NumTestSets^2次。我需要这样的东西:

CVMdl = crossval(Mdl, 'CVPartition', cvp, 'compute just for partition i and not all partitions');

更新

上面的代码在交叉验证方面存在一些问题。但是,如果可以使用Matlab内置的LDA(线性判别分析)来减小维数,我仍然感兴趣。

0 个答案:

没有答案