2011-04-02 42 views
1

我有一个大型数据集,我需要将其随机分为5个几乎相等大小的集合进行交叉验证。我很高兴地使用_crossvalind_以前分成组,但是这次我需要一次将大块数据分成这些组。Matlab:将大块数据随机分成相等大小的集合

比方说,我的数据是这样的:

data = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]; 

然后我想他们随机分成5组在2,如块这样

g1 = [3 4], [11 12] 
g2 = [9 10] 
g3 = [1 2], [15 16] 
g4 = [7 8], [17 18] 
g5 = [5 6], [13 14] 

我想我可以用一些for循环做到这一点,但我猜必须有一个更具成本效益的方式做到这一点在MATLAB :-)

任何建议?

回答

3

我解释你的需要是集随机排序,但在每个组中,元素的顺序是从父组保持不变。您可以使用randperm来随机排列集合的数量,并对元素使用线性索引。

dataElements=numel(data);%# get number of elements 
totalGroups=5; 
groupSize=dataElements/totalGroups;%# I'm assuming here that it's neatly divisible as in your example 
randOrder=randperm(totalGroups);%# randomly order of numbers from 1 till totalGroups 
g=reshape(data,groupSize,totalGroups)';    %'# SO formatting 
g=g(randOrder,:); 

g的不同行给你不同的分组。

+1

@R。 M .:你的最后一行有点复杂。为什么不把它替换为:'g = reshape(data,groupSize,totalGroups)'; g = g(randOrder,:);' – Jonas 2011-04-02 19:51:04

+0

@Jonas:谢谢,你是对的;那很复杂!我已经取代了这条线。 – abcd 2011-04-02 20:03:22

+0

@ R。 M .:现在看起来就像我会回答的。 +1 :) – Jonas 2011-04-02 20:12:15

0

您可以将数组(randperm)进行混洗,然后将其分成相应的等分部分。

data = [10 20 30 40 50 60 70 80 90 100 110 120 130 140 150]; 
permuted = data(randperm(length(data))); 
% padding may be required if the length of data is not divisible by the size of chunks 
k = 5; 
g = reshape(permuted, k, length(data)/k);