0

从数据集中替换随机样本的最佳方法是什么?我使用 316 * 34 作为我的数据集。我想将数据分成三个桶,但要替换。我是否应该使用 randperm,因为我需要确保索引完好无损,因为该索引可以方便地识别标签数据。我是 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)

假设随机数不会在连续两轮中给出两个零值。

4

2 回答 2

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
于 2012-11-17T22:01:45.180 回答
1

问题:如果你使用randperm它会给你一个没有替换的抽奖顺序,因为你可以抽一次任何项目。

如果您使用randi它来替换您,那就是您可能多次绘制一个项目。

如果你想“分割”一个数据集,这通常意味着你将数据集分成三个不同的集合。为此,您使用 draw 无需替换(您不会将物品放回原处;使用randperm)。如果你用替换来做(使用randi),它会非常慢,因为一段时间后你绘制一个你以前没有的项目的机会非常低。(优惠券收集器中的详细信息)。

如果您需要一个 split 的分段,您可以检查元素并独立决定放置它的位置。(也就是说,您为每个有替换的项目选择一个桶——也就是说,您将任何选择的桶放回游戏中。)

为了那个原因:

% 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

我们去吧。

于 2012-11-18T00:07:07.547 回答