
コンピューティングにおいて、エイリアス法は、離散確率分布からサンプリングするための効率的なアルゴリズムのファミリーであり、1974年にアラスター・J・ウォーカーによって発表されました。[1] [2]つまり、任意の離散確率分布p iに従って整数値1 ≤ i ≤ nを返します。アルゴリズムは通常、O ( n log n )またはO ( n )の前処理時間を使用し、その後、 O (1)時間で分布からランダムな値を抽出できます。[3]
手術
内部的には、アルゴリズムは確率 表 U iと別名表 K i ( 1 ≤ i ≤ n ) の 2 つの表を参照します。ランダムな結果を生成するために、公平なサイコロを振って2 つの表のインデックスiを決定します。次に、偏ったコインを投げて、確率U iでiの結果を選択し、そうでない場合はK i (確率1 − U i ) を選択します。[4]
より具体的には、アルゴリズムは次のように動作します。
- 均一なランダム変量0 ≤ x < 1を生成します。
- i = ⌊ nx ⌋ + 1、y = nx + 1 − iとします。(これにより、i は{1, 2, ..., n }に一様分布し、y は[0, 1)に一様分布します。)
- y < U iの場合は、iを返します。これはバイアスのあるコイン投げです。
- それ以外の場合は、K iを返します。
Marsagliaら[5]が提案した確率表の代替定式化である二乗ヒストグラム法では、 3番目のステップで条件x < V i = ( U i + i − 1)/ nをチェックすることでyの計算を回避します。
テーブル生成
分布には、n を2 の累乗などの都合の良い値に増やすために、追加の確率p i = 0が埋め込まれることがあります。
2 つのテーブルを生成するには、まずU i = np iを初期化します。このとき、テーブル エントリを次の 3 つのカテゴリに分けます。
- U i > 1 の「オーバーフル」グループでは、
- U i < 1かつK iが初期化されていない「underfull」グループ、および
- U i = 1またはK i が初期化されている「完全に完全な」グループ。
U i = 1の場合、対応する値K i は参照されることはなく、重要ではありませんが、K i = iの値は意味があります。これにより、確率がU i = 1を正確に表すことができない固定小数点数として表される場合の問題も回避されます。
すべてのテーブル エントリが完全にいっぱいにならない限り、次の手順を繰り返します。
- 過剰エントリU i > 1と不足エントリU j < 1を任意に選択します。(これらのうちの 1 つが存在する場合は、もう一方も存在する必要があります。)
- K j ← iを設定して、エントリjの未使用のスペースを結果iに割り当てます。
- U i ← U i − (1 − U j ) = U i + U j − 1に変更して、エントリiから割り当てられたスペースを削除します。
- エントリj はちょうどいっぱいになりました。
- U iの新しい値に基づいて、エントリi を適切なカテゴリに割り当てます。
各反復では、少なくとも 1 つのエントリが「完全にいっぱい」のカテゴリに移動します (最後の反復では 2 つが移動します)。そのため、この手順は最大でn −1回の反復後に終了することが保証されます。各反復はO (1)時間で実行できるため、テーブルはO ( n )時間 でセットアップできます。
Vose [3] : 974は、 浮動小数点の丸め誤差により、ステップ1で言及されている保証が破られる可能性があることを指摘しています。1つのカテゴリが他のカテゴリより先に空になった場合、残りのエントリのU iは1に設定され、誤差は無視できます。浮動小数点を考慮したソリューションは、Walker-Vose法またはVoseエイリアス法と呼ばれることもあります。
ステップ 1 での任意の選択のため、エイリアス構造は一意ではありません。
y < U iの場合、検索手順が若干速くなるため( K iを参照する必要がないため)、テーブル生成中の目標の 1 つはU iの合計を最大化することです。これを最適に行うことはNP 困難であることが判明しています[5] : 6 が、貪欲アルゴリズムはそれなりに近づきます。つまり、最も裕福な人から奪い、最も貧しい人に与えます。つまり、各ステップで最大のU iと最小のU j を選択します。これにはU iをソートする必要があるため、 O ( n log n )時間 かかります。
効率
エイリアス法は、均一偏差の生成自体が高速である場合には非常に効率的ですが、ランダム ビットの使用という点では最適とは程遠い場合があります。これは、必要なランダム ビットがわずかである場合でも、毎回 完全精度のランダム変量xが使用されるためです。
確率が特によくバランスが取れている場合、U i = 1が多くなります。 iのこれらの値では、K i は必要なく、y を生成するのは時間の無駄です。たとえば、p 1 = p 2 = 1 ⁄ 2の場合、32 ビットのランダム変数x を使用して 32 個の出力を生成できますが、エイリアス方式では 1 つしか生成されません。
確率が著しく不均衡な場合、つまりU i ≈ 0 となる場合が多々あります。たとえば、p 1 = 0.999かつp 2 = 0.001の場合、ほとんどの場合、ケース 1 が当てはまると判断するために必要なランダム ビットはわずかです。このような場合、Marsaglia ら[5] : 1–4 が説明したテーブル メソッドの方が効率的です。同じ確率で多くの選択を行う場合、平均して 1 ビット未満の偏りのないランダム ビットしか必要としません。算術符号化技法を使用すると、バイナリ エントロピー関数によって指定された限界に近づくことができます。
文学
- Donald Knuth著『The Art of Computer Programming』、第 2 巻: Seminumerical Algorithms、セクション 3.4.1。
実装
- http://www.keithschwarz.com/darts-dice-coins/ Keith Schwarz: Vose のアルゴリズムの詳細な説明、数値的に安定したバージョン、および Java 実装へのリンク
- https://jugit.fz-juelich.de/mlz/ransampl Joachim Wuttke: 小さな C ライブラリとしての実装。
- https://gist.github.com/0b5786e9bfc73e75eb8180b5400cd1f8 Liam Huang による C++ での実装
- https://github.com/joseftw/jos.weightedresult/blob/develop/src/JOS.WeightedResult/AliasMethodVose.cs Vose アルゴリズムの C# 実装。
- https://github.com/cdanek/KaimiraWeightedList 浮動小数点の不安定性のない Vose アルゴリズムの C# 実装。
参考文献
- ^ Walker, AJ (1974年4月18日). 「任意の頻度分布を持つ離散乱数を生成するための新しい高速方法」. Electronics Letters . 10 (8): 127–128. Bibcode :1974ElL....10..127W. doi :10.1049/el:19740097.
- ^ Walker, Alastair J. (1977 年 9 月). 「一般分布による離散ランダム変数を生成するための効率的な方法」. ACM Transactions on Mathematical Software . 3 (3): 253–256. doi : 10.1145/355744.355749 . S2CID 4522588.
- ^ ab Vose, Michael D. (1991 年 9 月). 「与えられた分布で乱数を生成する線形アルゴリズム」(PDF) . IEEE Transactions on Software Engineering . 17 (9): 972–975. CiteSeerX 10.1.1.398.3339 . doi :10.1109/32.92917. 2013 年 10 月 29 日のオリジナル(PDF)からアーカイブ。
- ^ 「ダーツ、サイコロ、コイン:離散分布からのサンプリング」KeithSchwarz.com 2011 年 12 月 29 日 2011年 12 月 27 日閲覧。
- ^ abc Marsaglia, George ; Tsang, Wai Wan; Wang, Jingbo (2004-07-12)、「離散ランダム変数の高速生成」、Journal of Statistical Software、11 (3): 1–11、doi : 10.18637/jss.v011.i03
