0

データセットからの置換でランダムサンプルを行う最良の方法は何ですか? データセットとして 316 * 34 を使用しています。データを3 つのバケットに分割したいが、置き換えたい。ラベルデータを識別するのに便利なインデックスをそのまま保持する必要があるため、randperm を使用する必要があります。私はいくつかのランダムサンプルメソッドがあるのを見ましたが、それらは私が探していることをしているようには見えませんでした.matlabに何かが存在しないと考えるのは奇妙ですが、私は次のことをしました:

私の問題は、これを行うrow_idx = round(rand(1)*316)とゼロになることがあり、2つの質問につながることです

  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
    

私は次のことができます:

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

乱数が2つの連続したラウンドで2つのゼロ値を与えることは決してないと仮定します。

4

2 に答える 2

1

質問に対して: 使用randpermすると、任意のアイテムを 1 回描画できるため、置換なしで描画順序が与えられます。

あなたがrandiそれを使用すると、交換であなたを引き寄せます。つまり、アイテムを何度も引きます。

データセットを「セグメント化」したい場合、それは通常、データセットを 3 つの異なるセットに分割することを意味します。そのためには、置換なしで 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 に答える
1

randiは、置換によるサンプリングの整数インデックスを取得する良い方法です。3 つのバケットに同じ数のサンプルを入れたいと仮定すると、次のように書くことができます。

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 に答える