Sunday, December 30, 2012

statistic modeling: EM algorithm example with 1D mixed normal distribution

EMアルゴリズムの実装。

PRMLでは2次元の正規分布を例として扱っている。

この式は\frac{1}{(\sqrt{2\pi})^m \sqrt{|S|}}\exp\!\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^{T}S^{-1}(\mathbf{x}-\boldsymbol{\mu})\right)

が、ここではよりシンプルにするためにx軸のみ、つまり1次元のものを使う。

この式はf(x)=\frac{1}{\sqrt{2\pi\sigma^{2}}} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2} \right)


コードは以下のようになった。

# -------------------------------------------------
#  descripton
#     name : 1d normal distribution
# -------------------------------------------------

# ***********************
#   sub functions
# ***********************

# normal distribution
# same as dnorm() but using var instead of sd
normDist <- function(X,mu,vari) {
 1/sqrt(2*pi*vari)  *  exp( - (X-mu)^2 / (2*vari) )
}

# log liklifood (posterior probability)
logLikelihood <- function(X, mu, vari, Pi, K)
{
  Sum <- 0.0
  N <- length(X) # number of data
  for(n in 1:N)
  {  
    tmp <- 0.0
    for(k in 1:K)
    {
      tmp <- tmp + ( Pi[k] * normDist(X[n],mu[k],vari[k]) )
      # Note: "log" computes natural logarithms
    }
    Sum <- Sum + log(tmp)
  }

  return(Sum)
}


# ***********************
#   main computation
# ***********************

# -----------------------
#   Prepare data
# -----------------------
# load Old Faithful dataset, and normalize
data("faithful");
xx <- scale(faithful, apply(faithful, 2, mean), apply(faithful, 2, sd));
X <- xx[,1] # take only the first column this time.
X <- scale(X) # normalize, so that mean is 0 and var is 1. (why necessary?)
N = length(X)

# nb of distribution
K <- 2

# initialize the parameters
mu <- 0
# Note: vari <- mat.or.vec(1,K) can make zero matrix but in R 
# increasing the array length in loops is OK, so it is not necessary 
# to write like this.
increment <- 2/(K-1) # 2 is from 1 - (-1)
for(k in 1:K)
{
  # separately distribute between (-1, 1)
  mu[k] <- -1 + increment*(k-1)
}

vari <- 0
for(k in 1:K)
{
  # set to 1 for all distribution
  vari[k] <- 1
}

Pi <- 0
for(k in 1:K)
{
  Pi[k] <- 1/K
}

# for analysis
mu_initial <- mu
Pi_initial <- Pi

# prepare responsibility
resp <- mat.or.vec(N,K)

# compute initial log likelihood
like <- logLikelihood(X, mu, vari, Pi, K)

# initialize
likearray <- 0

nbIteration <- 1
while(1)
{
# -----------------------
# E-step:
#   compute the responsibility with the current parameters
# -----------------------
for(n in 1:N)
{
    # prepare denominator
    denominator = 0
    for(k in 1:K)
    {
     denominator <- denominator + Pi[k] * normDist(X[n], mu[k], vari[k])
    }

    # compute responsibility
    for(k in 1:K)
    {
     resp[n,k] <-  Pi[k] * normDist(X[n], mu[k], vari[k]) / denominator
    }
}

# -----------------------
# M-step:
# recompute the parameters with the computed responsibility.
# -----------------------

# initialize
mu_new <- 0
vari_new <- 0 
Pi_new <- 0

for(k in 1:K)
{
  # compute Nk
  Nk <- 0.0
  for(n in 1:N)
  {
    Nk <- Nk + resp[n,k]
  }
                                          
  # recompute mean
  mu_new[k] <- 0.0
  for(n in 1:N)
  {
    mu_new[k] <- mu_new[k] + resp[n,k] * X[n]
  }
  mu_new[k] <- mu_new[k]/Nk
  
  # recompute variance
  vari_new[k] <- 0.0
  for(n in 1:N)
  {
   vari_new[k] <- vari_new[k] + resp[n, k] * (X[n]-mu_new[k])^2
  }
  vari_new[k] <- vari_new[k]/Nk                                        
  
  # recompute mix ratio
  Pi_new[k] <- Nk/N
}   


# -----------------------
# judge of convergence
# -----------------------
like_new <- logLikelihood(X, mu_new, vari_new, Pi_new, K)
Diff <- like_new - like

# debug
likearray[nbIteration] <- like 

like <- like_new
mu <- mu_new
vari <- vari_new
Pi <- Pi_new

#if(nbIteration == 20)
if(Diff < 0.01)
{ 
  # print
  cat("nb of iteration", nbIteration, "\n")

  for(k in 1:K)
  {
  cat( "**** distribution", k, "****", "\n") # paste() is not necessary
  cat( "mean: ", mu[k], "\n")
  cat( "variance: ", vari[k], "\n")
  cat( "pi: ", Pi[k], "\n", "\n")   
  }
  break
}

nbIteration <- nbIteration + 1
} # close "while(1)"



# ***********************
#   Dispaly
# ***********************

# -----------------------------------
#   likelihood conversion bihavoir
# -----------------------------------
windows()
plot(likearray, type="o")
title("likelihood bihavoir")

# -------------------------------------------------------
#   original data and the estimated mixed distribution
# -------------------------------------------------------
windows()
hist(X, breaks=seq(-3,3,0.2), xlim=c(-3,3), ylim=c(0,1), freq=FALSE, 
      main="", xlab="", ylab="")
a <- seq(-5,5,length=1000)
for(k in 1:K)
{
par(new=T)
plot( a, dnorm(a, mu[k], sqrt(vari[k]))*Pi[k], xlab="", ylab="",
      xlim=c(-3,3), ylim=c(0,1), type="l", col=k+1)
}
title(main="data and estimation", xlab="x", ylab="density")

(Rのコンソールに直接張り付ければ良い)

結果は



nb of iteration 14
**** distribution 1 ****
mean:  -1.286364
variance:  0.04316987
pi:  0.3488136

**** distribution 2 ****
mean:  0.6890519
variance:  0.1457242
pi:  0.6511864

log likelihood収束のようす



  • 初期値の影響
Piの初期値が悪い(見た限りたして1以上になる場合)と、最初のiterationでは尤度は下がり、収束条件に引っかかってしまう。

muの初期条件で、十分に離れているものをとると、尤度は単調に増加し、早く収束する。(ここではPiは0.5, 0.5としている)
左: 0.979, 0.011
右: 0.516, 0.861
わかるように、muは均等に配分することで、ずっと早く収束する(コード参照)。


c( rnorm(400, 10, 2), rnorm(100, 2,1) )

  • 参考サイト
Pattern Recognition and Machine Learning: Data Sets
Example 8.41: Scatterplot with marginal histograms (function of the plot with histogram)
R: 24. apply() ファミリー(このせつめい十分)
多変量正規分布(pdf)
混合ガウスモデルとEM(コードはこれをもとにした)
EMアルゴリズム答え合わせ(こちらも少し参考に)
EMアルゴリズムによる混合分布のパラメーター推定の解析計算&実装例 from 「Rによるモンテカルロ法入門」(下のリンクとスライドを参考にした)
都市生活学・ネットワーク行動学研究室のPRML合宿2009(良く見ていないがまとまっていそう)
PRML 読書会 #12 9章 EMアルゴリズム&10章 変分ベイズ(下に英語pdfリンク)


Friday, December 28, 2012

Statistic modeling : EM algorithm

モデルの推定方法-EM algorithmの部分についてのまとめ。(サイトからのつぎはぎ)

ある確率変数 X = {Y , Z} があり,その一部 Y のみが観測でき,残り Z (=潜在変数。下に説明)は観測できない状況を考える.観測データ {y1, y2, . . ., yT } が得られたときに,確率モデル p(x; θ) = p(y, z; θ)のパラメタ θ を推定したいとする(取り扱っている分布が、混合ガウス分布であればθはμ,Σ,πの3つ)。パラメータは、Xの分布からして、最もよさげなもの、というふに考える(最尤法)。p(y; θ) =∫p(y, z; θ)dz


最尤推定値を数値計算で求める代表的な方法
1.ニュートン・ラプソン法
2.Fisherのスコア法
3.EM algorithm

とあるが、Zの存在のために、これが簡単に解けず、EMアルゴリズムを使う(1や2では無理?)。モデルが混合分布でない場合は、このサイトで示しているように、反復なしで解がもとまる。


ステップ0.尤度関数をつくる
最初に、現象を式で表す必要がある。
観測された現象の起こる確率、イコール、観測されたデータについての尤度関数Lをつくる。

Given a statistical model consisting of a set \mathbf{X} of observed data, a set of unobserved latent data or missing values \mathbf{Z}, and a vector of unknown parameters \boldsymbol\theta, along with a likelihood function L(\boldsymbol\theta; \mathbf{X}, \mathbf{Z}) = p(\mathbf{X}, \mathbf{Z}|\boldsymbol\theta), the maximum likelihood estimate (MLE) of the unknown parameters is determined by the marginal likelihood of the observed data
L(\boldsymbol\theta; \mathbf{X}) = p(\mathbf{X}|\boldsymbol\theta) = \sum_{\mathbf{Z}} p(\mathbf{X}, \mathbf{Z}|\boldsymbol\theta)
However, this quantity is often intractable(解決困難)[citation needed].
The EM algorithm seeks to find the MLE of the marginal likelihood by iteratively applying the following two steps:


ステップ1.E step
Eステップでは、完全データの対数尤度関数ln p(X, Z|θ)の期待値を計算する。 最初の試行ではθに初期値を与える必要がある。また、この期待値を計算するために、潜在変数の事後分布p(Z|X, θold)を用いる。

対数尤度関数の期待値、という概念が分かりにくいので、追加説明。
確率論において、確率変数の期待値とは確率と確率変数を掛けた総和を取ったものである(高校数学)。ここでは、確率変数がln p(X, Z|θ)であり、その確率変数が出る確率が、p(Z|X, θold)となる。

wikiでは、
1/ Expectation step (E step): Calculate the expected value of the log likelihood function, with respect to the conditional distribution of \mathbf{Z} given \mathbf{X} under the current estimate of the parameters \boldsymbol\theta^{(t)}:
Q(\boldsymbol\theta|\boldsymbol\theta^{(t)}) = \operatorname{E}_{\mathbf{Z}|\mathbf{X},\boldsymbol\theta^{(t)}}\left[ \log L (\boldsymbol\theta;\mathbf{X},\mathbf{Z})  \right] \,
となっているが、

この表現よりもPRML(equation 9.30, p156)の方が分かりやすい。つまり、

Q(θ, θold) = Σ p(Z|X, θoldln p(X, Z|θ)


ステップ2.M step
Mステップでは、E ステップで求まった尤度の期待値を最大化するようなパラメータを求める。 M ステップで求まったパラメータは、次の E ステップで使われる潜在変数の分布を決定するために用いられる。
具体的には、θ偏微分した式イコール0となる等式を解く。

2/ Maximization step (M step): Find the parameter that maximizes this quantity

\boldsymbol\theta^{(t+1)} = \underset{\boldsymbol\theta}{\operatorname{arg\,max}} \ Q(\boldsymbol\theta|\boldsymbol\theta^{(t)}) \,  


*不完全データ(または隠れ変数、潜在変数)
通常Zで表す。
一般的にZとは、観測できている確率変数Xと区別される、観測できてない確率変数(XとZは対等)。とくに混合分布では、あるデータがどの分布に属するかという情報(ここではとりあえずこの意味に限る)。この場合、zは各xに与えられるK次元ベクトル(Kを分布の数)で、データxがどのガウス分布から生成されたかを表す。属する分布番号のみ1、他は0。

例1.2 次元の正規分布が 6 つ重なった正規混合分布を例に考えよう.この確率分布からデータが得られているとする.この場合,出力されるデータのみからはどの正規分布によって出力されたかが分らない.すなわち,どの正規分布から出力されたかという情報は観測できない.この「どの正規分布から発生したか」という情報が隠れ変数となる.正規混合分布の場合は隠れている確率変数は離散的な確率変数である.


例2今、何カ国かの男性の身長データのサンプルがN個混在してあります。ただし、N個のデータはすべて、どの国の男性の身長データなのか分かっていません(不完全データ)。このとき、EMアルゴリズムを用いて、「何カ国のデータが混在しているのか※1」と、「各国の身長の平均値と分散※2」を同時に求めたいのですが、・・・(省略)



  • 参考本(つぎはぎ元)

パターン認識と機会学習(下) Pattern recognition and machine learning
図解 ベイズ統計学
  • 参考サイト(つぎはぎ元)
多くのサイト(とくにpdfでないもの)はPattern recognition and machine learning (PRML)の9.2章をかみ砕いて解釈したもの、またはそれをコードで実装したもの。

- 説明
対数尤度と最大対数尤度(◎ 対数尤度の説明がスマート。pdf)
最尤推定値を数値計算で求める代表的な方法(あまり丁寧ではない。数式。pdf)
隠れ状態最尤推定と反復解法(◎丁寧な数学的説明、直感的イメージ。pdf)
wikipedia (english) (上の英語の部分)
wikipedia (japanese)

- シンプルな分布の例(M stepが単純)

- コード付き例
混合正規分布でy=ax+uのモデルの場合の最尤法
混合ガウス分布Sage(PRMLに沿って)
『計算統計学の方法 』読書ノート;EMアルゴリズムの練習問題(入門編)(Zは潜在変数ではなく、欠損値なのでシンプル。実際的な数式。)
混合ガウスモデルとEM(PRMLに沿って。解説が丁寧)
EMアルゴリズムによる混合分布のパラメーター推定の解析計算&実装例 from 「Rによるモンテカルロ法入門」(リンクが良い。pythonで実装。ヒストグラム)

- 数学

- その他
混合分布問題(混合分布推定のレビュー)


Wednesday, December 26, 2012

Statistic modeling : introduction

Statistic model(確率モデル)の推定の代表的手順。

1.モデルの推定 : EM algorithm を使う。このとき、パラメータの数を与える必要がある。
2.モデルの評価 : BIC を使う

混合数を低い値から始めて、徐々に増加させていきながら、EMアルゴリズムでモデルを推定し、そのBICの値を計算します。

1.モデルの推定
EMアルゴリズムは反復法の一種であり、期待値(英語expectation, E) ステップと最大化 (英語maximization, M)ステップを交互に繰り替えすことで計算が進行する。 観測不可能な潜在変数に確率モデルが依存する場合に用いられる。Eステップでは、現在推定されている潜在変数の分布に基づいて、モデルの尤度の期待値を計算する。 Mステップでは、E ステップで求まった尤度の期待値を最大化するようなパラメータを求める。 M ステップで求まったパラメータは、次の E ステップで使われる潜在変数の分布を決定するために用いられる。
Wiki (jp)

2.モデルの評価
さて、情報量規準といっても様々なものがあるが、多くの教科書で取り上げられているように、赤池情報量規準(AIC)とベイジアン情報量規準(BIC)がもっとも頻繁に使われているものである。この二つの情報量規準の定義は、以下のように与えられる。
AIC=T*log(s2)+2*K,   BIC=T*log(s2)+K*log(T).
ただし、Tは標本の大きさ、s2はモデルの誤差項の分散推定量で、Kはモデルに含まれる係数の数である(教科書によっては、両辺をTで割って定義することもある)。すなわち、様々なモデルを最小2乗法で推定し、その残差から分散推定量s2が得られれば、AICやBICは簡単に求めることができ、情報量規準を最小化するモデルを選択してやればよいのである。

情報量基準はEMアルゴリズムとだけではなく、k-means法とも使われている。ここここで紹介されているように、これをx-means法とよぶ。


  • 参考サイト

モデル選択とその周辺(統計モデルのレビュー。AICやbootstrapにも言及。 pdf)

統計学におけるモデル―情報量基準の観点から―(◎モデル選択のレビュー。BIC, AICについて。pdf)
ベイズ情報量規準(概要)
尤度とAIC(タイトルのまま)