总会有奇奇怪怪的想法和需求。。。
想要产生的交叉验证的索引可以重现(虽然可以采取保存的方式)
目录
一、随机选取
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
推荐阅读
- 最优化问题|改进交叉算子的自适应人工蜂群黏菌算法
- matlab|嵌入均衡池的黏菌优化算法
- 最优化问题|加入领导者的黏菌优化算法
- MATLAB图形界面|基于Matlab的汽车出入库计时计费系统
- Matlab旅程|MATLAB的结构化程序设计
- matlab 内存管理 清理内存
- matlab中使用colormap没有效果
- Matlab|圆柱绕流
- MATLAB|Splart-Allmaras湍流模型及MATLAB编程~
- regionprops统计被标记的区域的面积分布,显示区域总数。