Итак, у меня есть данные (25000 наблюдений и N признаков) в виде матрицы A размером 25000xN и вектора ответа B размером 25000x1.Я хочу выполнить 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))=[]
, чтобы получить индексы для обучающих данных. Так есть ли лучший способ, чем этот, как в R с использованием unlist(folds[-k])
в Matlab?