Matlab:随机抽样替换

时间:2012-11-17 21:49:42

标签: matlab replace random-sample

从数据集替换随机样本的最佳方法是什么?我使用316 * 34作为我的数据集。我想将数据分段为三个存储桶,但需要更换。我应该使用randperm,因为我需要确保我保持索引完整,其中索引可以方便识别标签数据。我是matlab的新手我看到有几个随机的样本方法,但它们看起来不像我正在寻找的东西,奇怪的是认为像matlab中不存在的东西,但我做了以下的事情:< / p>

我的问题是,当我这样做时row_idx = round(rand(1)*316)有时我会得到零,这导致两个问题

  1. 我该怎么办才能避免沸腾?
  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
    
  3. 我可以这样做:

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

问题:如果你使用randperm它会给你一个无需替换的平局订单,因为你可以一次绘制任何一个项目。

如果您使用randi,它会为您提供替换,即您可能会多次绘制项目。

如果要“分割”数据集,通常意味着将数据集拆分为三个不同的集合。为此你使用draw而不替换(你没有把项目放回去;使用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
我们去了。