簡體   English   中英

以相同頻率采樣數據

[英]sampling data with equal frequency

我有一個標簽矢量labels ,其中包含10類60000個對象的標簽信息(每個類有6000個樣本)。

我需要隨機抽樣1000個樣本,但還要保證每個班級100個樣本。

我假設您的數據是隨機排序的? 因此,像這樣(我只用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(idx,:)因為您的data可能不是矢量。 但是在這種情況下,您需要將我的代碼中的numel更改為size(data,1)或類似的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM