content相関行列の確率分布「LKJ分布」の可視化Python確率分布StanPyMC3ベイズ推定ベイジアンモデリングをしていると、多変量正規分布の分散共分散行列の事前分布を設定したいというシチュエーションがある。返すような確率分布ではならない。半正定値行列とは固有値が全て0以上の行列のことである。共分散行列がなぜ必ず半正定値行列なのかについての証明はこちらのページが参考になる。methodには適していないらしい。その代わり、相関係数の事前分布である「LKJ分布」を用いることが推奨されている。LKJ分布の確率密度関数は下記の通り。LKJというのは論文の著者3名のイニシャルらしい。parameterと呼ばれている。$Z(\eta)$は正規化定数($f$の全範囲に渡る積分が1になるよう調整するための定数)である。distributionとなる。$\eta$が大きいほど変数間の相関が小さくなり、$\eta$が小さいほど相関が大きくなる。...と言われてもいまいちイメージが湧かない。そこで相関行列を可視化することを考える。\end{pmatrix}$$とした二変量正規分布からサンプルを取得し、グレーの点で表示すると下図のようになる。こちらは相関係数0.8と、2変数の相関の高い例である。このグレーの点の分布の形状を表すために、95%信頼区間を赤線で表している。このように、LKJ分布から得られたサンプル$\Sigma$を用いた二変量正規分布について、赤い楕円をプロットしていけば、相関行列を可視化することができる。0)、共分散行列をLKJ分布からのサンプルとした二変量正規分布の95%信頼区間を表示する。10$のLKJ分布から相関行列をそれぞれ50個サンプリングし、重ね書きしている。$\eta=0.1$の場合は斜めを向いた楕円が多く、相関係数の絶対値が大きい行列が得られやすいことが分かる。distributionなので、相関が高いケースから低いケースまで均等にサンプルが得られている。$\eta=10$の場合は真円に近く、相関係数が低い相関行列が得られやすいことが分かる。通常はLKJ分布から相関行列を直接サンプリングすることはなく、コレスキー分解した行列Lをサンプリングする。コレスキー分解では下三角行列$L$とその転置行列の積で共分散行列を表す。多変量正規分布の計算では共分散行列$\Sigma$の逆行列が必要になるが、その際、コレスキー分解した行列$L$を用いた方が計算が早く数値的にも安定するらしい。Stanのドキュメントにも相関行列のサンプリングは「実行速度が遅く、メモリ消費量が増え、数値上のエラーが発生する危険が高いコードを書きたいときに使う」との記載がある。TFPでLKJ分布からコレスキー分解された相関行列(共分散行列)を得る方法をまとめてみた。sd_dist引数に標準偏差の確率分布を与えることで、共分散行列のサンプリングが可能。コレスキー分解した行列を得るためには、input_output_cholesky=Trueとする必要がある。共分散行列の話がいつの間にか相関行列に変わっているが、例えば二変量の場合、両者は下記のように変換できる。\sigma_2$は各変数の標準偏差、$\sigma_{12}$は共分散、$\rho_{12}$は相関係数である。\end{pmatrix}$$つまり、相関行列に加えて、標準偏差もサンプリングしておくことで、任意の共分散行列が表せることになる。PyMC3のLKJCholeskyCovはこの操作をまとめて行ってくれるので便利そう。可視化に用いたコードはこちら。Probabilityを使用している。upLoginユーザーは見つかりませんでした。