私は、N個の乱数の配列を生成するアルゴリズムを探しています。N個の数字の合計は1で、すべての数字は0と1の範囲内にあります。たとえば、N = 3、ランダムポイント(x、y、 z)三角形内にある必要があります:
x + y + z = 1
0 < x < 1
0 < y < 1
0 < z < 1
理想的には、エリア内の各ポイントに等しい確率が必要です。難しすぎる場合は、要件を削除できます。ありがとう。
私は、N個の乱数の配列を生成するアルゴリズムを探しています。N個の数字の合計は1で、すべての数字は0と1の範囲内にあります。たとえば、N = 3、ランダムポイント(x、y、 z)三角形内にある必要があります:
x + y + z = 1
0 < x < 1
0 < y < 1
0 < z < 1
理想的には、エリア内の各ポイントに等しい確率が必要です。難しすぎる場合は、要件を削除できます。ありがとう。
回答:
最初に、サンプルを
x + y + z = 1
0 ≤ x ≤ 1
0 ≤ y ≤ 1
0 ≤ z ≤ 1
サンプルポイントは要求されたエリアに高い確率で存在するため、これは大きな違いにはなりません。
これで、シンプレックスからポイントをサンプリングすることができます。3Dの例では、3Dで実現された2Dシンプレックス(三角形)を取得します。
このブログ投稿で、ランダムに均一にポイントを選択する方法について説明しました(コメントを参照)。
あなたの問題では、間隔から乱数を取得し、とを追加して個の数字のリストを取得することを意味します。リストをソートしてから、2つの連続した要素の違いを記録します。これにより、合計なるリストが得られます。さらに、このサンプリングは均一です。この考えは、ベイジアンブートストラップアンのドナルドB.ルービンにあります。統計学者。9、1981、130-134。(0 、1 )0 1 、N + 1 、N 1
たとえば()3つの乱数があり、ソートされたシーケンスを取得し、これにより差が得られます。構築により、これら4つの数値は合計1になります。0.4 0.2 0.1
0 0.1 0.2 0.4 1
0.1 0.1 0.2 0.6
別のアプローチは次のとおりです。ハイパーキューブからの最初のサンプル(つまりを忘れているx+y+z=1
)で、サンプルポイントを正規化します。正規化は、 -hypercubeから -simplexへの投影です。シンプレックスの中心のポイントには、外側よりも「前イメージポイント」があることを直感的に明確にする必要があります。したがって、ハイパーキューブから均一にサンプリングする場合、シンプレックスで均一なサンプリングを行うことはできません。ただし、適切な指数分布でハイパーキューブからサンプリングすると、この効果は相殺されます。図は、両方の方法がどのようにサンプリングされるかを示しています。しかし、私はその単純な形式のために「ソート」方法を好みます。実装も簡単です。d − 1
これは、既存の回答に追加することです。
Devroyeは、この種の質問の優れたリファレンスです。第7章では、OPが後の統一次数統計を生成するために必要なアルゴリズムを示します。
一様な順序の統計を生成するには、サンプルをソートします。このアプローチには時間かかります。より速い方法(本で利用可能)は、 pdf から乱数をサンプリングすることを含み ます。(これらは均一なpdfの間隔です)。次に、値 をます。全体で時間でソートされます。(ここでA.Schulzの答えと重複しています-計算をより明確にするだけです)。[ 0 、1 ] O (N ログN )N 、X 1、... 、X N Eがxは、P(1 )、 (Y I )1 ≤ iが≤ N = Σ 1 ... iが xはjで O(n)
逆CDFサンプリングを介して、上の不均一なpdfをサンプリングするために、同じアプローチを適用できます。また、標準シンプレックス以外のシンプレックス(たとえば)で均一にサンプリングできるようにするトリックもあります。2 、X + 3 Y + Z = 5
この論文を参照してください:Smith、N. and Tromble、R.、Sampling from Uniform from unit simplex。