以相同频率采样数据

时间:2016-01-05 13:49:19

标签: matlab sample

我有一个标签向量labels,其中包含10个类的60000个对象的标签信息(每个类有6000个样本)。

我需要随机抽样1000个样本,但也保证每个班级100个样本。

1 个答案:

答案 0 :(得分:1)

我假设您的数据是随机排序的?所以这样的事情(为了简单起见,我将只使用3个类,123

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)或类似的内容