宮崎大学 >> 工学部 >> 情報システム工学科 >> 伊達 >>
Last modified: Thu May 29 15:49:50 JST 2014

速修 正規分布

$X_1, X_2, \cdots. X_{1000} $を 平均 $\mu$, 分散 $\sigma^2$ の互いに独立なガウス分布にしたがう確率変数とする」 というような表現がよく使われる. この文の意味,特に, 「互いに独立」,「ガウス分布」, 「平均」,「分散」,「確率変数」などの概念について, 簡単な例を通して, 直感的に理解できるようになっておこう. 平均 $\mu$, 分散 $\sigma^2$ の正規分布の確率密度は次のように表せる.

\begin{displaymath}
p(x) = \frac{1}{\sqrt{2\pi \sigma ^2}} \exp \left\{ -\frac{(x-\mu)^2}{2\sigma ^2} \right\}
\end{displaymath} (1)

$ x' = (x-\mu)/\sigma $ と変換すれば, $x'$ は平均 $0$,分散 $1$ の正規分布にしたがう (逆に言うと, $x'$ をもとに $ x = \sigma x' + \mu$ を生成すれば平均 $\mu$,分散 $\sigma^2$ の 正規分布にしたがうデータが得られる). これを標準正規分布という. 正規分布はガウス分布とも呼ばれ,以下のような形をしている.
図 1: 平均 $0$,分散 $1$ の正規分布の確率密度
\includegraphics[width=.5\linewidth]{gauss001.eps}

$X_1, X_2, \cdots. X_{1000} $を 平均 $0$, 分散 $1$ の互いに独立なガウス分布にしたがう確率変数とする」 というような表現を理解しよう. 独立というのは例えば「$x_1$の値は$x_5$の値とは無関係に定まる」 といったことである. また上の図では分布の広がりを $\sigma$ と書いてあるが, これは標準偏差と呼ばれている量であり, 分散は,その2乗,$\sigma^2$の事である. あまり深く考えず,分布の広がり(幅の大きさ)と思っていい. 正規分布にしたがっていれば, この1000個の確率変数の実現値 $x_i, i=1,\cdots,1000$ のうち約 $68.26\%$$ -1 < x_i < 1 $ に含まれている. その根拠は

\begin{displaymath}
\int_{-1}^{1} p(x) dx =
\frac{1}{\sqrt{2\pi}} \int_{-1}^{1} \exp \left\{ -\frac{x^2}{2} \right\} dx = 0.6826
\end{displaymath} (2)

という計算である.同じ様に,実現値のうち95.44%が $ -2 < x_i < 2 $の区間に, $99.74\%$$ -3 < x_i < 3 $ の区間に含まれているはずである. また $x_1=100$ という値はめったにでないが,そのようなことが おこる確率は0ではない. おこりう事すべてを足しあわせた確率は
\begin{displaymath}
\int_{-\infty}^{\infty} p(x) dx =
\frac{1}{\sqrt{2\pi}} \i...
...-\infty}^{\infty} \exp \left\{ -\frac{x^2}{2} \right\} dx = 1
\end{displaymath} (3)

となる. $p(x)$は確率密度関数であって確率ではない. 上記の計算からもわかるように, 標準正規分布にしたがうデータを1つとってきたとき, その値 $x$ が,$ a < x < b$ にある確率が $ \Phi (b) - \Phi (a) $ と計算できる. ここで
\begin{displaymath}
\Phi (x) =
\frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} \exp \left\{ -\frac{t^2}{2} \right\} dt
\end{displaymath} (4)

であり, ほとんどの確率・統計の教科書にこの関数の具体的な値が掲載されている.

irl_gauss.c

#include 
#include  /* for srand48(), drand48() */
#include    /* for sqrt(), log() */

double nrand();

/*   一様分布 drand48() を使い標準正規分布に従うデータを出力する関数  */
double nrand(){

    static int sw=0;
    static double r1,r2,s; 
    
    if (sw==0){
        sw=1;
        do {
            r1=2.0*drand48()-1.0;
            r2=2.0*drand48()-1.0;
            s=r1*r1+r2*r2;
        } while (s>1.0 || s==0.0);
        s=sqrt(-2.0*log(s)/s);
        return(r1*s);
    }
    else {
        sw=0;
        return(r2*s);
    }
}


int main(){

    int i;
    int seed = 1234567; /* 乱数の種 */
    double x; 
    
    srand48( seed ); 
    
    for (i=0; i<1000; i++){ x = nrand();
        printf("%.5lf\n",x);
    }
}

% gcc irl_gauss.c -lm 
% ./a.out > data001
とすれば標準正規分布から1000個の乱数がとりだせる. ヒストグラムを書いて確かめてみる.
% octave
octave:1> load data001
octave:2> hist(data001, 20)    # 20 の部分を大きい値にすると分布がより細かくみえる.
eps ファイルとして出力するには:
octave:3> print -depsc2 hoge.eps # print の使い方は help print
とすれば図がeps ファイルとして出力されるので,
% evince hoge.eps   # 分布を見る
で確認できる.

宮崎大学 >> 工学部 >> 情報システム工学科 >> 伊達 >>