Yamamoto's Laboratory
ファイル
乱数

NumPy乱数

NumPy のモジュール「numpy.random」を使った乱数の生成方法を示します.

目次


はじめに

乱数とは

順序を持った複数の数値の並びで,その並びが推測できないものを言います.ただし,数値の密度 — 値が\(a\)と\(a+\diff a\) の間に入る確率 — は分布関数に従うことができます.複雑な自然現象のシミュレーションに,乱数が使われることがあります(モンテカルロ法).

Python の乱数

Python の乱数には,モジュール「random」と「numpy.random」があります.後者の方が多くの分布関数を備え,更に高速なので自然科学計算には向いています.ただし,前者にも良い面があります.例えば,以下のような場合です.

  • random.choice(seq)  シーケンス(リストやタプルなど)の中から,ランダムに要素を返します.
  • random.shuffle(seq[, random])  シーケンスをシャッフルします.第二引数は\([0,\,1]\)の分布関数で,デフォルトは一様乱数です.
  • random.randint(a, b)  \(a\leq n\leq b\) のランダムな整数 \(n\) を返します.

これ以外は,numpy.random の方が優れていると思われます.

使ってみよう

正規分布の生成とプロットのプログラム(normal_dist.py)

001   # -*- coding:utf-8 -*-
002   import numpy as np
003   import matplotlib.pyplot as plt
004   
005   # ----- 条件設定 -----
006   mu, sigma = 2.0, 2.0
007   N = 10000                # サンプル数
008   Nb = 100                 # ヒストグラムプロットのビン数
009   min_x, max_x = mu-5*sigma, mu+5*sigma
010   dx = (max_x-min_x)/Nb    # ビン幅
011   
012   
013   # ----- 正規分布乱数の生成と統計 -----
014   s = np.random.normal(mu, sigma, N)
015   av  = np.mean(s)
016   std = np.std(s)
017   
018   
019   # ----- プロット作成 -----
020   x = np.linspace(min_x, max_x, 256)
021   y =  1/(sigma*np.sqrt(2*np.pi))*np.exp(-(x-mu)**2/(2*sigma**2))
022   
023   plt.rcParams["font.size"] = 18
024   fig    = plt.figure()
025   plot_1 = fig.add_subplot(1,1,1)
026   plot_1.set_xlim([min_x, max_x])
027   plot_1.text(0.1, 0.8, "$\mu$: {0:.3f}\n$\sigma$: {1:.3f}".\
028               format(av, std), transform=plot_1.transAxes,\
029               color='b')
030   plot_1.hist(s, Nb, range=(min_x, max_x))
031   plot_1.plot(x, N*dx*y, 'r-', linewidth=2)
032   
033   plt.show()
034   fig.savefig('normal_dist.pdf', orientation='portrait', \
035               transparent=False, bbox_inches=None, frameon=None)
036   fig.clf()

図1: ヒスとグラムは生成データ,赤線は理論値.

様々な分布関数

numpy.random の分布関数
関数 (メソッド) 内容
beta(a, b, size) ベータ分布.「beta(loc=alpha, b=beta, size=N)」.a: \(\alpha\),b: \(\beta\),size: 個数(マニュアル)
binomial(n, p[, size]) 二項分布
chisquare(df[, size]) カイ二乗分布
dirichlet(alpha[, size]) ディリクレ分布
exponential([scale, size]) 指数分布
f(dfnum, dfden[, size]) F分布
gamma(shape[, scale, size]) ガンマ分布
geometric(p[, size]) 幾何分布
gumbel([loc, scale, size]) ガンベル分布
hypergeometric(ngood, nbad, nsample[, size]) 超幾何分布
laplace([loc, scale, size]) ラプラス分布(二重指数分布)
logistic([loc, scale, size]) ロジスティック分布
lognormal([mean, sigma, size]) 対数正規分布
logseries(p[, size]) 対数級数分布
multinomial(n, pvals[, size]) 多項分布
multivariate_normal(mean, cov[, size, ...) 多次元正規分布
negative_binomial(n, p[, size]) 負の二項分布
noncentral_chisquare(df, nonc[, size]) カイ二乗分布
noncentral_f(dfnum, dfden, nonc[, size]) noncentral F distribution (非中心F分布?)
normal(loc, scale, size) 正規分布 (ガウス分布).「normal(loc=mu, scale=sigma, size=N)」.loc: 平均,scale: 標準偏差,size: 個数.(マニュアル)
pareto(a[, size]) パレート分布
poisson([lam, size]) ポアソン分布
power(a[, size]) 指数ベキ分布
rayleigh([scale, size]) レイリー分布
standard_cauchy([size]) コーシー分布
standard_exponential([size]) 指数分布
standard_gamma(shape[, size]) ガンマ分布
standard_normal([size]) 正規分布
standard_t(df[, size]) t分布
triangular(left, mode, right[, size]) 三角分布
uniform([low, high, size]) 連続一様分布
vonmises(mu, kappa[, size]) フォン・ミーゼス分布
wald(mean, scale[, size]) Wald 分布(逆ガウス分布)
weibull(a[, size]) ワイブル分布
zipf(a[, size]) ジップ分布

ページ作成情報

参考資料

  1. マニュアル「Random sampling (numpy.random) — NumPy v1.13 Manual」に詳細が書かれています.

更新履歴

2017年08月10日 新規作成


no counter