条件付きガウス分布の導出と期待値・分散をわかりやすく解説

条件付きガウス分布は、多変量ガウス分布の重要な性質の1つです。ガウス過程回帰やカルマンフィルタの導出で不可欠な概念であり、しっかりと理解しておく必要があります。

今回は、条件付きガウス分布の導出や期待値・分散について、分かりやすく解説していきます。

本記事の内容

  • 条件付きガウス分布の公式
  • 精度行列を使った導出
  • 直感的な解釈
  • Python での可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

問題設定

$D$ 次元の多変量ガウス分布を考えます。

$$ \begin{equation} \bm{x} = \begin{pmatrix} \bm{x}_1 \\ \bm{x}_2 \end{pmatrix} \sim \mathcal{N}\left(\begin{pmatrix} \bm{\mu}_1 \\ \bm{\mu}_2 \end{pmatrix}, \begin{pmatrix} \bm{\Sigma}_{11} & \bm{\Sigma}_{12} \\ \bm{\Sigma}_{21} & \bm{\Sigma}_{22} \end{pmatrix}\right) \end{equation} $$

ここで $\bm{x}_1$ は $L$ 次元、$\bm{x}_2$ は $D-L$ 次元です。

$\bm{x}_2$ が与えられたもとでの $\bm{x}_1$ の条件付き分布 $p(\bm{x}_1|\bm{x}_2)$ を求めたいというのが今回の問題です。

条件付きガウス分布の公式

結論を先に示します。条件付き分布 $p(\bm{x}_1|\bm{x}_2)$ はガウス分布になり、

$$ \begin{equation} p(\bm{x}_1|\bm{x}_2) = \mathcal{N}(\bm{x}_1|\bm{\mu}_{1|2}, \bm{\Sigma}_{1|2}) \end{equation} $$

ここで、

$$ \begin{align} \bm{\mu}_{1|2} &= \bm{\mu}_1 + \bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}(\bm{x}_2 – \bm{\mu}_2) \\ \bm{\Sigma}_{1|2} &= \bm{\Sigma}_{11} – \bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}\bm{\Sigma}_{21} \end{align} $$

直感的な解釈

(3) 式の条件付き平均: $\bm{x}_2$ の値が $\bm{\mu}_2$ からずれた分に応じて、$\bm{x}_1$ の期待値が $\bm{\mu}_1$ から修正されます。修正量は $\bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}$ で決まり、これは $\bm{x}_1$ と $\bm{x}_2$ の相関の強さに対応します。

(4) 式の条件付き共分散: $\bm{x}_2$ を観測することで得られる情報分だけ、$\bm{x}_1$ の不確かさが減少します。$\bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}\bm{\Sigma}_{21}$ は $\bm{x}_2$ の観測によって除去される不確かさに対応します。

精度行列を使った導出

精度行列 $\bm{\Lambda} = \bm{\Sigma}^{-1}$ を使って分割すると、

$$ \bm{\Lambda} = \begin{pmatrix} \bm{\Lambda}_{11} & \bm{\Lambda}_{12} \\ \bm{\Lambda}_{21} & \bm{\Lambda}_{22} \end{pmatrix} $$

同時分布の指数部分は、

$$ -\frac{1}{2}(\bm{x} – \bm{\mu})^T \bm{\Lambda} (\bm{x} – \bm{\mu}) $$

$\bm{x}_2$ を定数と見なして $\bm{x}_1$ の関数として整理すると、

$$ \begin{align} &-\frac{1}{2}\bm{x}_1^T \bm{\Lambda}_{11} \bm{x}_1 + \bm{x}_1^T\left[\bm{\Lambda}_{11}\bm{\mu}_1 – \bm{\Lambda}_{12}(\bm{x}_2 – \bm{\mu}_2)\right] + \text{const} \end{align} $$

これを $-\frac{1}{2}(\bm{x}_1 – \bm{\mu}_{1|2})^T \bm{\Sigma}_{1|2}^{-1} (\bm{x}_1 – \bm{\mu}_{1|2})$ の形に比較すると、

$$ \begin{align} \bm{\Sigma}_{1|2}^{-1} &= \bm{\Lambda}_{11} \\ \bm{\mu}_{1|2} &= \bm{\mu}_1 – \bm{\Lambda}_{11}^{-1}\bm{\Lambda}_{12}(\bm{x}_2 – \bm{\mu}_2) \end{align} $$

ブロック行列の逆行列の公式を使うと、$\bm{\Lambda}_{11} = (\bm{\Sigma}_{11} – \bm{\Sigma}_{12}\bm{\Sigma}_{22}^{-1}\bm{\Sigma}_{21})^{-1}$ であることが示され、(3), (4) の公式が得られます。

2次元ガウス分布の具体例

2次元の場合を具体的に計算しましょう。

$$ \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} \sim \mathcal{N}\left(\begin{pmatrix} 0 \\ 0 \end{pmatrix}, \begin{pmatrix} 1 & \rho \\ \rho & 1 \end{pmatrix}\right) $$

$x_2 = a$ が与えられたとき、

$$ \begin{align} \mu_{1|2} &= 0 + \rho \cdot 1^{-1} \cdot (a – 0) = \rho a \\ \sigma_{1|2}^2 &= 1 – \rho \cdot 1^{-1} \cdot \rho = 1 – \rho^2 \end{align} $$

つまり、$p(x_1|x_2=a) = \mathcal{N}(\rho a, 1-\rho^2)$ です。相関 $\rho$ が大きいほど、$x_2$ の値が $x_1$ の予測に強く影響し、条件付き分散は小さくなります。

Python での実装

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal, norm

# パラメータ設定
mu = np.array([1, 2])
Sigma = np.array([[2.0, 1.5],
                  [1.5, 3.0]])

# 条件付き分布の計算
def conditional_gaussian_1given2(x2, mu, Sigma):
    """x2が与えられたときのx1の条件付き分布のパラメータを計算"""
    mu1, mu2 = mu
    S11, S12, S21, S22 = Sigma[0, 0], Sigma[0, 1], Sigma[1, 0], Sigma[1, 1]
    mu_cond = mu1 + S12 / S22 * (x2 - mu2)
    sigma_cond = S11 - S12 * S21 / S22
    return mu_cond, sigma_cond

# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 左: 同時分布と条件付き分布
ax1 = axes[0]
x1_range = np.linspace(-4, 6, 200)
x2_range = np.linspace(-4, 8, 200)
X1, X2 = np.meshgrid(x1_range, x2_range)
pos = np.dstack((X1, X2))
rv = multivariate_normal(mu, Sigma)
ax1.contourf(X1, X2, rv.pdf(pos), levels=20, cmap='Blues', alpha=0.6)

# 条件付き分布を異なるx2の値で表示
x2_values = [-1, 2, 5]
colors = ['red', 'green', 'orange']
for x2_val, color in zip(x2_values, colors):
    mu_c, sigma_c = conditional_gaussian_1given2(x2_val, mu, Sigma)
    ax1.axhline(y=x2_val, color=color, linestyle='--', alpha=0.5)
    # 条件付き分布を横方向に表示
    pdf = norm.pdf(x1_range, mu_c, np.sqrt(sigma_c))
    ax1.plot(x1_range, x2_val + pdf * 3, color=color, linewidth=2,
             label=f'p(x1|x2={x2_val})')
    ax1.axvline(x=mu_c, color=color, linestyle=':', alpha=0.3)

ax1.set_xlabel('x1', fontsize=12)
ax1.set_ylabel('x2', fontsize=12)
ax1.set_title('Joint Distribution and Conditional Distributions', fontsize=12)
ax1.legend(fontsize=9)
ax1.grid(True, alpha=0.3)

# 右: 相関係数による条件付き分散の変化
ax2 = axes[1]
rho_values = np.linspace(-0.99, 0.99, 100)
cond_var = 1 - rho_values**2

ax2.plot(rho_values, cond_var, 'b-', linewidth=2)
ax2.set_xlabel('Correlation rho', fontsize=12)
ax2.set_ylabel('Conditional Variance (1 - rho^2)', fontsize=12)
ax2.set_title('Conditional Variance vs Correlation', fontsize=13)
ax2.grid(True, alpha=0.3)
ax2.axhline(y=0, color='r', linestyle='--', alpha=0.3)

plt.tight_layout()
plt.show()

左のグラフでは、$x_2$ を固定した条件付き分布が同時分布の「スライス」として得られることが視覚的に確認できます。右のグラフでは、相関が強いほど条件付き分散が小さくなることが確認できます。

まとめ

本記事では、条件付きガウス分布について解説しました。

  • 多変量ガウス分布の条件付き分布もガウス分布になる
  • 条件付き平均は観測値に応じて線形に修正され、条件付き共分散は観測値に依存しない
  • 相関が強いほど条件付け変数の情報量が大きく、条件付き分散は小さくなる
  • ガウス過程回帰やカルマンフィルタの導出の基礎となる重要な性質

次のステップとして、以下の記事も参考にしてください。