[英]sampling data with equal frequency
我有一個標簽矢量labels
,其中包含10類60000個對象的標簽信息(每個類有6000個樣本)。
我需要隨機抽樣1000個樣本,但還要保證每個班級100個樣本。
我假設您的數據是隨機排序的? 因此,像這樣(我只用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(idx,:)
因為您的data
可能不是矢量。 但是在這種情況下,您需要將我的代碼中的numel
更改為size(data,1)
或類似的東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.