np.exp(-(x_fit ** 2) / 2) / np.sqrt(2 * np.pi)
の部分ですが、これは標準正規分布の確率密度関数の値を計算しています。
コード全体を順番に説明していくと、
x = np.random.randn(1000)
で標準正規分布に従う観測値を1000個取得する
numpy.random.randn — NumPy v1.15 Manual
-
counts, edges, patches = ax.hist(x, bins=25)
でヒストグラムを計算する。
-
np.exp(-(x_fit ** 2) / 2) / np.sqrt(2 * np.pi)
で各ビンの中点における標準正規分布の確率密度関数の値を計算する。
-
ヒストグラムは規格化 (Σ ビンiの幅 * ビンiの度数 = 1) されていないので、確率密度関数の値を 1000 * np.diff(edges)
を乗算してヒストグラムのスケールに合わせる。
ヒストグラムの度数 (count) を規格化するには、
規格化された度数 = 度数 / (ビンの幅 * サンプル数)
で計算されるので、逆に確率密度関数の値を元のヒストグラムのスケールに合わせるには、
確率密度関数の値 * (ビンの幅 * サンプル数)
としてスケールすればよい。
コードにコメントを入れて整理しました。
このコードの趣旨は、ある分布に従う値をいくつかサンプルしてヒストグラムを作り、そこにその分布の確率密度関数を一緒に描画したら、ヒストグラムでその分布を近似できていることが確認できるという内容だと思います。
python
1import numpy as np
2from matplotlib import pyplot as plt
3
4# 乱数のシード初期化
5np.random.seed(123)
6
7# 標準正規分布に従う観測値を1000個取得する。
8x = np.random.randn(1000)
9
10fig, ax = plt.subplots()
11
12# ヒストグラムを作成する。
13counts, edges, patches = ax.hist(x, bins=25)
14
15# 各ビンの中点
16x_fit = (edges[:-1] + edges[1:]) / 2
17
18
19def pdf(x):
20 """標準正規分布の確率密度関数
21 """
22 return np.exp(-(x ** 2) / 2) / np.sqrt(2 * np.pi)
23
24
25# 確率密度関数の値をヒストグラムに合わせてスケールする。
26y = 1000 * np.diff(edges) * pdf(x_fit)
27
28ax.plot(x_fit, y)
29plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。