Matlab(交叉验证,索引结果重现,打乱数据)

总会有奇奇怪怪的想法和需求。。。
想要产生的交叉验证的索引可以重现(虽然可以采取保存的方式)
目录
一、随机选取
1、产生索引
2、调用数据
打乱数据
二、顺序选择,循环选取
1、数据初始化,样本个数、训练样本个数等
2、 产生训练数据的索引
3、存/调用数据
一、随机选取 1、产生索引
生成的是类似 [1,3,5,2...] ,随机产生1-fold的整数值组成索引向量indices,提供两种方式
(1)调用函数
【Matlab(交叉验证,索引结果重现,打乱数据)】结果不能重现,也可能我没有找到结果可以重现的调用方法 -_-

% 交叉验证 调用函数 [m,n] = size(data); fold = 5; indices = crossvalind('Kfold',data(1:m,n),fold); % 索引 随机产生1-fold 的元素值

(2) 产生概率相同的随机数,利用种子控制结果的重现
P.s.:如果100个数据分成5折,每一折的个数并不相等,但是相差不多
% 产生交叉验证的索引 结果可以重现 fold = 5; % 5折交叉验证 alphabet = 1:fold; prob = ones(1,fold)/fold; rng(2); % 设置种子,每次产生的数据一样 indices = randsrc(m,1,[alphabet; prob]); % 索引 以一定概率产生的随机数 m-样本数

2、调用数据
% 划分数据集 X = cell(fold,1); Y = cell(fold,1); tstX = cell(fold,1); tstY = cell(fold,1); for j = 1:fold test = (indices==j); train = ~test; X{j} = dataX(train,:); Y{j} = dataY(train,:); tstX{j} = dataX(test,:); tstY{j} = dataY(test,:); end

还想:
打乱数据
% 打乱数据rng(2); randindex = randperm(m); % 返回一行包含从1到n的整数,不重复,随机,乱序也可以设置种子。。 data = https://www.it610.com/article/data(randindex,:);

2020年7月14日,补充,今天突然看到一种新的交叉验证的方式。
二、顺序选择,循环选取 例:采用五折交叉验证,总的样本数目是10,设TN=6,表示训练样本的数目,具体地,将所有的样本编号1,2...10,则选择样本
(1)1-6(训练样本的序号);(2)7-10,1-2;(3)3-8;(4)9-10,1-4;(5)5-10,作为每一次的训练样本。
P.s.:这种方式产生的数据,每一次的训练样本的个数是相同的,测试样本也是
分步
1、数据初始化,样本个数、训练样本个数等
% 数据初始化 TN = 6; % 训练样本的个数 [n,~] = size(data); % 样本的个数,一行表示一个样本 fold = 5; % 五折train = cell(fold,1); % 一个元胞表示一次的训练数据 test = cell(fold,1);

2、 产生训练数据的索引
产生足够的(TN*fold)循环索引,然后直接取相应个数(TN)的索引去取值即可
循环索引:1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4……
indices = 1:n; % 与样本数等长度的索引,方便与训练索引做差集,得到测试集的索引 idx = mod(1:TN*fold,n); % 产生训练索引,取余的方式 idx(idx==0) = n; % 刚好等于样本数n时,余数是0,将其替换成n

3、存/调用数据
for i = 1:fold idxTr = idx((i-1)*TN+1:i*TN); % 训练集的索引 train{i} = data(idxTr,:); test{i} = data(setdiff(indices,idxTr),:); % 其余作为测试集 end

合并一下程序
% 数据初始化 TN = 5; % 训练样本的个数 [n,~] = size(data); % 样本的个数,一行表示一个样本 fold = 5; % 五折train = cell(fold,1); % 一个元胞表示一次的训练数据 test = cell(fold,1); % 产生索引 indices = 1:n; % 与样本数等长度的索引,方便与训练索引做差集,得到测试集的索引 idx = mod(1:TN*fold,n); % 产生训练索引,取余的方式 idx(idx==0) = n; % 刚好等于样本数n时,余数是0,将其替换成n% 存数据 for i = 1:fold idxTr = idx((i-1)*TN+1:i*TN); % 训练集的索引 train{i} = data(idxTr,:); test{i} = data(setdiff(indices,idxTr),:); % 其余作为测试集 end


    推荐阅读