私は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万の点で問題ないはずですが、私はいくつかの点でまだ動作する方法を期待していました。
ありがとうございます - それは私が提案した方法と同じですが、より優雅に、おそらく効率的にしかありません。 私がもともと提案した方法の問題は、ヒストグラムが確率密度関数を表しているため、リストから位置情報のランダムサンプルを取った場合のように一般的な形状を保存する必要があるということです。上記の方法では、PDFの大部分を取得するために、PDFが高いビンからのデータをほとんど持っていない可能性があります。 – user1153070
無限に向かうデータセットの場合、メソッドは各ヒストグラムを半分に分割し、各半分を2つの異なるヒストグラムに格納する必要があります。ヒストグラムを半分にまっすぐに伸ばすことはおそらく正確ではないと私は思っています。 – user1153070
@ user1153070あなたが望むものを指定するべきだと思います。分割方法(半分)が承認された紙/本に基づいている場合は、あなたは正しいと思っています。しかし、あなたの質問に答えて、あなたは配列をランダムに分割する効率的な方法を望んでいました。 – rahnema1