July 12, 2008

隠れマルコフモデルの例

隠れマルコフモデルの例 その2
Pythonで隠れマルコフモデルのFilteringの例
Pythonで隠れマルコフモデルのSmoothingの例

隠れマルコフモデルとは、システムがパラメータのわからないマルコフ性を持つとする確率モデルです。マルコフ性とはその過程の将来状態の条件付き確率分布が、現在の状態のみにより決まり、過去のどんな状態にもよらないという特性のことです。ここではこのモデルの例を記します。

ある友達が遠くに住んでいて、毎日何をしたかをあなたに電話で話します。友達は「散歩」「買物」「掃除」の3つのことにしか関心がありません。友達が何をするかはもっぱらその日の天気で決めます。あなたは友達が住んでいるところの天気の明確な情報は持っていません。でも、どんな傾向があるかは知っています。友達が日々電話で話す出来事に基づいて、友達が住んでいるところの天気を推定してみましょう。

天気は離散マルコフ連鎖に従うと考えます。たとえば今日雨だったら明日晴れの確率は30%、雨の確率は70%といったように。天気には「雨(Rainy)」「晴れ(Sunny)」の2つの状態があるとします。ただし、これらを直接観測することはできません。すなわち、これらの状態は『隠れ(hidden)』ています。友達はその日の天気に従って「散歩(walk)」「買い物(shopping)」「掃除(cleaning)」のいずれか1つだけ行動をとります。友達はその行動を教えてくれるので、これらは観測(observations)となります。この全体のシステムは隠れマルコフモデル(HMM; a hidden Markov model)的となります。

あなたはこのエリアの一般的な天気の傾向と友達は平均としてどのような行動をとるかということは知っています。言い換えれば、HMMの変数は分かっているということです。Pythonを用いてこれらは次のように表せるとします。
states = ('Rainy', 'Sunny')
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
    }
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
    }

状態遷移図で表すと下図のようになります。


start_probability (初期確率)は友達が最初に話したときのHMMにおける信念(breif)を表します(知っているのはちょっと雨が降りやすいっていうことだけ)。ちなみにこの確率分布は定常状態ではありません。ここで与えられた遷移確率に従うとすれば、定常状態ではだいたい {'Rainy': 0.571, 'Sunny': 0.429}となります(→遷移行列の固有ベクトル)。

transition_probability (遷移確率)はマルコフ過程においてどのように天気が変化するかということを表します。この例では、もし今日「雨」だったら明日「晴れ」になる確率は30%しかないということを示します。

emission_probability (出力確率)は、ある天気のときに友達はどんな行動をとるかということを表します。もし「雨」だったら50%の確率で「掃除」をする、もし「晴れ」だったら60%の確率で「散歩」をするということを示します。

さて、たとえば、友人が初日に「散歩」二日目に「買い物」三日目に「掃除」という順で行動したら、その観測結果が得られる確率はいくらか、そして、このような観測結果がえられたとき三日間の天気はどのようであったか、ということが疑問になります。


http://en.wikipedia.org/wiki/Hidden_Markov_model
http://en.wikipedia.org/wiki/Viterbi_algorithm


(つづく)
隠れマルコフモデルの例 その2

(隠れマルコフモデルを用いた状態推定の例)