2016-01-05 174 views
0

我有一个标签向量labels,其中包含10个类的60000个对象(每个类有6000个样本)的标签信息。以相同频率采样数据

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

+1

对不起,但是您真的想告诉我们如何在Matlab中对矢量进行二次采样吗?就像一个简单的循环? – gilgamash

+1

他们是否随机混合?你确定只是随机抽取6000个样本而不是每个班级挑选一定数量的样本更有意义吗? – Dan

+0

@丹,我认为一致随机更有意义。无论如何,这是一篇论文中的建议设置。我只是想重现结果。 – Dylan

回答

1

我假设你的数据是随机排序的?所以,现在你想m*3样本与每个类的m样品(其中)

data = [ones(n,1); ones(n,1)*2; ones(n,1)*3]; 
data = data(randperm(numel(data))); 

:所以这样的事情(我只用3类,123为简单起见)。最自然的方式将大约为每个类的精确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更改为或类似的东西