我有一个数据集,为简单起见,我们说它有1000个样本(每个都是一个向量) .
我想分割我的数据用于交叉验证,用于训练和测试,例如,如果我想要4倍交叉验证,我应该得到:
fold1 :train = 1:250; test = 251:1000
fold2 :train = 251:500,test = [1:250; 501:1000]
fold3 :train = 501:750,test = [1:500; 751:1000]
fold4 :train = 751:1000,test = 1:750
我知道CVPARTITION,但AFAIK - 它随机分割数据 - 这不是我需要的 .
我想我可以为它编写代码,但我认为可能有一个我可以使用的功能 .
(1)数据已经洗牌,我需要能够轻松地重现实验 .
3 回答
这是一个通常的功能:
它相当健壮,不需要
k
作为您的样本数量的因子,在2D矩阵上工作并输出实际集而不是索引 .假设你有
k*n
smaples,你想用火箭中的n
样本和测试中的(k-1)*n
分割k
折叠(在你的问题k = 4
,n = 250
中) .然后
foldId
为您提供每个样本所属的训练折叠的索引 .对于折叠
f
,您可以使用获得训练和测试样本的索引(您可以使用逻辑索引而不是
find
并加快速度) .要将数据集划分为长度
n
的k
折叠,您可以使用:其中
f
是一个结构数组,其字段train
和test
包含相应折叠的索引 . 例如n=5
和k=3
以及折叠2
:您甚至可以直接提取数据 . 假设您的数据是
n*k
行的2D矩阵说你的数据是
折叠
2
,E
包含: