私は一定量のサンプルを持っており、各サンプルには確率があります。次に、このデータ ソースからリサンプリングして、同じ確率を持つ同じ量の新しいサンプルを取得します。
例えば:
random | 0.03 | 0.78 | 0.45 | 0.70
-------+------+------+------+------
sample | 0000 | 0001 | 0002 | 0003 RNG sample | 0000 | 0003 | 0002 | 0003
-------+------+------+------+------ ====> -------+------+------+------+------
prob. | 0.10 | 0.20 | 0.30 | 0.40 prob. | 0.25 | 0.25 | 0.25 | 0.25
私の場合、確率は直接ではなく重みとして与えられます。ただし、確率はすべての重みの合計がわかっているため (ただし一定ではない)、重みから直接導き出すことができます。
MATLAB の実装では、Statistics Toolbox の関数randsampleを使用して、このリサンプリング プロセスを実現しました。
y = randsample(n,k,true,w)
または、長さがy = randsample(population,k,true,w)
の正の weights のベクトルを使用して、置換で取得された重み付けされたサンプルを返します。のエントリに整数が選択される確率は です。通常、は確率のベクトルです。置換なしの加重サンプリングはサポートされていません。w
n
i
y
w(i)/sum(w)
w
randsample
function [samples probabilities] = resample(samples, probabilities)
sampleCount = size(samples, 1);
indices = randsample(1 : samplecount, samplecount,
true, probabilities);
samples = samples(indices, :);
probabilities = repmat(1 / sample count, samplecount, 1);
end
アルゴリズムのこの部分を iPad 2 に移植して、 512 サンプルがリサンプリングされるリアルタイム (~25fps) データを更新するために使用します。したがって、他の計算も実行されるため、時間効率が重要です。メモリを最小化する必要はありません。
Alias メソッドを調べましたが、構造構築プロセスは非常に面倒で、おそらく最も効率的なソリューションではないようです。
リアルタイム要件を満たす他の効率的な方法はありますか、それとも Alias メソッドが適していますか?