LoginSignup
24
26

More than 5 years have passed since last update.

Pythonで標準正規分布のグラフを作成

Last updated at Posted at 2016-08-25

1. 標準正規分布とは

平均μ=0, 分散σ=1の正規分布、
すなわち以下の数式で表される関数のことです。

f(x) =  \frac{1}{ \sqrt{2 \pi } } e^{-  \frac{x^2}{2} }

2. 自分で標準正規分布を作成

前述のf(x)を自分で定義して、試しに [-5.0, -4.999, -4.998, ... , 4.998, 4.999, 5.0] と~5.0 ~ 5.0の数列を入れてみると、
一般に正規分布と呼ばれる形のグラフが得られます。

norm_original.py
# coding: utf-8
import numpy as np
import math

# f(x)を自分で書く
f = lambda x: (math.exp(-x**2/2)) / math.sqrt(2*math.pi)

# ベクトルxを [-5.0, ..., 5.0] の区間で作成
n = np.linspace(-5.0, 5.0, 10000)

# f(x)の結果を得る
p = []
for i in range(len(n)):
    p.append(f(n[i]))

# グラフに表示
plt.scatter(n, p)
plt.show()

plt_norm_orig.png

綺麗な釣り鐘が得られましたが、一々自分で定義していくのは、少し面倒くさいです。
何より平均や分散を変えたくなった時に、手間がかかります。

3. scipyを使用

scipy.statsモジュールを利用すると、
上のコード(norm_original.py)ではラムダ式で定義した数式を、関数から呼び出すことができます。

norm_usescipy.py
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

# ベクトルxを [-5.0, ..., 5.0] の区間で作成
n = np.linspace(-5.0, 5.0, 10000)

# 平均0, 標準偏差1の正規分布における、xの確率を求める
p = []
for i in range(len(n)):
    p.append(norm.pdf(x=n[i], loc=0, scale=1))

# 乱数-確率 の特性を散布図で表し、標準正規分布のグラフを作成
plt.scatter(n, p)
plt.show()

pdf_norm_scipy.png

こちらは引数で平均と分散を指定できるので、簡単に違う形の正規分布を得ることが出来ます。

4. 累積分布関数から同時エントロピーを見てみる

前の章では、scipy.stats.norm.pdfから正規分布の確率密度関数を使いました。
今度は少しだけいじって、scipy.stats.norm.cdfから正規分布の累積分布関数を使ってみます。

Wikipediaの結合エントロピーの記述を参考に書いていきます。

同時エントロピー(結合エントロピー)H(X)は、確率変数Xの値の不確かさを表しています。
Xに属するイベントxが発生する確率がp(x)であるとき、Xのエントロピーは、

H(X) = - \sum_{x} p_x log_2 (p_x)

で表されます。

ここでは確率が標準正規分布に乗ると考えて、エントロピーをグラフに表すと、

norm_usescipy.py
---p.append(norm.pdf(x=n[i], loc=0, scale=1))
+++p.append(norm.cdf(x=n[i], loc=0, scale=1))

cdf_norm.png

このようなH(X)が得られます。

24
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
26