从数据集替换随机样本的最佳方法是什么?我使用316 * 34作为我的数据集。我想将数据分段为三个存储桶,但需要更换。我应该使用randperm,因为我需要确保我保持索引完整,其中索引可以方便识别标签数据。我是matlab的新手我看到有几个随机的样本方法,但它们看起来不像我正在寻找的东西,奇怪的是认为像matlab中不存在的东西,但我做了以下的事情:< / p>
我的问题是,当我这样做时row_idx = round(rand(1)*316)
有时我会得到零,这导致两个问题
使用替换进行随机样本的最佳方法是什么。
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)
假设随机数在两个连续轮次中永远不会给出两个零值。
答案 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
我们去了。