因此,在这里,我得到的数据(25000个观测值和N个特征)采用大小为25000xN的矩阵A和大小为25000x1的响应矢量B的形式。我想对此数据集执行10折交叉验证,如下所示
K_fold=10;
matrix=zeros(K_fold,2500);
for i=1:K_fold
matrix(i,:)=(i:10:25000); % here get the indices in matrix
end
[m,n]=size(matrix);
for j=1:K_fold
matrix_1=zeros(m,n);
matrix_1(j,:)= matrix(j,:);
i_val=matrix_1(j,:);
i_tr_1=(matrix-matrix_1);
i_tr=i_tr_1(:);
i_tr((i_tr==0))=[];
A_tr=A(i_tr,:);
B_tr=B(i_tr,:);
A_val=A(i_val,:);
B_val=B(i_val,:);
end
现在可以看到带有R代码的相同内容
K = 10
folds = vector(mode="list",length=K)
for (k in 1:K) {
folds[[k]] = seq(k,n,by=K)
}
for (k in 1:K) {
i.tr = unlist(folds[-k])
i.val = folds[[k]]
x.tr = x[i.tr]
y.tr = y[i.tr]
x.val = x[i.val]
y.val = y[i.val]
}
当您比较这两个代码时,您会在R代码中看到unlist(folds[-k])
,很容易从列表中删除第k个索引,并且不列出需要训练的索引。我在matlab(如上所示)代码中所做的相同任务通过使用额外的矩阵matrix_1
,然后从matrix_1
中减去matrix
,并使用诸如i_tr((i_tr==0))=[]
这样的逻辑运算来获取训练数据的索引。那么还有什么更好的方法呢?像在Matlab中使用unlist(folds[-k])
在R中一样吗?