[状態空間モデル]ローカルレベルモデルとは

Posted: , Category: 時系列分析 , 機械学習

ローカルレベルモデルは、時系列解析や現在制御における状態空間モデルのもっとも現象がシンプルになるような設定や仮定をおいたモデルです。別名、ランダムウォーク・プラス・ノイズ・モデルとも呼ばれています。

今回は状態空間モデルのもっとも基本的で簡単な問題設定である、ローカルレベルモデルについて分かりやすく解説します。

この記事では、まずローカルレベルモデルの前提となっている状態空間モデルについて簡単に説明し、その後状態空間モデルの1つの一例としてローカルモデルレベルについてできるだけ噛み砕いて分かりやすく解説していきます。

ローカルレベルモデルは簡単な設定で非常にシンプルですが、実際に状態方程式と観測方程式から、観測値が与えられた上で、状態量の条件付き確率や観測値の予測の確率分布を導出することは、一番最初に状態空間モデルを学ぶ段階では、かなり骨の折れる作業です。

しかしローカルレベルモデルの前提となっている状態空間モデルは応用範囲も非常に広く、実際に現代制御や機械学習で登場するような、一般的な線形動的システム(LDS)や場合によっては非線形システムなどの、状態空間モデルにおける発展的な手法の理解の足がかりになると思います。

今回の記事はある程度、ローカルレベルモデルの理論的な面について解説はします。

実際にPythonを用いた、ローカルレベルレベルのフィルタリングや予測分布の実装や、ローカルレベルモデルを用いた異常検知手法などの実装は別の記事で解説しているので、ぜひサイト内のリンクを参照してみてください。

一度、ここで本記事の目的を掲載します。

本記事の内容と目的
  • 状態空間モデルの概念を理解する
  • 状態空間モデルの一番簡単な問題設定である、ローカルレベルモデルについて理解する
  • ローカルレベルモデルにおける、フィルタリング、予測分布のアルゴリズムについて理解する

なかなか盛りだくさんの内容ですが、1つ1つやっていきましょう。

ローカルレベルモデルの前提となる状態空間モデルとは

まず、ローカルレベルモデルの話をする前に、前提となっている状態空間モデルについて簡単に触れておきます。

状態空間モデルは、現代制御や機械学習の発展的な話題として登場し、現在でも様々な分野で応用・研究されている手法です。

金融、マーケティングといったビジネスだけでなく、プラントやロケット、人工衛星や探査機といった宇宙機の制御などにも利用されていますし、機械学習や統計の時系列分析で非常に研究開発が盛んに行われています。

今回は、時系列分析を対象にローカルレベルモデルの話を進めていきます。

状態空間モデルは、時系列データ$\bm{Y} = \{ y_1, y_2, \dots, y_t \}$に対して、その時系列が生起する原因があると仮定したモデルです。

例えば、時系列データ$\bm{Y}$がある地域の降水量だとしましょう。雨が降るには、季節だったり、その日の雲の量や、湿度、 または前日に雨が降ったかどうか、など様々な要因があり、その要因が複合的に絡み合って、ある時刻$t$の降水量$y_t$が決定されるはずだ。と、仮定するようなモデルになります。

また実際に複数の要因以外にも、考慮できていない要因があると考えられるので、考えられている要因以外の成分もあるはずだと考えます。

また、実際には雨の降水量を測定する際には、何らかのセンサーや仕掛けを使うことになりますが、その測定における誤差もあるはずだと考えます。

まとめると、状態空間モデルでは、実際に観測している降水量$\bm{Y}$が、以下の3つの成分によって、構成されていると考える手法です。

状態空間モデルにおける3つの成分

今考えている、時系列$\bm{Y} = \{ y_1, y_2, \dots, y_t \}$が雨の降水量の測定値だとすると、その時系列を生成しているのは次の3つの要素だと考える

1. 降水量という形では目に見えない要因

雲の量や、湿度、 または前日に雨が降ったかどうか、その土地の緯度経度など、観測値では与えられないが、その原因と考えられる要因

2. 1以外の無視はできないが、実際に存在するであろう要因

1で考慮できていない原因があるかもしれないので、それを誤差成分とする。システム誤差と呼んだりする。

3. 観測センサーや観測の仕組みに起因する誤差

雨量だったら雨量計、温度だったら温度計の誤差に起因するであろう誤差。これを観測誤差や測定誤差などといったりする

いきなりこのような情報を提示されても、納得できたような、できないような感じだと思います。

実際には、上記の1~3以外の要素もモデルに入れることができまずが(外部入力など)、今回はローカルレベルモデルの解説記事なので、出来るだけ簡潔に説明する都合上、不必要な項目は省いています。

ここまでは、こんなものか、という感じで呼んでくれれば良いです。

さらに、状態空間モデルが仮定している、重要な仮定であるマルコフ性について説明します。

状態空間モデルが仮定するマルコフ性

状態空間モデルでは、マルコフ性という「現在の値は前回の状態のみによって決定される」というかなり強い仮定を前提としています。

例えば、上の図における、観測値$y_4$は前回の状態量$z_4$だけに起因し、それ以外はどのようなものにも影響を受けないというような仮定をおいています。この仮定を入れることで、以降で取り扱う確率分布の計算が簡潔にできるようになり、状態空間モデルを実用的なものにならしめています。

先ほどの降水量の例だと、今の時点の降水量は、今の状態と誤差成分によって決まってしまう、という過程を入れていることになります。実際、これらの仮定は非常に制約が強いものだと思われるかもしれませんが、現在の状態は、、過去の観測値からの情報が全て状態に入っていると解釈することで、比較的多くの時系列パターンを表現することができます。

といって、この話も実際に確率分布の計算をするまでは、この制約の重要性に気づくことは難しいので、そんなものかーと思ってもらえれば大丈夫だと思います。

一般的な状態空間モデルの定義

ローカルレベルモデルの話に入る前の最後の準備段階として、状態空間モデルの一般的な表現を記載します。

状態空間モデルとは、一般的に下記の状態方程式と観測方程式から構成されるモデルになります。

一般的な状態空間モデルの定義

状態方程式(システム方程式)

\begin{equation}
\begin{split}
z_t &= f(z_{t-1}, w_t)
\end{split}
\end{equation}

観測方程式

\begin{equation}
\begin{split}
y_t &= g (z_{t}, v_t)
\end{split}
\end{equation}

ただし、$w_t, v_t$は誤差成分である。

状態空間モデルの一般的な表現はこのようになります。

(1)は状態方程式やシステム方程式と呼ばれているもので、内部の状態変数の遷移を記述する方程式となっています。関数$f$は内部状態の遷移を表現する、何らかの関数形だと表現できます。

(2)は観測方程式と呼ばれており、関数$g$は内部状態の空間から観測空間へ射影するような関数だと表現できます。

$w_t$や$v_t$は、ノイズや誤差の成分です。降水量の例えでは、(1)式のシステム方程式に登場する誤差$w_t$は、実際に雨がふる状態に関する何かしらの成分で、(2)式の観測方程式に登場する$v_t$は観測機器や降水量センサー(そんなのがあるのかは分かりせんが)、観測における誤差だと表現できます。

状態空間モデルでは、誤差に対して、状態に起因するような誤差と観測に起因するような誤差を明確に分けています。(これがなぜなのかは自分も十分理解はしていません)

ここまでで、状態空間モデルがどのようなモデルになっているのかが分かりました。

状態空間モデルにおけるポイントをまとめます。

状態空間モデルのポイント
  • 状態空間モデルは、実際に得られたデータである観測値と、その背後にある観測できない状態量を仮定している
  • 状態空間モデルは、システム方程式と状態方程式からなる
  • 状態空間モデルは、マルコフ性を仮定している

特に、状態空間モデルが仮定しているマルコフ性は、今後確率分布の式変形をする際に、この前提が大活躍するので思い出せるようにしておいてください。

やっと、ここまででローカルレベルモデルの説明に入れるようになりました。

次からようやく、ローカルレベルモデルの説明に入っていきます。

ローカルレベルモデルとは

冒頭でも少し触れましたが、ローカルレベルモデルは、(1)式と(2)式で表現される一般的な状態空間モデルを、ものすごい制約を加えて、ものすごく簡単にしたようなモデルになります。

一般的な状態空間モデルの、めちゃくちゃシンプルな設定だと思ってください。

ローカルモデルのモデルは下記のようになります。ローカルレベルモデルも状態空間モデルの1パターンなので、状態方程式と観測方程式で記述することができます。

ローカルレベルモデルの定義

状態方程式(システム方程式)

\begin{equation}
\begin{split}
z_t &= z_{t-1} +w_t
\end{split}
\end{equation}

観測方程式

\begin{equation}
\begin{split}
y_t = x_{t} + v_t
\end{split}
\end{equation}

ここで、(3)式と(4)式の登場するシステム誤差$w_t$と観測誤差$v_t$は、次の平均・分散をもつ正規分布に従う。

\begin{equation}
\begin{split}
w_t &\sim \mathcal{N}(0, Q) \\
v_t & \sim \mathcal{N}(0, R)
\end{split}
\end{equation}

ちなみに、多次元の観測値・状態量を扱う場合には、平均と分散共分散を有するガウス分布に従うことになります。

(1)(2)式が一般的な状態空間モデルの表現であるのに関し、ローカルレベルモデルは(3)(4)式になっています。(3)(4)式を見ると、例えば(3)式だと、時刻$t$の状態は時刻$t-1$の状態と基本的には変わらず、誤差$w_t$の影響を受けるということになります。

これはつまり、状態は誤差の影響は受けるけど、基本的に変わらないよ。というイメージです。

また(4)式を見ると、時刻$t$の観測値$y_t$は、誤差の影響は受けるけど、状態量$x_t$と変わらないよということを言っています。これを降水量の例えで表現すると、ローカルレベルモデルが規定しているモデルはこんな感じになります。

降水量でローカルモデルを例えるなら….

(4)式により、状態量=降水量になる。
(3)式より、状態量はノイズの成分は受けるけど、基本的に変わらないというモデル

つまり、ある地域の降水雨量は、多少は誤差の影響は受けるけど、基本的には変わらないで遷移する

ということが表現できるモデルになります。

つまり、何か規則や力学的な法則が働いて変化するようなモデルはローカルレベルモデルでは表現できないことになります。

逆に、多少ノイズの影響を受けるけど、基本的には何も変わらない現象を記述する場合には、ローカルレベルモデルは使えるモデルとなります。

ローカルレベルモデルは使えそうにないですね。じゃあなぜ、ローカルレベルモデルが参考書に登場するんだ?というところですが、理由は極めて簡単で、設定が非常に簡単だからだけに過ぎないと思います。

ただ、実用的には使える用途はいくつかあって、例えば時系列で年間を通してほとんど変わらないようなデータはローカルレベルモデルで表現できるので、例えばそのような系を観測している際にに、それが大きく変わるような変化を異常とするようなモデルは、誤差$w_t$や$v_t$を良い感じに設定することで、ローカルレベルモデルで表現することはできます。

このローカルレベルモデルを用いた異常検知に関しては、別の記事で実装付きで解説するのでそちらを参考にしてください。

ローカルレベルモデルの数式・アルゴリズム

先ほどまでで、ローカルレベルモデルの全体像や、表現できそうな現象を大雑把に語ってきました。

それではローカルレベルモデルの数式やアルゴリズムにいよいよ介入していきましょう。今回は、簡単のため観測値が1次元である前提で進めていきます。

まず冒頭に、ローカルレベルモデルは状態空間モデルの極めて簡単な設定にした一例だと言いました。ではそもそも、状態空間モデルではどのようなことができるのかについてまとめていきます。

状態空間モデルでできること

状態空間モデルでできることは、下記の3つがあります。

状態空間モデルでできる3つの予測
  • 1. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、将来の観測値と状態を予測
  • 2. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、現在の状態を予測
  • 3. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、過去の状態を予測

このようなことができます。状態空間モデルって便利ですね。実際、観測値から、将来の時系列を予測するだけでなく、存在すると仮定している状態についても予測することができます。これは非常に便利そうですね。

ローカルレベルモデルも状態空間モデルの1例であるので、当然これらの1~3のすべてのことができるモデルになっています。

では、これらを1つ1つ解説していきます。

線形ガウシアンな状態空間モデル

ノイズの分布がガウス分布(多変量正規分布)に従い、かつ$f$や$g$の関数が線形変換である場合、線形・ガウシアンモデルと呼ばれています。

線形・ガウシアンモデルはある、状態空間モデルの特殊なパターン(強い仮定をおいている)ですが、その解が解析的に解けることが証明されていることから、非常に応用分野で用いられています。これらの解析的な解法は、ご存知の人は多いかもしれませんがカルマンフィルタ と呼ばれています。また線形・ガウシアンモデルのような、カルマンフィルタ で解ける問題はカルマンフィルタ リング問題などといったりします。

カルマンフィルタ に関しては別の記事で解説しているので、そちらを参照してください。

世界一分かりやすいカルマンフィルタの理論と導出と実装
カルマンフィルタ は、1960年にカルマン博士が提案したアルゴリズムで、現在、制御工学や宇宙工学、通信工学、機械学習分野などで非常によく用いられているアルゴリズムです。特に機械学習の文脈では、時系列分析における線形ガウシ […]

ローカルレベルモデルは、このカルマンフィルタ リング問題をさらにシンプルにした問題設定です。

今回は、最初の出発点として、この$q_t$、$r_t$の初期値はそれぞれ$q_0 = 5$、$r_o = 3$として定式化していきます。この初期値もパラメータとなるので、今後最適化する必要性があります。

さて、ローカルモデルのアルゴリズムを考えていきましょう。

まず、最初の状態$z_0$は与えてあげる必要性があります。一旦ここでは、$z_0 = 0$としておきましょう。

(2)式から、$z_1$ は、$z_0$に、平均0, 分散$q_t$の正規分布を足した形になるので、新しい$z_1$の分布は、平均0、分散$q_t$の分布になります。

\begin{equation}
\begin{split}
z_1 &\sim \mathcal{N}(0, q_t) 
\end{split}
\end{equation}

続いて、得られた$z_1$と(2)の観測方程式(下側の式)から、$y_1$を推定していきましょう。

(4)式より、$z_1$は、平均0、分散$q_t$の正規分布に従います。一方、(2)の観測方程式より、この正規分布に、さらに平均0、分散$w_t$の正規分布を足すことになります。

Pythonでローカルレベルモデルを実装する

それでは、Pythonを用いてローカルレベルモデルを実装していきましょう。

記事中で、状態空間モデルでは次の3種類の予測をすることができると書きました。

状態空間モデルでできる3つの予測
  • 1. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、将来の観測値と状態を予測
  • 2. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、現在の状態を予測
  • 3. 時刻$1~t$までの観測値$Y_{1:t}$を用いて、過去の状態を予測

とはいえ、ローカルレベルモデルを使って何を実装しようと思うわけですが、今回はローカルレベルモデルを実装し、観測値から状態量$X$を推定してみます。

今回の実装

ローカルレベルモデルを用いて、今までに得られた観測値$\bm{Y}$から、実際の状態量$\bm{X}$を推定する、平滑化(スムージング)を行う。

どうせなら、得られた観測値から、将来の観測値を予測する時系列予測もやってみたいところですが、ローカルレベルモデルでは時系列予測を行なってもうまくいかないことが知られています。

【広告】
統計学的にあなたの悩みを解決します。
仕事やプライベートでお悩みの方は、ベテラン占い師 蓮若菜にご相談ください。

機械学習と情報技術