元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

Pythonで多次元正規分布

この記事に書かれていること

numpyによる多次元正規分布の実装

多次元正規分布とは

一般的によく知られている正規分布を多次元に拡張したものです。
正規分布自体の解説はWikipediaにまかせてしまいます
正規分布 - Wikipedia



多次元正規分布確率密度関数は、入力ベクトルx、平均ベクトルmu、分散共分散行列を∑とすると、以下の式で表されます。

 f(x;\mu,\Sigma)=\frac{1}{\sqrt{(2\pi)^p |\Sigma|}}exp(-\frac{1}{2}(x-\mu)\Sigma^{\mathrm{-1}} (x-\mu)^{\mathrm{T}})

pは入力ベクトルの次元数、Tは転置行列を表しています。

Pythonによる実装

この式をPythonで記述すると以下のようになります。

import numpy as np
def mnd(_x, _mu, _sig):
    x = np.matrix(_x)
    mu = np.matrix(_mu)
    sig = np.matrix(_sig)
    a = np.sqrt(np.linalg.det(sig)*(2*np.pi)**sig.ndim)
    b = np.linalg.det(-0.5*(x-mu)*sig.I*(x-mu).T)
    return np.exp(b)/a

数式と同様に、_xに入力ベクトル、_muに平均ベクトル、_sigに共分散行列を渡すことで、確率密度関数の値を返します。