2011-04-02 132 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);