【NumPy】多変量正規分布に従う乱数を取得する方法(np.random.multivariate_normal)[Python]

  • URLをコピーしました!
目次

NumPy

前回、Pythonのmatplotlibで2つのヒストグラムをhist2dを使って2次元カラープロットで表示する方法を紹介しました。

今回はNumPyを使って多変量正規分布に従う乱数を取得する方法(np.random.multivariate_normal)を紹介します。

それでは始めていきましょう。

np.random.multivariate_normal

多変量正規分布とはWikipediaによると「1次元の正規分布を高次元へと一般化した確率分布」とのこと。

NumPyで多変量正規分布に従う乱数を取得するには「np.normal.multivariate_normal」を用います。

その引数は「mean(平均値)」、「cov(共分散行列)」、「size(生成する乱数の個数)」が必要です。

meanは生成する乱数全体の平均値です。

covは共分散行列で2次元であれば、

\(\begin{pmatrix} a & b \\ b & c \end{pmatrix}\)

という行列を使います。

また3次元であれば、

\(\begin{pmatrix} x & b & c \\ b & y & d \\ c & d & z \end{pmatrix}\)

という行列を使います。

sizeは生成する乱数の個数です。

ということで試してみましょう。

import numpy as np
import matplotlib.pyplot as plt

m = [10, 20]
sig = [[3, 2], [2, 5]]

data = np.random.multivariate_normal(m, sig, 1000)

print(data)

実行結果
[[ 7.14026713 16.88265577]
 [10.78       21.13688494]
 [11.09586189 17.94283725]
 ...
 [ 7.7111823  19.93253814]
 [ 9.57217061 15.73945098]
 [10.40948968 20.98063711]]

ちなみに共分散行列でない場合、警告が出ます。

import numpy as np
import matplotlib.pyplot as plt

m = [10, 20]
sig = [[1, 2], [3, 4]]

data = np.random.multivariate_normal(m, sig, 1000)

print(data)

実行結果
[[ 7.77486154 17.48617272]
 [11.73502476 20.90091949]
 [10.13697764 20.68311091]
 ...
 [13.49954275 23.63324065]
 [11.25954658 19.3409821 ]
 [11.08661306 22.35381334]]
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_6372/1595747601.py:7: RuntimeWarning: covariance is not symmetric positive-semidefinite.
  data = np.random.multivariate_normal(m, sig, 1000)

ちなみに3次元のデータの場合はこんな感じです。

import numpy as np
import matplotlib.pyplot as plt

m = [10, 20, 30]
sig = [[10, 1, 3], 
       [1, 20, 2], 
       [3, 2, 30]]

data = np.random.multivariate_normal(m, sig, 1000)

print(data)

実行結果
[[13.34557828 19.93080557 34.69065533]
 [ 5.89368104 22.76993816 28.14940316]
 [10.34637879 13.55878667 18.9102133 ]
 ...
 [ 6.82094349 17.05460051 27.37065712]
 [ 3.67944814 10.98792155 23.42352923]
 [15.60954801 21.64682594 36.53862669]]

ヒストグラムで表示する方法

せっかく取得した多変量正規分布なのでグラフ化してみましょう。

まずは通常のヒストグラムから表示しますが、ヒストグラムにする際は得られたデータの縦横を変換する必要があります。

今回のnp.random.multivariate_normalの返り値はNumPyのndarrayとして返ってきますので、「.T」をつけることで縦横を入れ替えることができます。

import numpy as np
import matplotlib.pyplot as plt

m = [10, 20]
sig = [[3, 2], [2, 5]]

data = np.random.multivariate_normal(m, sig, 1000).T

fig = plt.figure()
plt.clf()

plt.hist(data[0])
plt.hist(data[1])

plt.show()

実行結果

また前回紹介したmatplotlibのhist2dで2次元カラープロット表示する場合はこんな感じです。

import numpy as np
import matplotlib.pyplot as plt

m = [10, 20]
sig = [[3, 2], [2, 5]]

data = np.random.multivariate_normal(m, sig, 1000).T


fig = plt.figure()
plt.clf()

plt.hist2d(*data, bins=100)

plt.show()

実行結果

次回はPandasの「isin」と「==」で特定の値の要素を抽出する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次