条件付き正規分布(Conditional Gaussian distributions)|改めて理解する多次元正規分布 #2

f:id:lib-arts:20201103221132p:plain

当シリーズは多次元正規分布を改めて理解しようということで進めています。下記などを主に参照しています。

Pattern Recognition and Machine Learning | Christopher Bishop | Springer

上記テキストのSection2-3の"The Gaussian Distribution"を中心に関連文脈の確認を行なっていきます。

参照テキストは2次元に限らない形式で記述されている項目もありますが、多次元に関連する一般的な式で議論するとややこしいので、当シリーズでは基本的に2次元ベースで考えていきたいと思います。
#1では参照テキストのSection2-3の冒頭部を参考に、マハラノビス距離の図的な意味合いを掴みました。

#2では条件付き正規分布(Conditional Gaussian distributions)について確認します。

以下、#2の目次になります。
1. 理論の流れの把握
2. Python実装による確認
3. まとめ


1. 理論の流れの把握
1節では理論の流れについての把握を行います。

f:id:lib-arts:20201103222208p:plain

まずは問題設定の確認から行います。上記では多次元正規分布を仮定した設定になっていますが、2次元とみなして話を見ていくで十分だと思いますので、当記事では基本的に2次元前提で考えていきます。共分散行列(covariance matrix)について取り扱った(2.67)については、共分散行列が対称行列であることから\Sigma_{ba}=\Sigma_{ab}^{T}が成立するとされています(転置が入るのはD-M次元とM次元を考慮しているためです)。

f:id:lib-arts:20201103222939p:plain

次に、式中で共分散行列の逆行列を取り扱う手間を減らすために、上記の(2.68)式のように精度行列(precision matrix)を導入しています。また、(2.69)式では共分散行列の(2.67)式と同様な意味で行列を分割(partition)して考えています。

f:id:lib-arts:20201103223604p:plain

ここまでの定義を元にした際に、マハラノビス距離は上記の(2.70)式のように表すことができます。(2.70)式を\mathbf{x}_{a}の関数と見た際に、二次形式の形になっているので、条件付き分布のp(\mathbf{x}_{a}|\mathbf{x}_{b})正規分布(Gaussian)であろうことがわかります。そこで、議論における目標をp(\mathbf{x}_{a}|\mathbf{x}_{b})の平均と共分散行列を求めることにおく、とここでは記載されています。

f:id:lib-arts:20201103225055p:plain

\mathbf{x}_{a}の二次形式として(2.70)を考えるにあたって、上記の(2.71)式のようにみなして平方完成(completing the square)を考えることで、分布の中心(mean)の導出を行なっています。

f:id:lib-arts:20201103225627p:plain

f:id:lib-arts:20201103225654p:plain

上記の議論で\mathbf{\mu}_{a|b}を(2.75)式において、Λを用いた形で導出しています。(2.75)式ではxの係数が\mathbf{\Sigma}_{a|b}^{-1} \mathbf{\mu}_{a|b}に一致することを用いて導出を行なっています。難しく書かれていますが、計算のイメージとしては(x-a)^2の形に平方完成して、aを平均とみなすという議論を行なっているというだけです。また、\mathbf{\Sigma}_{a|b}については(2.73)式でΛの式で導出されています。

f:id:lib-arts:20201103230951p:plain

(2.73)式と(2.75)式はどちらも精度行列Λを用いて表されているので、これを共分散行列Σの形式にするにあたって、上記は議論を行なっています。結果として、(2.75)式は(2.81)式、(2.73)式は(2.82)式を導出しています。

大まかな議論の流れを抑えることはできましたので、1節はここまでとします。


2. Python実装による確認
2節では1節の内容を具体的な例のPython実装を通して改めて確認を行います。

f:id:lib-arts:20201103221132p:plain

冒頭にもありました上記の再現をPythonを用いて行うというのをここでの目標としたいと思います。下記が問題設定になります。

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

mu = np.array([0.5, 0.5])
sigma = np.array([[1, 0.7], [0.7, 1]])

x, y = np.mgrid[0:1.01:0.01, 0:1.01:0.01]
pos = np.dstack*1
rv = multivariate_normal(mu, sigma)

plt.contour(x, y, rv.pdf(pos), colors='g', linewidths=1)
plt.plot(x, x*0+0.7, color='red')
plt.show()

f:id:lib-arts:20201104151309p:plain

上記の問題において、条件付き正規分布を確認していきます。上記は、\mathbf{\mu} = \left(\begin{array}{c} 0.5 \\ 0.5 \end{array}\right)\mathbf{\Sigma} = \left(\begin{array}{c} 1.0 0.7 \\ 0.7 1.0 \end{array}\right)の2次元正規分布確率密度関数Pythonを用いて図式化したものになります。

ここで(2.81)式と(2.82)式を二次元で解釈すると、
\displaystyle \mu_{x_a|x_b} = \mu_{a} + \frac{\sigma_{ab}}{\sigma_{bb}} (x_{b} -\mu_{b})

\displaystyle \sigma_{x_a|x_b} = \sigma_{aa} - \frac{\sigma_{ab}^2}{\sigma_{bb}}

のようになります。ここに具体的に数字を入れて計算すると下記のようになります。
\displaystyle \mu_{x_a|x_b} = 0.5 + \frac{0.7}{1} (x_{b} - 0.5) = 0.15 + 0.7 x_{b}

\displaystyle \sigma_{x_a|x_b} = 1 - \frac{0.7^2}{1} = 0.51
これを元にPython実装を行います。

f:id:lib-arts:20201104171626p:plain

実行結果は上記のようになります。参照テキストと同様にx_{b}=0.7の際のグラフを赤で記しました。また、青についても参照テキストと同様に平均0.5、分散1の正規分布を描きました。

結果が多少異なって見えるのは参照テキストでは多次元分布を取り扱っているのが大きいと思います(途中で導出ミスがある可能性もありますが、それ以上に2次元と多次元の違いが大きいのではという印象です)。

3. まとめ
#2では条件付き正規分布(Conditional Gaussian distributions)について確認しました。
続く#3では周辺正規分布(Marginal Gaussian distributions)について取り扱っていきます。

*1:x, y