はじめに
Pythonによるベイズモデルの実装をきちんと学ぼうと思い,森賀新・木田悠歩・須山敦志 著 「Pythonではじめるベイズ機械学習入門」を読むことにした。
本記事は,第4章「潜在変数モデル」のうち状態空間モデルに関する読書メモである。
- 本書の紹介ページ
4.3 状態空間モデル
状態空間モデル(State Space Model)は,時系列データのモデリングに用いられる潜在変数モデルである。
前の時点から次の時点
の状態を得るための方程式を状態方程式(State Equation)と呼ぶ。
また時点における状態から観測値を得るための方程式を観測方程式(Observation Equation)と呼ぶ。
状態空間モデルを用いた時系列分析の利点としては,表現力・説明力の高さが挙げられる。すなわち,トレンド,周期変動などの複数成分の状態成分を組合わせたモデルを作ることが可能で,観測データに影響を与えるさまざまな要因を分解して考えることができる。
4.3.1 モデル概要 : ローカルレベルモデル
本節では,状態空間モデルのうち最も単純なモデルともいえるローカルレベルモデル(Local Level Model)について説明している。
ローカルレベルモデルにおける,状態方程式,観測方程式,状態の初期値は以下の式で表される。
ここでは水準成分(レベル成分)と呼ばれるものである。
状態方程式は,「水準成分は,ランダムな値を足し合わせている」,すなわちランダムウォークを表している。そのままでは予測の役には立たないが,より実用的なモデルのベースになるモデルである。
4.3.2 実装:ローカルレベルモデル
サンプルコードを動かしながら,挙動を確認した。
v
github.com
データの準備
データは,ハワイ島のマウナロア観測所における1966年から2019年の月次の二酸化炭素の測定データを利用する。なおこのデータは,サンプルコードにベタ打ちされている。

このうち,最後の10年分をテストデータに用いる。
4.3.3 モデル概要 : 構造時系列モデル
本節では,ローカルレベルモデルよりも実用的なモデルとして,構造時系列モデル(Structural Time Series Model)を紹介している。
構造時系列モデルには,以下のような成分が含まれる。
- トレンド成分(Trend Component) : 増加傾向・減少傾向といったデータの大まかな変動傾向を表す。
- 季節成分(Seasonal Component) : 周期的な変動を表す。
- 不規則成分(Irregular Component) : 他の成分では表現できない変動を表す。
4.3.4 モデル概要 : トレンド成分
本節では,ローカル線形トレンドモデル(Local Linear Trend Model)を紹介している。
ローカルトレンドモデルでは,水準成分に加えて,傾き成分
が現れる。
水準成分は,前の時点の水準成分
に
が加わっている。すなわち
は
の傾きを表している。
式で表すと以下のようになる。
4.3.5 モデル概要 : 季節成分
季節成分は,周期的な変動を表現する状態成分である。
季節成分は,
を周期としたときに,1周期分の合計は0になるという制約を設ける。このような制約を設けないと,季節成分が一位に定まらないためである。
この式より,時刻における季節成分
について,以下が成り立つことが分かる。
さらに季節成分には,季節成分の揺らぎをあらわすノイズを加える。
以上より,トレンド成分と季節成分を組み込んだモデル式は以下のようになる。
4.3.6 実装:構造時系列モデル
構造時系列モデルについて,変分推論法を用いてパラメータの推定を行なう。
ELBOの負値の推移は下図のようになる。

また,ローカル線形トレンド+季節成分モデルによる予測結果は以下の通りである。

ローカルレベルモデルに比べて,時系列データの特徴を捉えられている。
更に得られたトレンド成分と季節成分は下図のようになる。


