さまざまなe discrete distributionsからの連続的な均一化によるサンプリングのための効率的な方法。
つまり、変数の整数部分Y = [X]からシミュレートします。この変数は、(テーブルメソッド(別名エイリアス)メソッドなどの)各インターバル内にある確率に等しい確率で離散分布します。次に、ランダムな一様な[0,1 $、X = Y + U]を単純に追加します。
あなたの例では、確率0.5,0.25と0.25(これは等しい確率で1,1,2,3をサンプリングすることと同等です)の値1,2,3を取ってYをランダムに追加します。
"ヒストグラム"が本当に大きい場合、これは非常に高速なアプローチになります。
Rであなたが
sample(c(1,1,2,3))+runif(1)
または
sample(c(1,1,2,3),n,replace=TRUE)+runif(n)
を経由して本の(特に効率的でない場合)簡易版を行うことができ、より一般的にあなたがsample
で、確率の重み引数を使用することができます。
これ以上のスピードが必要な場合は(特に大きなヒストグラムや大きなサンプルサイズのアプリケーションでは)、リンクに記載されている手法を使用してディスクリート部品をかなり高速化できます。その関数の仕事の一部をより低いレベルの言語でプログラミングする(C言語で言う)。
これは、かなり大きなヒストグラム(数十から数百のビン)で上記のコードを使用しただけでも、このアプローチは、私のかなり難しいノートパソコンでさえも、100万のランダムな値を1秒未満では、多くのアプリケーションでこれは問題ありません。
ありがとう、これは正常に動作します。なぜ私はCDFを逆にする必要があるのか説明できますか? –
ohhhh今私はそれを得る x < - runif(n) ifelse(x <0.5,2 * x + 1,4 x)これは2行です統一された[0,1]を作成し、マップします。もう一度ありがとうございます –