2012-11-17 78 views
0

用數據集替換隨機樣本的最佳方法是什麼?我使用316 * 34作爲我的數據集。我想分段數據到三個桶,但與替換。我是否應該使用randperm,因爲我需要確保索引完好無損,該索引可以方便地識別標籤數據。我是matlab新手,我看到有幾個隨機樣本方法,但他們看起來並不像我正在尋找什麼,奇怪的是認爲類似的東西在matlab中不存在,但我做了以下事情:Matlab:帶替換的隨機樣本

我的問題是,當我做到這一點row_idx = round(rand(1)*316)有時我得到零,導致兩個問題

  1. 我應該做些什麼來避免zeor?
  2. 什麼是最好的方式做隨機抽樣與替換。

    shuffle_X = X(randperm(size(X,1)),:); 
        lengthOf_shuffle_X = length(shuffle_X) 
        number_of_rows_per_bucket = round(lengthOf_shuffle_X/3) 
        bucket_cell = cell(3,1) 
        bag_matrix = [] 
        for k = 1:length(bucket_cell) 
         for i = 1:number_of_rows_per_bucket 
          row_idx = round(rand(1)*316) 
          bag_matrix(i,:) = shuffle_X(row_idx,:) 
         end 
         bucket_cell{k} = bag_matrix 
        end 
    

我能做到以下幾點:

  if row_idx == 0 
       row_idx = round(rand(1)*316) 

假設隨機數連續兩輪絕不會放棄兩個零值。

回答

1

randi是一個很好的方式來獲取整數索引的採樣替換。假設你要填寫三個桶具有相等數量的樣本,那麼你可以寫

data = rand(316,34); %# create some dummy data 
number_of_data = size(data,1); 
number_of_rows_per_bucket = 50; 
bucket_cell = cell(1,3); 

idx = randi([1,number_of_data],[number_of_rows_per_bucket,3]); 

for iBucket = 1:3 
    bucket_cell{iBucket} = data(idx(:,iBucket),:); 
end 
+0

不確定是否打算輸入「with replacement」而不是「without replacement」我在尋找「with replacement」 –

+1

@ Null-Hypothesis:糟糕,我輸錯了。這當然是取代更換。 – Jonas

1

的問題:如果你使用randperm它會給你一個繪製順序,無需更換,因爲你可以一次得出任何項目。

如果您使用randi它會引用替換,即您可能多次繪製一個項目。

如果你想「分割」數據集,那通常意味着你將數據集分成三個不同的集合。爲此,您使用繪圖而不更換(不要將項目放回;請使用randperm)。如果你用更換(使用randi)來做它,它會非常慢,因爲在一段時間之後,你繪製一件你以前沒有的東西的機會非常低。 (詳情請登錄coupon collector)。

如果您需要一個分割爲的分割,您可以查看元素並獨立決定將其放置在哪裏。 (這是你選擇了一個水桶用於更換每個項目 - 那就是你把任何選擇的水桶腰進入遊戲。)

對於:

% if your data items are vectors say data = [1 1; 2 2; 3 3; 4 4] 
num_data = length(data); 
bucket_labels = randi(3,[1,num_data]); % draw a bucket label for each item, independently. 
for i=1:3 
    bucket{i} = data(bucket_labels==i,:); 
end 

%if your data items are scalars say data = [1 2 3 4 5]  
num_data = length(data); 
bucket_labels = randi(3,[1,num_data]); 
for i=1:3 
    bucket{i} = data(bucket_labels==i); 
end 

,我們繼續。

+0

是否有可能解釋第一個解決方案中的以下行的邏輯bucket_labels = randi(3,[1,num_data]);謝謝, –

+0

它採用形狀爲[1,num_data](這是一個num_data長向量)的矩陣,並用獨立繪製的隨機數填充它,並在集合{1,2,3}上均勻分佈。 –