一様確率変数を使用してガウス確率変数を実装する


11

平均と分散を指定すると、ガウスランダム値を返すC ++関数を記述しようとしています。

とのrand()間の乱数を返すライブラリ関数があります。には固定値はありませんが、少なくともになることが保証されています。そのPDFは均一です。0RAND_MAXRAND_MAX2151

これrand()をガウス変数に変換するために、中心極限定理を使用しています。私が正確にやっていることは、rand()ユーザーが指定した時間を呼び出し、それらの戻り値を合計して、その平均をユーザー指定の平均にシフトすることです。

ガウスPDF
上記のプロットでは、ガウスランダムジェネレーターを回呼び出し、戻り値の頻度をプロットしました。ご覧のとおり、他の多くのランダムな値の合計によって作成されるため、その分散は非常に大きくなります。107

これは、ガウスPDFと指定された平均値を持つガウス変数を正常に返します。ただし、問題はその分散です。分散をユーザー指定の値に変更する方法がわからないので、この時点で立ち往生しています。

これは私のコードです(現時点では不完全です。パラメータ「Variance」は無視されます):

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

それNUM_GAUSSIAN_SUMSが100で、RAND_MAX32767 であると仮定します。

関数のパラメータに応じて確率変数の分散を変えたい。私の質問は、この確率変数の分散を変更するにはどうすればよいですか?どうすればできますか?


3
ガウス確率変数を生成するための中心極限定理よりも優れた高速な方法があります。1つのBox-Mullerメソッドを検索します。ジッグラト法はさらに優れていると言われています。
Dilip Sarwate、2012年


3
実行時間が重要な考慮事項であった昔は、人々はランダム変数(はないを合計し、を引いて標準のランダム変数の単純な近似を取得し、次にスケーリングしましたは、確率変数を取得します。(これが機能する理由については、@ Hilmarの回答を参照してください)。多くのアプリケーションでは、この単純な方法は非常にうまく機能しましたが、値は範囲制限され、この単純なアイデアは、シックスシグマが流行語になったときに道端で捨てられました。12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ6σ,μ+6σ)
Dilip Sarwate、2012年

@DilipSarwateおそらく私たちがそれを好む理由を正当化した回答として、これらの選択肢を投稿する必要があります
Ivo Flipse

@IvoFlipse質問への回答は、「平均を修正した後、どのように分散を修正するのですか?」コメントで変更されたように、ヒルマーが認めた回答は、コメントによって変更されたとおりです:分散をスケーリングによって修正してから平均を再修正します。あるいは、再修正する必要があるため、最初に平均を修正することから始めないでくださいそれは後で。最初にスケーリングによって分散を修正し、次に平均を修正します。OPは、彼/彼女がより良い方法にまったく興味があり、Box-Mullerメソッドのコードさえ持っているnibotのリンクにさえ賛成していないことを示していません。だから、物事はそのままにしておきます。
Dilip Sarwate、2012年

回答:


6

最初のアルゴリズムは、0と1の間で均一に分布するランダム変数を作成します。その分散は1/12です。そのNUM_GAUSSIAN_SUMSインスタンスを合計すると、分散はになりますNUM_GAUSSIAN_SUMS/12。ターゲット分散に到達するにはV、合計された確率変数にを乗算する必要がありますsqrt(V*12/NUM_GAUSSIAN_SUMS)

余談ですが、テンプレートは浮動小数点数と倍精度浮動小数点数に対しては適切に機能しますが、固定小数点型には数値上の重大な問題があります。


5

この確率変数の分散を変更するにはどうすればよいですか?

もちろん掛け算で。分散、乗法定数であり、あなたの確率変数であるが、あるの分散。cXcXc2X


残念ながら、の平均値ある回の平均値、および分散を修正しようとする前に、OPのセットが所望の値にリセットする必要があることをパラメータのように1。c XcXcX
Dilip Sarwate、2012年

1
センター、再スケールは、その後、平均値を復元します。中央に配置された確率変数をスケーリングしても、(ゼロ)平均には影響しません。
Emre、2012年

1

さらに別の方法があります!

考えてみてください。ガウス分布ではなく他の分布が必要な場合はどうでしょうか。その場合、Central Limitの定理を実際に使用することはできません。それをどうやって解決しますか?

一様確率変数を任意のPDFに変換する方法があります。このメソッドは逆変換メソッドと呼ばれます

場合 均一間隔(0、1)、その後に分配されますU[01]

X=FX1(U)

cdfます。FX(x)

したがって、必要なことは、ユニフォームrvのサンプルから取得した変数に逆CDF関数を適用することだけです。

また、以前の方法とは異なり、これは反復を必要とせず、結果をガウス分布に近づけるために何回反復を行うかには依存しません。

これを証明する参考文献の 1つを次に示します。


3
>別の方法があります!正しいが、特にガウス確率変数に関する検討中の質問とは無関係。ガウスCDFもその逆も、有限数の演算を使用して基本的な用語で表現できないため、提案された方法は使用できません。
Dilip Sarwate、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.