模型训练经常要采用交叉检验或者蒙特卡罗的训练方法,matlab常用的是crossvalind。其实已经很简单,这里想再偷懒一点,将crossvalind包装一下,将训练数据和测试数据直接放到cell结构,这样,只要告诉下面的函数,训练数据和分组数目,就直接返回分组后的结果
function [XTrainData,YTrainData,XTestData,YTestData,indices] = easyCrossvalidation(X,y,fold)
% 调用matlab的crossvalind,将数据集做交叉检验划分
% X --每行为一个样本,y---列向量,fold----数据等分为几组
%XTrainData cell 类型 XTrainData{i}表示第i个分组的训练数据X,下面的类似
%YTrainData y训练数据
%XTestData X测试数据
%YTestData y测试数据
%indices指示了数据划分到那一组里面
[m,n] = size(X);
indices = crossvalind('Kfold', m, fold);
for i= 1:1:fold
test = (indices == i);
train = ~test;
XTrainData{i} = X(train, :);
XTestData{i} = X(test, :);
YTrainData{i} = y(train, :);
YTestData{i} = y(test, :);
end
end
例子,分组数目为10
X = rand(80,80);
y = rand(80,1);
[XTrainData,YTrainData,XTestData,YTestData,indices] = easyCrossvalidation(X,y,10)
%取第5个分组的数据
%XTrainData{5},YTrainData{5},XTestData{5},YTestData{5}
在内存上会引起一点浪费,因为本质上,crossvalind是通过样本序号,得到每一个分组的样本组成,所以不会占用多少空间。而上面这个函数已经将数据按照分组给划分好,因此占用的空间会比较多,不过操作上,感觉还是方便了一些,直观一些。