MATLAB: Select the same number of samples from each class.

MATLAB

Say I have a table with 2 columns, one column stores the value the other the class of the value. The classes are imbalanced. I want to randomly select the same number of samples from each class. Is there any easy way to do it in Matlab.

Best Answer

% create some random data for demo
K = 3 ; % number of groups
N = 5000 ;
x = rand(N,1) ;
y = rand(N,1) ;
% apply kmeans to divide points into 3 groups
idx = kmeans([x,y],K) ;
A = [x y idx] ; % the data with three classes
% Get number of data in each class
ng1 = nnz(idx==1) ; % number of points in group 1


ng2 = nnz(idx==2) ; % number of points in group 1
ng3 = nnz(idx==3) ; % number of points in group 1
% select data for each group
N = min([ng1 ng2 ng3]) ;
iwant = cell(K,1) ;
for i = 1:K
G=A(A(:,3)==i,:) ; % group data
idx = randperm(size(G,1),N) ;
iwant{i} = G(idx) ;
end