2017-03-22 7 views
1

私は2倍のクロスバリデーションを行う入力2Dヒストグラムを持っています。問題は、ヒストグラムからデータの2つの相互に排他的なランダムサンプルを抽出する方法がわかりません。それが各データポイントの位置情報の2つのリストであったならば、それは簡単でしょう - 同じ方法でリストのデータをシャッフルし、リストを等しく分割します。私はこれを行うだろうリストについてはそうランダムにヒストグラムデータを選択するMATLAB

list1 = [1,2,3,3,5,6,1]; 
list2 = [1,3,6,6,5,2,1]; 

idx = randperm(length(list1)); % ie. idx = [4 3 1 5 6 2 7] 
shlist1 = list1(idx); % shlist1 = [3,3,1,5,6,2,1] 
shlist2 = list2(idx); % shlist2 = [6,6,1,5,2,3,1] 

slist1 = shlist1(1:3); % slist1 = [3,3,1] 
elist1 = shlist1(4:6); % elist1 = [5,6,2,1] 
slist2 = shlist2(1:3); % slist2 = [6,6,1] 
elist2 = shlist2(4:6); % elist2 = [5,2,3,1] 

しかし、この同じデータが、私は結果がこの

ような何かになりたいヒストグラム

hist = [2 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 2 0 0 0] 

として私に提示された場合

hist1 = [0 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 1 0 0 0] 

hist2 = [2 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 1 0 0 0] 

このように、データの異なる半分がランダムにあり、2つの新しいヒストグラムに均等に割り当てられます。

これは、各ビンhist(i、j)のランダムな整数の高さをとり、それをhist1(i、j)の等価ビンに加え、hist2(i、j)との差に等しいのでしょうか?

% hist as shown above 
hist1 = zeros(6); 
hist2 = zeros(6); 
for i = 1:length(hist(:,1))*length(hist(1,:)) 
    randNum = rand; 
    hist1(i) = round(hist(i)*randNum); 
    hist2(i) = hist(i) - hist1(i); 
end 

そして、それが同等であれば、それを行うためのより良い方法/組み込みの方法はありますか?

私の実際のヒストグラムは300x300ビンで、約6,000,000のデータポイントを含んでおり、高速である必要があります。任意の助け

感謝:)

EDIT: それは全体の確率密度関数を維持しないように私が作ったコードの提案ビットは、リストからの位置の点のランダムなサンプルを採取することと同等ではありませんデータ。 ヒストグラムを半分にすると、私の600万の点で問題ないはずですが、私はいくつかの点でまだ動作する方法を期待していました。

答えて

0

randまたはrandiを使用すると、2つのヒストグラムを生成できます。最初の方法はより効率的ですが、2番目の方法はよりランダムです。

h = [[2 0 0 0 0 0] 
     [0 0 0 0 0 1] 
     [0 1 0 0 0 0] 
     [0 0 0 0 0 0] 
     [0 0 0 0 1 0] 
     [0 0 2 0 0 0]]; 

%using rand  
h1 = round(rand(size(h)).*h); 
h2 = h - h1; 

%using randi 
h1 = zeros(size(h)); 
for k = 1:numel(h) 
    h1(k) = randi([0 h(k)]); 
end 
h2 = h - h1; 
+0

ありがとうございます - それは私が提案した方法と同じですが、より優雅に、おそらく効率的にしかありません。 私がもともと提案した方法の問題は、ヒストグラムが確率密度関数を表しているため、リストから位置情報のランダムサンプルを取った場合のように一般的な形状を保存する必要があるということです。上記の方法では、PDFの大部分を取得するために、PDFが高いビンからのデータをほとんど持っていない可能性があります。 – user1153070

+0

無限に向かうデータセットの場合、メソッドは各ヒストグラムを半分に分割し、各半分を2つの異なるヒストグラムに格納する必要があります。ヒストグラムを半分にまっすぐに伸ばすことはおそらく正確ではないと私は思っています。 – user1153070

+0

@ user1153070あなたが望むものを指定するべきだと思います。分割方法(半分)が承認された紙/本に基づいている場合は、あなたは正しいと思っています。しかし、あなたの質問に答えて、あなたは配列をランダムに分割する効率的な方法を望んでいました。 – rahnema1

0

Hを2Dヒストグラムとします。次のコードは、そのインデックスのカウントに比例する確率で単一のランダムインデックスを抽出します。これはあなたが望むものだと思います。

cc = cumsum(H(:)); 
if cc(1) ~= 0 
    cc = [0; cc]; 
end 
m = cc(end); 
ix = find(cc > m*rand, 1); 

複数のサンプルを抽出するには、1回の呼び出しでn個のサンプルを抽出する独自の検索関数(効率的なバイナリ検索が望ましい)を作成する必要があります。これにより、各インデックスのヒストグラム数に比例した確率で選択されたインデックスのベクトル(ix_vecと呼ぶ)が得られます。我々はXによってヒストグラムの各位置に対応する数値を示す場合

次に、あなたのランダムサンプルである:第2のランダムサンプルセットに対する

R1 = X(ix_vec); 

繰り返します。

関連する問題