確率論 5


  ここまで,[1][2]のおかげて,大体確率論の基礎が理解できてきた.

  確率変数, 確率分布, 確率密度関数, 累積分布関数, 離散形, 連続型, 確率変数の変換,同時分布, 周辺分布, 条件付き分布,
  ベイズの公式, 期待値, 分散, 標準偏差, Law of the unconscious statistician, 大数の法則,Uniform law of the large number, 中心極限定理,
  は,理解できたことにして,少しずつ応用をしていく.
  
   戻る  確率論6へ

C++のrand()が発生する乱数列の確率密度関数

   いろんなアルゴリズムを書いていると,ある特定の分布に従う乱数列(1次元だけでなくn次元の乱数も)が必要になることがまれによくある.
   まず, 準備として,C++のrand()で発生させた乱数列の,確率密度関数を書いてみる.
   
   rand()自体はintを返してくるので,次の関数で発生させた乱数を考える。
//[-1,1]の一様分布  E(X)=μ=0 V(X)=1/3
static inline double myRand()
{
    return 2.0 * rand()/(double)RAND_MAX - 1.0;
}

  ○乱数の確率密度関数(の近似)を取得する○
    1) 幅hのビンを用意し,x軸に敷き詰める;
    2) myRand()でNpt個の乱数を発生させて,対応するビンに入れる;
    3) i番目のビンに,k個の乱数が入っていたら,このビンの高さ l = k / (h×Npt) とする;      
       下図の通り,i番目のビンの面積 h×l = P(h×i ≦X≦h×(i+1))であることに注意 (P()は確率);
    4) 下図の通り,ビンの上端をつないだものが,確率密度関数になる;    
     

    この方法で得られたMyRand()の確率密度関数が以下. Npt を大きくすると,だんだん綺麗な一様分布になる.binのサイズh=0.05とした.
    
    




Box Muller法

   区間(0,1)一様分布に従う乱数を,標準正規分布N(0,1)に従う乱数に変換する手法.
   一様分布に従う2個の確率変数XYを以下の通り変更し,標準正規分布に従う2個の確率変数Z1Z2を出力する.
   
   
static inline void BMrand(double &z1, double &z2)
{
    double x1 = rand()/(double)RAND_MAX;
    double x2 = rand()/(double)RAND_MAX;
    z1 = sqrt( -2.0 * log( x1 ) ) * cos( 2.0 * M_PI * x2);
    z2 = sqrt( -2.0 * log( x1 ) ) * cos( 2.0 * M_PI * x2);
}
   BMrandで発生させた乱数列の確率密度関数は以下(発生点数Npt = 1000000とした).確かにN(0,1)の確率密度関数に一致している.
   
   




大数の法則を確かめる

   Xiそれぞれを独立同一分布に従う確率変数とし,Znを以下のとおり定義する.
   
   Znを発生させるコートは以下。
static inline double rand_1(int n)
{
    double v = 0;
    for( int i=0; i< n; ++i) v += myRand();
    return v / n;
}
   この例では,Xiを,[0,1]の一様分布に従う確率変数とした.
   先の方法と同様にして,ZnをNpt個発生させの確率密度関数を書いてみる.
   
   確かにnを大きくするのに従い,ばらつきが(分散)小さくなっているのがわかる.
   これでnを無限大に飛ばせば, 確率変数Znの値は,0に収束する(常に値0を取るようになる)。





中心極限定理を確かめる

   Xiそれぞれを独立同一分布に従う確率変数とし,Znを以下のとおり定義する.
   
   Znを発生させるコートは以下。
static inline double rand_2(int n)
{
    double v = 0;
    for( int i=0; i< n; ++i) v += myRand();
    return v / sqrt( n * 1.0 / 3.0 );       //myRand()の作る一様分布[-1,1]の分散は1/3なので.
}
   先の方法と同様にして,ZnをNpt個発生させの確率密度関数を書いてみる.
   確かにnを大きくするのに従い,密度関数の形状が標準正規分布に近づいて行くのがわかる.
   
   ここでは,確率変数Xiが一様分布に従うとしたが,元となる分布ななんでもよい(これが中心極限定理の面白いところ).)




   戻る  確率論6へ