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」と「==」で特定の値の要素を抽出する方法を紹介します。
ではでは今回はこんな感じで。
コメント