この記事は,制御工学 Advent Calendar 2018の20日目の記事です.

はじめに

R.E.Kalmanがカルマンフィルタ(Kalman Filter: KF)を提案して以来,数多くのフィルタが誕生してきました. 個々のフィルタは異なるバックグラウンドを持ち,それぞれに特徴があります.
この記事では,それらのフィルタを統一する視点,すなわち

カルマンフィルタの多くはガウシアンフィルタからの派生と見なせる

という主張について解説します. 特に,拡張カルマンフィルタ(Extended KF: EKF),Unscented カルマンフィルタ(UKF)を実際にガウシアンフィルタから導出します.
なお,この記事には実装コードはありません. 代わりといっては何ですが,参考文献のページ を詳しく書きました. ぜひ,ご活用ください.

カルマンフィルタの問題設定

まずは,カルマンフィルタが対象とする問題を設定しましょう.いま,離散時間非線形システム xk+1=f(xk)+wk(1)yk=h(xk)+vk を考えます. 簡単のため,状態xkおよび観測ykの次元は1次元とします. また,wk,vkは雑音で,それぞれwkN(0,Q),vkN(0,R)とガウス分布に従うとします (Q,Rは大文字ですが,共分散行列ではなく実数値の分散です).

このとき,カルマンフィルタは次の問題に対し,一つの答えを与えます.

観測の集合Yk={y0,y1,,yk}が与えられているとする.このとき,それぞれ次の評価関数Jを最小化する推定値x^k|k,x^k+1|kを見つけよ. J=E[xkx^k|k2]J=E[xk+1x^k+1|k2] ただし,x^k|lで時刻lの時点で予測した時刻kでの状態の推定値を表すとする.

ガウシアンフィルタ(GF)

さて,さきほどの問題に対して,Ito, Xiong[1]はガウシアンフィルタ(Gaussian Fiter: GF)を提案しました. 導出はしませんが,どのようなフィルタかについて概略を述べます.

PRML[2]で述べられている通り,この問題は状態xkが潜在変数であるような隠れマルコフモデルになっています (式(1)はxk+1xkの関係を記述しています). さらに,雑音がガウス分布に従うことから,状態はガウス分布に従います.

このとき,「マルコフ性」と「ガウス分布」,この2つ性質だけをベースに構築したピュアなカルマンフィルタがガウシアンフィルタである,といえます. 後述しますが,EKFやUKFでは,この2つの性質の他にも操作を加えながらフィルタを構築します. そのためEKFやUKFがもともと仮定しているこの2つの性質が見えにくくなっています.EKFやUKFから共通の構造を抽出したのがガウシアンフィルタである,ともいえるでしょう.

では,ガウシアンフィルタの式を述べます.この式は文献[3]を参考にしています.

θk|k1:=(x^k|k1,Pk|k1)θk|k:=(x^k|k,Pk|k)Yk:={y0,y1,,yk} p(xk|Yk1)=N(xk|θk|k1)p(xk|Yk)=N(xk|θk|k) [観測更新] (GF1)y^k|k1=E[h(xk)|θk|k1](GF2)Uk|k1=Cov[xk,h(xk)|θk|k1](GF3)Vk|k1=V[h(xk)|θk|k1]+R(GF4)Kk=Uk|k1Vk|k11(GF5)x^k|k=x^k|k1+Kk(yky^k|k1)(GF6)Pk|k=Pk|k1KkUk|k1 [時間更新] (GF7)x^k+1|k=E[f(xk)|θk|k](GF8)Pk+1|k=V[f(xk)|θk|k]+Q ただし, (2)E[F(x)|θ]=RF(x)N(x|θ)dx(3)V[F(x)|θ]=R(F(x)E[F(x)|θ])2N(x|θ)dx(4)Cov[F1(x),F2(x)|θ]=R(F1(x)E[F1(x)|θ])(F2(x)E[F2(x)|θ])N(x|θ)dx

繰り返しになりますが,すべてスカラー値です.
さきほどの問題に対する答えとなる式は,式(GF5),(GF7)になります.それ以外は,この2式を計算するために必要な式です.

さて,ざっと式全体を見渡すと,どれも期待値や共分散の積分計算が必要だと気づきます. しかし,一般にこれらの積分は解析的に求められないため,計算するには何らかの操作を施さなければなりません. 実は,この積分計算をするために必要な操作の違いこそがEKFやUKFといった各種の非線形フィルタが現れる源なのです.

式(2)~(4)の積分計算は,いずれも共分散公式などを用いることで次の形の積分計算に帰着します. (13)I[F(x)|θ]=RF(x)N(x|θ)dx

そこで,これ以降,積分I[F(x)|θ]をどう計算するかに集中して考えていきます.

Gaussian Filter + Taylor展開 = Extended Kalman Filter

本来,拡張カルマンフィルタ(EKF)は,状態方程式(1)を状態の推定値x^k|kx^k|k1のまわりで線形化し,線形カルマンフィルタを適用すると得られます. 今回は,線形化した状態方程式からボトムアップにEKFを構築するのではなく,GFからトップダウンに構築してみます. EKFの具体的な式はAppendix.A EKF にあります.GFからトップダウンに計算して,Appendix.Aの式を導出することが目標です.

まず,f(xk),h(xk)を次のように推定値のまわりで線形化します. f(xk)f(x^k|k)+f(x^k|k)(xkx^k|k)h(xk)h(x^k|k1)+h(x^k|k1)(xkx^k|k1) これをガウシアンフィルタの式に放り込んでいきます. この際,共分散の性質Cov[a+F1(x),bF2(x)|θ]=b Cov[F1(x),F2(x)|θ]を使って変数以外の定数項を処理します.
例えば,式(GF2)に代入すると, Uk|k1Cov[xk,h(x^k|k1)+h(x^k|k1)(xkx^k|k1)|θk|k1]=Cov[xk,h(x^k|k1)h(x^k|k1)x^k|k1+h(x^k|k1)xk|θk|k1]=Cov[xk,h(x^k|k1)xk|θk|k1]=h(x^k|k1)Cov[xk,xk|θk|k1]=h(x^k|k1)V[xk|θk|k1]=h(x^k|k1)Pk|k1 となり,(EKF2)と一致します.同様にして他の共分散,分散も計算できます.
他にも,式(GF6)は, Pk|k=Pk|k1KkUk|k1Pk|k1Kkh(x^k|k1)Pk|k1 となり,(EKF6)と一致します.
他も同様にして,GFからEKFが導出できます.

Gaussian Filter + Gauss-Hermite求積 = Unscented Kalman Filter

次は,Unscented カルマンフィルタ(UKF)です. UKFは非線形関数f(xk)の近似よりもガウス分布の近似のほうが簡単という考えのもと,Monte Carlo法をより少ない点数に簡略化したものといえます. まず,その平均と分散がx^k|kPk|kに一致するような点集合(シグマ点)を生成し,分布を近似します. 次にシグマ点を関数f,hで飛ばすことで,非線形性をシグマ点で捉える,というのが基本的なアイデアです.詳細は文献[5],[6]を御覧ください. また,UKFの具体的な式はAppendix.B UKF にあります.

閑話休題タイム.さきほどEKFをGFから導出しましたが,思ったより呆気なく感じませんでしたか. 結局,線形化した式を代入するタイミングが後になっただけじゃんと感じた方もいると思います. ご安心ください.実はこの記事のハイライトはここからです.

さて,ここでもう一度,いま考えている積分I[F(x)|θ]を見てみましょう. I[F(x)|θ]=RF(x)N(x|θ)dx=RF(x)12πPexp((xx^)22P)dx t=(xx^)/2Px=x^+2P tと変数変換すると, I[F(x)|θ]=1πRF(x^+2P t)exp(t2)dt となります.

このように,ある関数Fexp(t2)を区間[,]で積分する場合にうってつけの数値計算手法があります. それがGauss-Hermite求積です.

Gauss-Hermite求積(より一般にはGauss型積分公式)には素晴らしい性質が知られています([7]). それは,m個の被積分関数の値で積分値を近似するような(m点公式といわれる)求積法のなかで,最高の近似精度を叩き出すのがこのGauss-Hermite求積なのです! このことを踏まえると,I[F(x)|θ]の計算にはGauss-Hermite求積がまさに適任といえます.

では,I[F(x)|θ]にGauss-Hermite求積を適用してみましょう. すると,Hermite多項式の零点tiでのFの値と,重みwiとの重み付き線形和で近似できます([8]). I[F(x)|θ]i=1mwiF(x^+2P ti)ti:Hm(t)の零点wi=2m1m![mHm1(ti)]2

m=3の場合に計算してみましょう.
H3(t)=8t312tより,零点は(t1,t2,t3)=(0,32,32)となります. また,H2(t)=4t22より,重みは(w1,w2,w3)=(23,16,16)となります. これより,3点公式 I[F(x)|θ]23F(x^)+16F(x^+3P)+16F(x^3P) が得られました!

さっそく3点公式をガウシアンフィルタに使ってみます.
式(GF7)に適用すると, x^k+1|k23f(x^k|k)+16f(x^k|k+3Pk|k)+16f(x^k|k3Pk|k) となります.これはAppendix.B UKF において, (m,κ)=(1,2)とおいた式(UKF7)と一致します!なんとHermite多項式からシグマ点が現れました.
同様に式(GF1)にも適用してみましょう.この場合,少し修正が必要で, y^k|k1=E[h(xk)|θk|k1]=E[h(f(xk1))|θk1|k1] のように,θk|k1θk1|k1とずらす必要があります. これはシグマ点の生成が時間更新(UKF7)の直前にのみ行われることに起因します. この式に3点公式を使うと, y^k|k123h(f(x^k1|k1))+16h(f(x^k1|k1+3Pk1|k1))+16h(f(x^k1|k13Pk1|k1))=23h(f(Xk1|k10))+16h(f(Xk1|k11))+16h(f(Xk1|k12))=23h(Xk|k10)+16h(Xk|k11)+16h(Xk|k12) となり,(UKF1)と一致します. ほかも同様にして3点公式を適用することでGFからUKFが導出できます.

[2018/12/22追記]
やや急ぎ足になっていたので,(UKF2)の導出を新たに追加します.
まず,共分散の定義から, Cov[xk,h(xk)|θk|k1]=E[(xkE[xk|θk|k1])(h(xk)E[h(xk)|θk|k1])|θk|k1] です.次に,内側の期待値の部分を推定値で書き換えます. E[(xkE[xk|θk|k1])(h(xk)E[h(xk)|θk|k1])|θk|k1]=E[(xkx^k|k1) (h(xk)y^k|k1)|θk|k1]

最後に,さきほどの式(UKF1)の導出と同様,θk|k1θk1|k1と修正します.すると,結局 Uk|k1=E[(f(xk1)x^k|k1) (h(f(xk1))y^k|k1)|θk1|k1] となります.この式に3点公式を使うと,f(xk1)の部分がシグマ点Xk|k1iに置き換わり, Uk|k1i=02wi(Xk|k1ix^k|k1)(h(Xk|k1i)y^k|k1) となります.これは式(UKF2)です. 以上より,式(GF2)から式(UKF2)を得ました.
[追記終わり]

結局何が嬉しいの?

以上,I[F(x)|θ]の積分をどう計算するかによってEKF,UKFが現れることを見てきました.理論的にはスッキリしましたが,結局何が嬉しいのでしょうか. 実はこのように整理することで次のような嬉しさがあります.

新しいフィルタの構成が容易になる

フィルタと積分計算が対応しているため,新しい積分計算の手法を考えれば,そこに新しいフィルタが生まれます. 実際,文献[1]では,F(x)を二次の項までTaylor展開し,ヤコビアンとヘシアンを中央差分近似することで,Central Difference Filter(CDF)なる新しいフィルタを提案しています.

各フィルタの性能を比較できる

積分計算の手法の性能によって各フィルタの性能は決まります.ここでいう性能とは,精度,効率,安定性の3つの指標です. 実際,文献[4]では,EKF,UKF,CDFなどのフィルタたちを各指標ごとに順序付けし,フィルタ選択の指針を与えています.

粒子フィルタが無いんだけど?

今回の記事では,確率変数がガウス分布に従うことを仮定しました. 一方,粒子フィルタは非ガウス分布の場合に有効な手法です. ですので,粒子フィルタはガウシアンフィルタでは統合できないフィルタの一つといえるでしょう.

まとめ

いかがでしたでしょうか.
本記事では,ガウシアンフィルタというカルマンフィルタの濃縮液のようなフィルタから, EKFやUKFといった異なるバックグラウンドをもつフィルタが導出できるということを確認しました. 特にUKFの導出では,Hermite多項式の零点と統計的に定めたシグマ点の2つが驚きの対応をしました. カルマンフィルタの世界の奥の深さを改めて実感した次第です.

それでは,皆さんも良きカルマンライフを!