我有一个标签向量labels
,其中包含10个类的60000个对象的标签信息(每个类有6000个样本)。
我需要随机抽样1000个样本,但也保证每个班级100个样本。
答案 0 :(得分:1)
我假设您的数据是随机排序的?所以这样的事情(为了简单起见,我将只使用3个类,1
,2
和3
:
data = [ones(n,1); ones(n,1)*2; ones(n,1)*3];
data = data(randperm(numel(data)));
现在,您希望m*3
个样本包含每个类的m
个样本(其中m <= n
)。最自然的方法是对每个类的精确m
个样本进行不那么严格,并且只是随机选择m*3
个样本:
idx = randperm(numel(data));
sample = data(numel(data))
请注意,如果您拥有统计工具箱,则可以使用randsample
代替randperm
。
但是如果你必须准确地m
每个样本,那么这样的事情就应该这样做。请注意,我的目标是获取指数而不是值,因为我认为这更像是你之后的所有:
classes = unique(data);
k = numel(classes);
idx = false(m*3,1);
for class = 1:k
%// find the element numbers for each element of that class
idxForClass = find(data == classes(class));
%// Shuffle them randomly
idxForClassShuffled = idxForClass(randperm(numel(idxForClass))); %// or numel(n)
%// Pick the first m from the shuffled list
idx(idxForClassShuffelled(1:m)) = true;
end
现在当你想要数据回来时
data(idx)
或更可能类似于data(idx,:)
,因为您的data
可能不是矢量。但是,在这种情况下,您需要将我的代码中的numel
更改为size(data,1)
或类似的内容