2016-01-05 92 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更改爲或類似的東西