ともにゃん的データ分析ブログ

勉強したことの備忘録とかね

【短編小説】カルバックライブラー・ダイバージェンス

ともにゃんは熱狂的なベイズ教の信仰者である.

とある日,ともにゃんは仕事で,お客さんから仮説検定を使うよう強要され,使用した.

ともにゃんは,ベイズ警察に逮捕されてしまった.禁固10年.カレンダーもなく,外の景色も見れない,温度は通年25度に調整された牢屋で過ごすことになった.

ともにゃん「ああ,僕の人生は終わりだ」

時は流れ,監獄生活も残り3日となった.

ともにゃん「長い監獄生活だった.ところで,いま季節はどうなっているんだろう」

そんな時,刑務官から雪が降っているということ聞いた.

ともにゃん「雪が降っているのか.季節は冬なんだろうな」

ともにゃんは,冬の天気モデル p_{冬} を頭の中で構築した.

ともにゃん「ということは, p_{冬}(天気=晴れ)=\frac{2}{4},\ p_{冬}(天気=雨)=\frac{1}{4},\ p_{冬}(天気=雪)=\frac{1}{4}くらいだろうな.今日は雪が降っているわけだから,情報量としては  -\log_{2}\frac{1}{4} ビットということか.まあまあ驚いたぞ」

次の日の天気は晴れだったそうだ.

ともにゃん「ということは,情報量としては  -\log_{2}\frac{2}{4} ビットということだな.冬は晴れの日が多いし,あんまり驚かないな 」

さらに次の日の天気は雨だったそうだ.

ともにゃん「ということは,情報量としては  -\log_{2}\frac{1}{4} ビットということだな.まあまあ驚いたぞ 」

ともにゃんは刑期を終え,出所した.

ともにゃん「これからは模範的ベイジアンとして頑張っていくぞ!」

気合を入れ直したのもつかの間,ともにゃんは驚いた.

ともにゃん「やっと外に出られた.ってええ!?季節が夏じゃないか!!!」

そう,季節は夏だったのだ.

ともにゃん「おったまげた...一般に,夏季のお天気確率は  p_{夏}(天気=晴れ)=\frac{5}{10},\ p_{夏}(天気=雨)=\frac{4}{10},\ p_{夏}(天気=雪)=\frac{1}{10} だ.つまり僕は,情報量の意味で平均的に 1.5 ビット驚いたわけか!!!」

 夏季と冬季の天気交差エントロピー = -p_{夏}(天気=晴れ) \log_{2}p_{冬}(天気=晴れ) \\
\qquad -p_{夏}(天気=雨) \log_{2}p_{冬}(天気=雨) \\
\qquad -p_{夏}(天気=雪) \log_{2}p_{冬}(天気=雪) \\
\qquad = 1.5

ともにゃん「待てよ?もし刑務所の中で今の季節が夏だと分かっていたら,刑務官から天気を聞いた時に,平均的にどれくらい驚いたんだろう?計算してみると...約1.36ビットだ!」

 夏季の天気エントロピー = -p_{夏}(天気=晴れ) \log_{2}p_{夏}(天気=晴れ) \\
\qquad -p_{夏}(天気=雨) \log_{2}p_{夏}(天気=雨) \\
\qquad -p_{夏}(天気=雪) \log_{2}p_{夏}(天気=雪) \\
\qquad \simeq 1.36

ともにゃんは,あることに気がついた.

ともにゃん「そういえば,カルバックライブラー・ダイバージェンス(KLD)(相互情報量)は 夏季と冬季の天気交差エントロピー から 夏季の天気エントロピー 引いたものだ.そうか!KLDは僕が考えたモデルが情報量の平均(エントロピー)の意味で,あとどれだけ驚き度,つまり不確実性(情報量)を減らせるかを表したものなんだ!!今回でいうとKLDは約0.14ビット.これだけ不確実性を減らすことができるんだなあ」

こうしてともにゃんは,KLDを情報量の意味から理解したのであった.めでたしめでたし.


解説

要するに,エントロピーは,驚きや不確実性(  \log_{2}p_{夏}(天気) )の発生源が想定通りだった場合(  p_{夏}(天気) ),交差エントロピーは,驚きや不確実性(  \log_{2}p_{冬}(天気) )の発生源が想定通りでなかった場合(  p_{夏}(天気) )の平均情報量,ってことなのかな.

分散共分散行列を分散の項と相関係数の項に分解する

ベイズ推定を行う際,パラメータもしくは潜在変数に多変量正規分布を事前分布として設定したい場合があります.その際,分散共分散行列の事前分布は非常に重要です.多くの場合,一様分布などの無情報事前分布を分散共分散行列に設定すると,MCMCが収束しないことがあります.データのみから分散共分散を推定するのは一般に難しいタスクなのです.

この場合,正規分布の分散共分散行列の共役事前分布である(逆)ウィシャート分布を事前分布として設定することが多いですが,慣れていないと(逆)ウィシャート分布の取り扱いは難しいと感じています.

したがって分散共分散行列に工夫して事前分布を設定したいというモチベーションが湧きます.分散(分散共分散行列の主対角成分)への事前分布の設定は比較的直感的にできます.なぜなら多くの分析者にとって分散という量は非常に馴染み深いからです.

しかしながら,個人的に共分散への事前分布の設定は難しいように感じます.2つの変数の共分散が大きければ,それらの(線形)関係が強いことはわかりますが,値は正規化されておらず,どのくらいの値を取っていればどうなのかということはデータによって様々であり,直感的に理解しづらい部分があるように思います.一方で相関は-1から1までの値を取る量であり,共分散と違って値を見ればそれら変数間の(線形)関係を直感的に理解することができます.

そこで,分散共分散行列に直接事前分布を設定するのではなく,分散共分散行列を分散行列と相関係数行列の直感的に理解しやすい2つの量に分解し,それぞれに事前分布を設定することを考えてみます.

 d 次元確率変数  X_{i},\ i=1,\ldots,d の分散共分散行列を  \Sigma とします.

天下り的に次のような分散共分散行列分解を考えてみます:

 \begin{align*}
\Sigma = \text{diag}((\sigma_{1},\sigma_{2},\ldots,\sigma_{d})^{T}) \cdot \Omega \cdot \text{diag}((\sigma_{1},\sigma_{2},\ldots,\sigma_{d})^{T})
\end{align*}

ここで,  \text{diag}(\cdot) は引数のベクトルを主対角成分に持つ対角行列です.また  \Omegad \times d の対称行列で,その  (i,j) 成分を  \rho_{ij} とします.

 \sigma_{i}^{2} は確率変数  X_{i} の分散を,  \Omega X_{i},\ i=1,\ldots,d相関係数行列をそれぞれ"想定"していますが,ここではまだこの行列分解によって  \sigma_{i}^{2} が分散を,  \Omega相関係数行列を表しているのかは定かではありません.

したがって計算によって,上記が正しいことを示します.

上記の式を書き下していくと,次のようになります:

 \begin{align*}
\Sigma &= \text{diag}((\sigma_{1},\sigma_{2},\ldots,\sigma_{d})^{T}) \cdot \Omega \cdot \text{diag}((\sigma_{1},\sigma_{2},\ldots,\sigma_{d})^{T}) \\
& = 
\begin{pmatrix}
\sigma_{1} & 0 & \ldots & 0 \\
0 & \sigma_{2} & \ldots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \ldots & \sigma_{d}
\end{pmatrix}
\begin{pmatrix}
1 & \rho_{12} & \ldots & \rho_{1d} \\
\rho_{21} & 1 & \ldots & \rho_{2d} \\
\vdots & \vdots & \ddots & \vdots \\
\rho_{d1} & \rho_{d2} & \ldots & 1
\end{pmatrix}
\begin{pmatrix}
\sigma_{1} & 0 & \ldots & 0 \\
0 & \sigma_{2} & \ldots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \ldots & \sigma_{D}
\end{pmatrix} \\
&=
\begin{pmatrix}
\sigma_{1} & 0 & \ldots & 0 \\
0 & \sigma_{2} & \ldots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \ldots & \sigma_{d}
\end{pmatrix}
\begin{pmatrix}
\sigma_{1} & \sigma_{2}\rho_{12} & \ldots & \sigma_{d}\rho_{1d} \\
\sigma_{1}\rho_{21} & \sigma_{2} & \ldots & \sigma_{d}\rho_{2d} \\
\vdots & \vdots & \ddots & \vdots \\
\sigma_{1}\rho_{d1} & \sigma_{2}\rho_{d2} & \ldots & \sigma_{d}
\end{pmatrix} \\
& =
\begin{pmatrix}
\sigma_{1}^{2} & \sigma_{1}\sigma_{2}\rho_{12} & \ldots & \sigma_{1}\sigma_{d}\rho_{1d} \\
\sigma_{2}\sigma_{1}\rho_{21} & \sigma_{2}^{2} & \ldots & \sigma_{2}\sigma_{d}\rho_{2d} \\
\vdots & \vdots & \ddots & \vdots \\
\sigma_{d}\sigma_{1}\rho_{d1} & \sigma_{d}\sigma_{2}\rho_{d2} & \ldots & \sigma_{d}^{2}
\end{pmatrix}
\end{align*}

ここで,  X_{i},\ X_{j},\ i,j=1,\ldots,d について  \text{Var}(X_{i})=\sigma_{i}^{2} \text{Cov}(X_{i},X_{j}) = \sigma_{i}\sigma_{j}\rho_{ij} となっています.

以上から  \sigma_{i}^{2} が確率変数  X_{i} の分散になっていることが確認できました.

また,相関係数の定義から

 \begin{align*}
\text{Cor}(X_{i},X_{j}) &= \frac{\text{Cov}(X_{i},X_{j})}{\sqrt{\text{Var}(X_{i})}\sqrt{\text{Var}(X_{j})}} \\
&= \frac{\sigma_{i}\sigma_{j}\rho_{ij}}{\sigma_{i}\sigma_{j}} = \rho_{ij}
\end{align*}

となり, 行列  \Omega (i,j) 成分  \rho_{ij} が確率変数  X_{i},\ X_{j}相関係数になっていることも確認できました.

以上で,最初に記した行列分解によって,分散共分散行列が分散行列と相関係数行列に分解できることが確認できました.

例えば,分散には逆ガンマ分布や半コーシー分布を,相関係数行列には一様分布やLKJ相関分布などを設定することができます.

LKJ相関分布については,例えば こちら を参考にしてみてください.

【R】交差検証用に検証用データのインデックスをリストで返す関数

交差検証を実施する際、データセットをn分割する必要があります。
そしてそれぞれが1回だけ検証用データとして扱われます。
以下の関数は、検証用データのインデックスをn個リストとして返す関数です。

dataが使用するデータセット、cv_nがn-fold Cross Validationをするときのnを意味しています。

create_cv_test_index <- function(data, cv_n=5){
  idx <- seq(1, nrow(data))
  n <- round(nrow(data)/cv_n)
  cv_idx_list <- list()
  for(i in 1:cv_n){
    if(i != cv_n){
      cv_idx_tmp <- sample(idx, size=n, replace=FALSE)
      cv_idx_list[[i]] <- cv_idx_tmp
      idx <- idx[!(idx %in% cv_idx_tmp)]
    } else {
      cv_idx_list[[i]] <- sample(idx, size=length(idx), replace=FALSE)
    }
  }
  return(cv_idx_list)
}

離散選択理論入門(その2)

はじめに

前回の記事からかなり期間が空いてしまいました。

今回は離散選択理論入門の第2段。ロジット確率の導出とそれらの性質について見ていきます。


Logitモデルの導出

今現在、広く用いられている離散選択モデルとしてロジット(Logit)モデルがあります。ロジスティック回帰を皆さんよく使ってますよね?それです。

選択確率の一般形は

 \begin{eqnarray*}
P_{ni} &=& \int_{\epsilon}I(\epsilon_{nj} - \epsilon_{ni} < V_{ni} - V_{nj}\ \forall j \neq i)f(\epsilon_{n})d\epsilon_{n}\\
&=& \int_{\epsilon}I(\epsilon_{nj} < \epsilon_{ni} + V_{ni} - V_{nj}\ \forall j \neq i)f(\epsilon_{n})d\epsilon_{n}
\end{eqnarray*}

で表されるのでした。

続きを読む

離散選択理論入門(その1)

はじめに

最近、大学院時代に読んでいた

Discrete Choice Methods with Simulation

Discrete Choice Methods with Simulation

を読み直しています。やっぱり面白いです。でも忘れてることも多いです。

ということで簡単にまとめるついでに、離散選択理論入門というシリーズで記事を書いていこうと思います。


離散選択理論とは

人々は日々意思決定をしています。意思決定にも、決定するものの種類によって色々考えられますが、身近な例としては物を買うという行為も意思決定のひとつです。
物を買うという行為は、いくつかの選択肢の中(商品群)の中から買うのもを選びます。このとき、選択肢は離散的な、つまりカテゴリカルなものとなっています。このように、離散的な選択肢の中からあるものを選択するという行為を離散選択と呼びます。そして、なぜそれを選択したのか?それを分析する道具として離散選択理論があります。そこで用いられる代表的なモデルとしては、ロジスティック回帰モデルがよく知られています。

続きを読む