ウィシャート分布(Wishart Distribution)は、多変量統計学やベイズ推定において、共分散行列や精度行列の確率分布を表現するために使われる重要な分布です。
1次元のガンマ分布が正の実数上の分布であるのに対し、ウィシャート分布は正定値対称行列上の分布です。ガンマ分布を行列に拡張したものと考えることができます。
本記事の内容
- ウィシャート分布の定義
- パラメータの意味と期待値
- ベイズ推定における役割
- Python での可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
ウィシャート分布の定義
$D \times D$ の正定値対称行列 $\bm{A}$ がウィシャート分布に従うとき、その確率密度関数は次のように定義されます。
$$ \begin{equation} \mathcal{W}(\bm{A}|\nu, \bm{\Sigma}) = \frac{|\bm{A}|^{(\nu – D – 1)/2}}{2^{\nu D/2} \pi^{D(D-1)/4} |\bm{\Sigma}|^{\nu/2} \prod_{d=1}^{D} \Gamma\left(\frac{\nu – d + 1}{2}\right)} \exp\left(-\frac{1}{2}\text{tr}(\bm{\Sigma}^{-1}\bm{A})\right) \end{equation} $$
ここで、
- $\nu \geq D$:自由度パラメータ
- $\bm{\Sigma}$:$D \times D$ の正定値対称行列(スケール行列)
- $\text{tr}(\cdot)$:行列のトレース
- $\Gamma(\cdot)$:ガンマ関数
パラメータの意味
自由度 $\nu$
自由度 $\nu$ は分布の集中度を制御します。$\nu$ が大きいほど分布は期待値の周りに集中し、$\nu$ が小さいほど広がりを持ちます。$\nu \geq D$ である必要があります。
スケール行列 $\bm{\Sigma}$
$\bm{\Sigma}$ はウィシャート分布のスケールを決定します。期待値は $\nu \bm{\Sigma}$ に比例します。
期待値と分散
ウィシャート分布 $\bm{A} \sim \mathcal{W}(\nu, \bm{\Sigma})$ の期待値は、
$$ \begin{equation} E[\bm{A}] = \nu \bm{\Sigma} \end{equation} $$
各要素の分散は、
$$ \begin{equation} \text{Var}(A_{ij}) = \nu(\Sigma_{ij}^2 + \Sigma_{ii}\Sigma_{jj}) \end{equation} $$
ウィシャート分布の生成
ウィシャート分布に従う行列は、$D$ 次元ガウス分布からのサンプルを使って構成できます。
$\bm{x}_1, \bm{x}_2, \dots, \bm{x}_\nu$ が独立に $\mathcal{N}(\bm{0}, \bm{\Sigma})$ に従うとき、
$$ \begin{equation} \bm{A} = \sum_{i=1}^{\nu} \bm{x}_i \bm{x}_i^T \sim \mathcal{W}(\nu, \bm{\Sigma}) \end{equation} $$
これは標本共分散行列($N$ 倍したもの)がウィシャート分布に従うことを意味しています。
ベイズ推定における役割
多変量ガウス分布の精度行列(共分散行列の逆行列)$\bm{\Lambda} = \bm{\Sigma}^{-1}$ をベイズ推定する際、ウィシャート分布が共役事前分布として使われます。
尤度が多変量ガウス分布のとき、精度行列の事前分布にウィシャート分布を使うと、事後分布もウィシャート分布になります。
| 尤度 | 事前分布(精度行列) | 事後分布 |
|---|---|---|
| $\mathcal{N}(\bm{x} \mid \bm{\mu}, \bm{\Lambda}^{-1})$ | $\mathcal{W}(\bm{\Lambda} \mid \nu_0, \bm{W}_0)$ | $\mathcal{W}(\bm{\Lambda} \mid \nu_N, \bm{W}_N)$ |
Python での可視化
2次元のウィシャート分布からのサンプリングを可視化しましょう。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import wishart
# パラメータ設定
D = 2
Sigma = np.array([[1.0, 0.5],
[0.5, 1.0]])
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# 異なる自由度でサンプリング
dfs = [3, 10, 50]
for idx, nu in enumerate(dfs):
ax = axes[idx]
n_samples = 1000
samples = wishart.rvs(df=nu, scale=Sigma, size=n_samples)
# サンプルの(0,0)要素と(1,1)要素を散布図で表示
ax.scatter(samples[:, 0, 0] / nu, samples[:, 1, 1] / nu, s=5, alpha=0.3, color='blue')
ax.scatter(Sigma[0, 0], Sigma[1, 1], s=200, marker='*', color='red',
zorder=5, label=f'E[A]/nu = Sigma diag')
ax.set_xlabel('A[0,0] / nu', fontsize=11)
ax.set_ylabel('A[1,1] / nu', fontsize=11)
ax.set_title(f'Wishart (nu={nu})', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)
plt.suptitle('Wishart Distribution Samples (Normalized by nu)', fontsize=14)
plt.tight_layout()
plt.show()
自由度 $\nu$ が大きくなるほど、サンプルが期待値(赤い星印)の周りに集中していく様子が確認できます。
まとめ
本記事では、ウィシャート分布について解説しました。
- ウィシャート分布は正定値対称行列上の確率分布であり、ガンマ分布の行列への拡張
- 自由度 $\nu$ が大きいほど分布は集中し、期待値は $\nu\bm{\Sigma}$
- ガウス分布のサンプルの外積和として生成できる
- ベイズ推定において、多変量ガウス分布の精度行列の共役事前分布として使われる
次のステップとして、以下の記事も参考にしてください。