2

桁分類コードを整理中です。そこで、「7」などの数字のイメージを入力すると、10 の確率 (合計が 1 になる) が得られます。アルゴリズムがうまく機能している場合、7 番目の要素の値が最も高くなるはずです。

さらに複雑なのは、100 個の要素のバッチを処理していることです。したがって、実際には、各行の合計が 1 になる COLxROW = 100x10 MATRIX があります。

ここで、これらの 100 個の分布のそれぞれからサンプリングしたいと考えています。つまり、確率分布に従って、バッチ項目ごとに [0 0 0 1 0 0 0 0 0] (つまり 3) のようなベクトルを生成する必要があります。

既存の実装は次のとおりです。

samp = pd*0;
layers = cumsum( pd, 2 );
randoms = rand( batchSize, 1 );
for k = 1:batchSize
    index = find( randoms(k) <= layers(k,:),  1 );
    samp( k, index ) = 1;
end

ただし、明示的なループは避けたいと思います (私が読んだように、パフォーマンスが低下することがよくあります)。

このルーチンは最もタイトなループで実行されるため、効率が重要です。

これを効率的に達成する方法は?

編集私は私の質問に答えようとします.誰かが答えを改善できる場合に備えて投稿しています(MatLabで猫の皮をむく方法はほとんど常に複数あります).

4

2 に答える 2

0

以下はうまくいくようです:

function sample = sampleFromPDs( pd )
    [batchSize_, nOutputs] = size( pd );

    bools = cumsum(pd,2) > repmat( rand(batchSize_,1), 1, nOutputs );

    % e.g. 001 111 gives (6+1) - 4 = 3
    indexOfFirstONE = (nOutputs+1) - sum(bools, 2);

    sample = 0 .* pd;  
    sample( ...
        sub2ind( size(pd), 1:batchSize_, indexOfFirstONE' ) ...
        ) = 1;    
end

ただし、MatLab が反復ごとにメモリを再割り当てしている可能性があることを少し心配しています (実際には、常に同じ引数の次元で呼び出されます)。

于 2016-10-03T16:29:28.293 に答える