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

总会有奇奇怪怪的想法和需求。。。

想要产生的交叉验证的索引可以重现(虽然可以采取保存的方式) 

目录

一、随机选取

1、产生索引

2、调用数据 

打乱数据

二、顺序选择,循环选取

1、数据初始化,样本个数、训练样本个数等

2、 产生训练数据的索引

3、存/调用数据 


一、随机选取

1、产生索引

生成的是类似 [1,3,5,2...] ,随机产生1-fold的整数值组成索引向量indices,提供两种方式

(1)调用函数

结果不能重现,也可能我没有找到结果可以重现的调用方法 -_-

% 交叉验证 调用函数
[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(n); % 返回一行包含从1到n的整数,不重复,随机,乱序   也可以设置种子。。
data = 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

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值