カルマンフィルター
カルマンフィルター (Kalman filter) は、誤差のある観測値を用いて、ある動的システムの状態を推定あるいは制御するための、無限インパルス応答フィルターの一種である。
カルマンフィルターは、 離散的な誤差のある観測から、時々刻々と時間変化する量（例えばある物体の位置と速度）を推定するために用いられる。レーダーやコンピュータビジョンなど、工学分野で広く用いられる。例えば、カーナビゲーションでは、機器内蔵の加速度計や人工衛星からの誤差のある情報を統合して、時々刻々変化する自動車の位置を推定するのに応用されている。カルマンフィルターは、目標物の時間変化を支配する法則を活用して、目標物の位置を現在（フィルター）、未来（予測）、過去（内挿あるいは平滑化）に推定することができる。
このフィルターはルドルフ・カルマンによって提唱されたが、同様の原理はトルバルド・ティエレとピーター・スワーリングによってすでに開発されていた。カルマンがアメリカ航空宇宙局のエイムズ研究センターを訪問した際、この理論がロケットの軌道推定に有用なことに気づき、のちのアポロ計画で用いられた。
カルマンフィルターは時間領域において、連続時間線形動的システム、もしくは離散化された離散時間線型動的システムに基づいて駆動する。以降に導入される解説は、後者の立場のものである。それらはガウス白色雑音によって励振をうける線形演算子からなるマルコフ連鎖モデルで表現される。より端的にいえば、システムは状態空間モデル (state space model) で表現されるということである。
対象のシステムに定義された「状態 (state)」は、そのシステムの過去の動特性の遷移を保持する役割を果たし、動特性の遷移を保持する線形空間が状態空間として定義される。この空間は実数空間であるため、システムの状態は一般に、任意の次元の状態空間に含まれる実数ベクトルとして与えられる。状態の変化は、現在の状態と、それに付加する雑音の影響と、場合によってはシステムの状態の制御に関与する既知の制御入力の線形結合によって記述される。したがって、状態はシステムの因果性に寄与する存在である。上記の理念は、以下に記述する状態方程式 (state equation) によって表現される。
状態が直接観測できない場合には、システムの出力は一般に状態と観測雑音の線形結合にて観測可能なものとして与えられる。この理念は観測方程式 (observation equation) として、以下に示すような線形モデルで表現される。
カルマンフィルターは、直接システムの状態が観測できない問題に対する状態推定法のひとつであるから、一般的に観測方程式を伴う問題に適用される。
カルマンフィルターは隠れマルコフモデル (hidden Markov model) の類似であると考えることができる。2者の主たる差異は隠れマルコフモデルにおける状態変数が、連続であるか離散であるかである。また、隠れマルコフモデルでは状態変数の未来への変化を任意の分布に従う形式で統計的に与えることができる一方で、カルマンフィルターでは、ガウス分布に従う雑音によって未来の状態変数が統計的に記述される点が異なっている。したがって、カルマンフィルターと隠れマルコフモデルの間には強固な双対性が存在する。ちなみに、カルマンフィルターの導出過程においては、「システムに付随する雑音の性質はガウス分布に従う」という仮定の下に行われるのが一般的であるが、雑音の性質がガウス分布に従わない場合であっても、カルマンフィルターは線形なクラスにおける最適推定値、すなわち線形最小分散推定値を導くことができる点で、汎用性に富んでいるといえる。
唯一に観測可能である、雑音の影響を受けた出力過程に基づいて（制御問題においては、入力も観測可能な過程となる）、カルマンフィルターを用いてシステムの状態を推定するためには、対象のシステムに対して、カルマンフィルターの理念に合致するような状態の遷移（すなわち状態過程）に関するモデルを与えなければならない。これは、時変 (time-variant) な行列 formula_1, 
formula_2, 
formula_3, formula_4, formula_5 によって特徴付けられる線形方程式として、以下で与えられる。これが状態方程式である。
時刻 formula_6 における真のシステムの状態は、１ステップ前の時刻 formula_7 の状態をもとに、次のように表現される。
ここに、これがシステムの状態の遷移を記述する状態方程式である。
ある時刻 formula_6 において、観測量（測定量）formula_14 は、真の（すなわち観測不可能な）状態 formula_15 と、以下のような関係にある。
ここに、formula_3 は状態空間を観測空間に線形写像する役割を担う観測モデルで、 formula_17 は、共分散行列 formula_5 かつ零平均の多変数正規（ガウス）分布に従うような雑音である（観測雑音 (observation noise) ）。これが観測方程式である。
システムの初期条件と雑音
formula_19 は、互いに統計的に独立であると仮定する。
状態方程式と観測方程式を合わせて、状態空間モデルという。上記の状態空間モデルは時変システムを表現しているが、限定的な場合として行列のインデックス formula_6 を定数と考えることにより、時不変システム (time-invariant) を表現できる。
多くの実動的システムでは、上記のような状態空間モデルは厳密には適合しないが、カルマンフィルターは雑音の影響を加味した上で設計されているがゆえに、上記のモデルが対象システムに近似的に適合するものと考えられ、これが理由でカルマンフィルターは十分な有用性が認められている。カルマンフィルターは洗練された様々な拡張がなされており、それは以降に述べられる。
カルマンフィルターは、システム（系）の現在の観測量と 1 ステップ前の状態推定値のみから（モデルが制御入力を受ける場合には現在の入力値も用いて）、現在の状態推定値（ろ波推定値）と 1 ステップ先の状態予測値（ 1 段予測値）を与える、反復推定器（反復推定型フィルタ）である。例えばローパスフィルタなどの多くのフィルタが周波数領域で設計され、時間領域へ変換されて実演される中で、カルマンフィルターは純粋に時間領域でのみ設計されるフィルタで、その意味で特異な存在であるといえる。カルマンフィルターは基本的に線形なクラスのフィルタであり、システム（系）が無限の過去から駆動し続けていると仮定すると、状態の推定値は、それまでにシステム（系）から観測された観測値の全て（システム（系）が制御入力を受ける場合は入力値の全ても含めて）を用いた線形結合の形で表現される。その意味で、カルマンフィルタは無限インパルス応答フィルタであると解釈できる。反復推定との対応関係は、1 ステップ前の状態推定値が 1 ステップ前までの全ての観測値（入力値も含め）の情報を線形結合の形で保有しているという事実により与えられる。
以降、formula_21 は時刻 "m" 時点での時刻 "n" の状態推定値を示すものとする。
フィルタの現在(時刻 "k" )の状態(様子)は、以下の２つの変数で特徴付けられる。
カルマンフィルターは、時間ステップをひとつ進めるために予測と更新の二つの手続きを行う。予測の手続きでは、前の時刻の推定状態から、今の時刻の推定状態を計算する。更新では、今の時刻の観測を用いて、推定値を補正してより正確な状態を推定する。
_{k|k-1} = F_k\hat{\boldsymbol{x}}_{k-1|k-1} + \boldsymbol{u}_k （今の時刻の予測推定値）
formula_24 （今の時刻の予測誤差行列）
_{k|k-1}  （観測残差、innovation）
formula_25 （観測残差の共分散）
formula_26 （"最適" カルマンゲイン）
formula_27 （更新された状態の推定値）
formula_28 （更新された誤差の共分散）
もし、モデルが正確で初期条件 formula_29 と formula_30 が正確ならば、全ての推定量は不偏である。ここに、formula_33 は、期待値。また、共分散は、推定値の誤差共分散である。
まっすぐで無限の長さを持つ摩擦の無いレールの上に乗っているトロッコを考えよう。初期条件は、トロッコは位置 0 に静止している。トロッコにはランダムな 力（加速度）が与えられる。"Δt" 秒ごとにトロッコの位置 x を観測する。ただしこの観測には誤差が混入している。トロッコの位置と速度のモデルを考えると、以下の様に設定すると、カルマンフィルターが用い得る。
制御の必要はないから、 "u" は考えない。行列 "F"、 "G"、 "H"、 "R"、 "Q" は時間変化しないので添字は付けない。
トロッコの場所と速度は、
で、表される。 formula_37 は位置の時間微分、すなわち速度である。
時刻 "k" − 1 と時刻 "k" の間に加速度formula_38がトロッコに与えられる。加速度formula_38は平均 0 標準偏差formula_40の正規分布をしている。運動の第2法則により、
ここに、
かつ
である。formula_41の共分散は、formula_40がスカラーであることを用いて、
それぞれの時刻に、トロッコの位置を観測する。観測誤差も平均 0 で標準偏差formula_43の正規分布と仮定する。
ここに、
かつ
である。
初期条件は正確に分かっているので、
もしも、初期条件に誤差があるならば、誤差の大きさに応じて "B" を設定し、
と、取るべきである。もし "B" が大きければカルマンフィルターは、初期条件より、それ以降の観測に重みを置くようになる。
時間を進めるための予測と更新の手続きのうち、更新が終わったあとの共分散行列 "P" をまず求める。上の定義式、
に、推定値 formula_22 の定義を代入。
続いて、観測残差 formula_45 を代入。
そして、観測値 formula_14 と真の値の関係を代入。
変形して、
観測誤差 v は、他の項と相関がないから、
となり、さらに変形
して、前述の不偏量 "P" と、観測誤差共分散 "R" を用いて、
を得る。この式は、 "K" がどんな値であっても成立するが、 "K" が、最適カルマンゲインの時は、以下のようにさらに簡略化される。
カルマンフィルターは最小平均二乗誤差(minimum mean-square error: MMSE)推定値を与える。すなわち、更新後の誤差の推定値は
であり、このベクトルの大きさの二乗の期待値 formula_47 を最小にするような推定値を与える。これは、更新後の共分散 "P" のトレースを最小とすることと同じである。上の式を展開して、
MMSE を導くゲインは、"P"のトレースを最小にするから、
必要条件として、"K"による行列微分は下記が成立しなければならない。
ここからカルマンゲイン "K" を求める。
このゲインは、最適カルマンゲインと呼ばれる。
カルマンゲインが上述の値を取るとき、更新後の誤差共分散行列は以下のように簡単になる。カルマンゲインの式の両辺の右から "S""K" をかけて、
更新後の誤差共分散行列を展開して、
右の二項は相殺するから、
計算量が少ないため、ほとんどの場合この式が用いられるが、カルマンゲインが上記の最適解の時にしか適用できないことに注意。計算上の桁落ちなどで解の安定性が悪いときやなんらかの理由で敢えて最適でない解を用いるときは使えない。
真の状態は一次マルコフ過程であると仮定され、観測値は隠れマルコフモデルからの観測された状態である。 仮定より、ひとつ前の時刻の状態にのみ依存して
同様に、時刻 "k" での観測値は現在の状態にだけ依存して、過去には依存しないものとする。
これらの仮定を用いると、隠れマルコフモデルの観測が z, z, formula_48z と得られる確率は、
で、表される。
一方、カルマンフィルターで状態 x を求めるには現在の系の状態とそれまでの観測だけを用いる。
カルマンフィルターの"予測"と"更新"の手続きを、確率を使って表してみる。予測後の状態の確率分布は、時刻 "k" − 1 から時刻 "k" への変化に関する確率と、時刻 ("k" − 1) の状態の積になるから、
時刻 "t" までの観測は
である。
更新後の確率は観測の起こりやすさ（尤度）と予測された状態の積に比例するから
となる。分母の
は、全確率を 1 にするための因子であまり重要ではない。
他の確率分布関数も
_{k-1},P_{k-1} )
と書ける。
情報フィルターもしくは逆共分散フィルターにおいては、カルマンフィルターにおける推定された共分散と状態が、各々フィッシャー情報行列と情報ベクトルに置き換わる。
_{k|k} \triangleq P_{k|k}^{-1}\hat{\boldsymbol{x}}_{k|k} 
同様に、予測された共分散と状態は情報形式と等価になり、以下と定義する。
_{k|k-1} \triangleq P_{k|k-1}^{-1}\hat{\boldsymbol{x}}_{k|k-1} 
観測共分散と観測ベクトルがあるとして、以下で定義する。
このとき、情報更新は簡便な和算となる。
_{k|k} = \hat{\boldsymbol{y}}_{k|k-1} + \boldsymbol{i}_k
情報フィルターの主たる優位性は、以下に示すように、N 個の観測値は各時間毎に、観測値の情報行列と情報ベクトルの和算でシンプルにフィルター処理される点である。
_{k|k} = \hat{\boldsymbol{y}}_{k|k-1} + \sum_{j=1}^N \boldsymbol{i}_{k,j}
情報フィルターを予測するために、情報空間予測を用いることができる。
formula_49
formula_50
formula_51
formula_52
なおformula_53であれば、formula_54である。"F" は可逆（正則）の必要がある。
注意すべきは、もし "F", "G", "Q" が時不変(time invariant)ならば、それらの値は保存しておける点である。
固定区間スムーサー（fixed-interval smoother）は、スムーサー解formula_55およびformula_56（formula_57、formula_58は固定値とする）を求める。
Rauch–Tung–Striebelの関係式（formula_59）：
において、formula_63、formula_64の右式はformula_65に依存しない。なおformula_66は情報フィルターのそれに等しい。
これを用いて固定区間スムーサー解が求められる。すなわちフィルター計算でformula_67における上記の値を求めておき、それらを用いて、
を逆方向（backward）すなわち、"k"が減る方向に逐次計算しスムーサー解が求められる。ここで計算が丸め誤差を持っていても、formula_56は必ず半正定値となる。
また、上記を変形すると、Bryson–Frazierの固定区間スムーサーと等価の式が得られる。すなわち、
また、Biermanによって上記の変形式が得られている。これは、formula_77という逆行列計算を必要とせずスムーサー解を得られる。すなわち、
ここまでは線形の仮定が成り立つ系をとりあつかってきたが、実際の系の多くは非線型である。時間発展モデルも観測モデルもどちらも非線型になりうる。
ここでは時間発展モデル
と、観測モデル
を考える。どちらも微分可能であれば線形である必要はない。関数 "f" は前の状態から推定値を与え、関数 "h" は観測値を与える。どちらの関数も直接共分散を求めることはできず、偏微分行列（ヤコビアン）を用いる必要がある。
原理としては、非線型モデルを現在の推定値の回りで線形化する。そのためにそれぞれの時刻で、ヤコビアンを計算する。すなわち、
予測
_{k|k-1} = f(\hat{\boldsymbol{x}}_{k-1|k-1}, \boldsymbol{u}_k, 0)
formula_83
更新
_{k|k-1}, 0)
formula_84
formula_26
formula_27
formula_87
出てくる行列は次のヤコビアンで定義される。
_{k-1|k-1},\boldsymbol{u}_k}
formula_88
非線型性の強いとき、拡張カルマンフィルターの性能は悪い。理由は平均値だけが非線型性に反映されるからである。unscented カルマンフィルターは、シグマ点とよばれる代表点を平均値の回りで用いて、推定値の共分散を計算する。こうすることにより、真の平均と共分散により近い値が得られることがモンテカルロ法や、テイラー展開によって示される。しかも解析的にヤコビアンを計算する必要がなくなるという利点がある。これは複雑なモデルでは有利である。
予測
拡張カルマンフィルタと同様、 unscented カルマンフィルターの予測手続きは更新手続きと別であり、更新手続きに線形カルマンフィルターや拡張カルマンフィルターを用いたり、その逆を行うことも可能である。推定値と共分散には、予測ノイズの平均と共分散項が加えられる。
_{k-1|k-1}^\textrm{T} \quad \mathrm{E}(\boldsymbol{w}_k^\textrm{T}) \ ]^\textrm{T}
formula_89
シグマ点 2"L"+1 個は、付け加えた項から計算される。ここに "L" は付け加えた状態項の次元である。
シグマ点は関数 "f" で時間発展する。
予測値と共分散は重み付き平均で求められる。
_{k|k-1} = \sum_{i=0}^{2L} W_{s}^{i} \chi_{k|k-1}^{i}
formula_90
重みは以下のように与えられる。
"α = 10"、"β = 2" 、"κ = 0" といった値がよく用いられる。
更新
予測値と共分散には、上と同様に観測値のノイズの平均と共分散項が加えられる。
_{k|k-1}^\textrm{T} \quad \mathrm{E}(\boldsymbol{v}_k^\textrm{T}) \ ]^\textrm{T}
formula_91
シグマ点 2"L"+1 個は、付け加えた項から計算される。ここに "L" は付け加えた状態項の次元である。
もし、予測手続きも unscented カルマンフィルターで行われていたならば、以下のような変形も可能である。
ここに、
である。シグマ点は関数 "h" で観測値に変換される。
重み付き平均で、観測値とその共分散を推定する。
_k = \sum_{i=0}^{2L} W_{s}^{i} \gamma_k^{i}
formula_92
推定値と観測値の相関行列
を用いて unscented カルマンゲイン
を計算する。以下は線形の場合と同様である。
_{k|k} = \hat{\boldsymbol{x}}_{k|k-1} + K_k( \boldsymbol{z}_k - \hat{\boldsymbol{z}}_k )
formula_93