我正在尝试使用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(线性判别分析)来减小维数,我仍然感兴趣。