Just another Frontier

[多次元標準正規乱数]

numpyには乱数を扱うパッケージnumpy.randomがある。この中にあるnumpy.random.randnは(多次元)標準正規乱数\mathcal{N}(0,\mathbf{I}_d)を生成する。(dは次元)

# import packages
import numpy as np
from matplotlib import pyplot as plt

# generate 10,000 random numbers who are drawn from 2d standard normal distribution
X = np.randn(10000,2)

# its covariance matrix is almost identity
np.cov(X.T)

# see the scatter plot
plt.plot(X[:,0],X[:,1])
plt.show()

[多次元正規乱数]

では各次元が相関し、平均が0ではない一般の多次元正規乱数\mathcal{N}(\mu,\Sigma)はどうするか?randnそのままではできないが、次のように生成できる。

まず,\mathbf{X}を上の例で示したように\mathcal{N}(0,\mathbf{I}_d)からのNつのサンプルとする。

\mathbf{X}_n \sim \mathcal{N}(0,\mathbf{I}_d)

平均を0から\muに移動するのは簡単だ。

# let mu = (1.0,2.0)
nu = np.array([1.0,2.0])

# translate X by mu and store it in Y
Y = X + mu

# see the scatter
plotplt.plot(Y[:,0],Y[:,1])
plt.show()

分散はいわゆるコレスキー法を使えばいい。これは\mathbf{X}の線形変換

\mathbf{Y}_n = \mathbf{A}\mathbf{X}_n

の共分散が\mathbf{A}\mathbf{A}^Tになるということを利用する。すなわち

\mathbf{A}\mathbf{A}^T = \Sigma

なる\mathbf{A}を探すというわけであるが、これはまさにCholesky分解そのままである。

# import cholesky from scipy.linalg
from scipy.linalg import cholesky

# set Sigma, must be a symmetric matrix
Sigma = array([[3.0,0.5],[0.5,1.0]])

# decompose Sigma to AA^T
A = cholesky(Sigma)

# translate X by A and store in Y
# note X has shape (N,D) and A (D,D) and must multiply in order of dot(X,A)
Y = np.dot(X,A)

# see the scatter
plotplt.plot(Y[:,0],Y[:,1])
plt.show()

以上をまとめると、\mathcal{N}(\mu,\Sigma)は次のようにして生成できる。

import numpy as np
from scipy.linalg import cholesky

def randn_multivariate(mu,Sigma,n=1):
    X = np.random.randn(n,len(mu))
    A = cholesky(Sigma)
    Y = np.dot(X,A) + mu
    return Y

長々と書きましたが、実はnumpyも実装されていました…(ちゃんと調べろよ→昔の自分)

multivariate_normal(mean, cov, [m, n, …]) -> random values

というわけで numpy.random.multivariate_normalを使ってください。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

タグクラウド

%d人のブロガーが「いいね」をつけました。