基礎から学ぶカルマンフィルタ
(kalmanfilter.net)- Kalman Filter は、測定ノイズや未知の外部要因があるシステムで現在の状態を推定し、未来を予測するアルゴリズムであり、追跡・航法・ロボティクス・制御などの分野で使われる
- 1次元レーダーの例では、航空機の距離 (r) と速度 (v) を測定し、状態ベクトル (\boldsymbol{x}=[r, v]^T) と共分散行列 (\boldsymbol{P}, \boldsymbol{R}, \boldsymbol{Q}) によって、状態と不確かさをあわせて扱う
- 初期測定値は距離 10,000m、速度 200m/s であり、5秒のサンプリング間隔と等速度モデルを適用すると、次の位置予測は 11,000m になる
- 予測段階では状態遷移行列 (\boldsymbol{F}) により状態を伝播し、(\boldsymbol{F}\boldsymbol{P}\boldsymbol{F}^T+\boldsymbol{Q}) によって共分散を計算し、速度の不確かさと プロセスノイズ が位置の不確かさを大きくする効果を反映する
- 更新段階では新しい測定をそのまま信じたり捨てたりせず、Kalman Gain によって予測と測定を重み付きで結合し、推定の不確かさを下げる。その後、フィルタは予測と更新を繰り返す
Kalman Filter が扱う問題
- Kalman Filter は、不確かさのあるシステムで 状態推定 と 未来予測 を行うアルゴリズムである
- 測定ノイズがあったり、未知の外部要因がシステムに影響する状況を扱う
- 物体追跡、航法、ロボティクス、制御分野で中核的なツールとして使われる
- コンピュータマウスの軌跡推定では、手ぶれやノイズを減らして、より安定した移動経路を作ることができる
- 金融市場分析では、ノイズが混じった市場データから株価トレンドを検出するのに、気象分野では天気予測に応用される
- このチュートリアルは、複雑な数学を先に出すのではなく、数値例 で直感を養う方式である
- 設計の悪い Kalman Filter が物体をうまく追跡できない例も含む
- 概念と数学を理解し、自分で設計・実装できるレベルを目指す
学習パス
- 提供される学習パスは 3段階 に分かれる
- 単一ページの概要: 主要概念と必須方程式を導出なしで説明し、基本的な統計と線形代数の知識を前提とする
- 無料の例題ベース Web チュートリアル: tutorial で数値例により直感を作り、Kalman Filter 方程式の導出まで段階的に扱う
- 書籍: Kalman Filter from the Ground Up には、14個の完全解説付き数値例、性能グラフと表、Extended Kalman Filter と Unscented Kalman Filter、センサフュージョン、実装ガイドラインが含まれる
レーダー追跡で予測が必要な理由
- レーダーが航空機を追跡するには、狭いビームを目標方向へ繰り返し照準しなければならないため、次のビームを送る時点での 未来位置 を予測する必要がある
- 予測に失敗すると、ビームが誤った方向を向き、追跡を失う可能性がある
- 航空機が時間とともにどう動くかを表す 動的モデル が必要になる
- 単純化した1次元の例では、航空機がレーダーに近づくか遠ざかるかという直線運動だけを考える
- 状態はレーダーからの距離 (r) として定義される
- レーダーはパルスの送受信時間と光速を使って距離 (r) を計算する
- Doppler 効果を使って速度 (v) も測定できる
- (t_0) で距離 10,000m、速度 200m/s を非常に高い正確さと精密さで測定したと仮定する
- サンプリング間隔は (\Delta t=5s)
- 等速度モデルでは移動距離は (\Delta r=v\cdot\Delta t)
- 予測位置は (10,000+200\cdot5=11,000m)
測定ノイズとプロセスノイズ
- 実際のレーダー測定は完全ではなく、複数のレーダーが同じ瞬間に同じ航空機を測定しても少しずつ異なる結果を出す
- このような変動は 測定ノイズ によって生じる
- 推定値だけでなく、その推定がどの程度信頼できるかもあわせて計算する必要がある
- 動的モデルも実際の運動を完全には説明できない
- 航空機が等速度で動くと仮定しても、風のような外部要因が実際の運動を変えることがある
- このような予測不能な影響は プロセスノイズ として扱う
- Kalman Filter は、現在状態の推定、未来状態の予測、そしてそれぞれの 不確かさ をあわせて提供する
- 状態推定の不確かさを最小化する最適アルゴリズムとして紹介される
レーダー例の状態表現と初期化
- 例のシステム状態は、航空機の距離 (r) と速度 (v) を含むベクトルである
[ \boldsymbol{x}=\left[\begin{matrix}r\v\\end{matrix}\right] ]
- ベクトルは小文字の太字、行列は大文字の太字で表記する
- 最初の測定で Kalman Filter を初期化する
- (t_0) における測定値は距離 10,000m、速度 200m/s
- 測定ベクトルは次のとおり
[ \boldsymbol{z}_0=\left[\begin{matrix}10{,}000\200\\end{matrix}\right] ]
- 測定値は正確なシステム状態ではなく、ノイズを含んだ 確率変数 である
- 距離測定の標準偏差は (4m)
- 速度測定の標準偏差は (0.5m/s)
- 分散は標準偏差の二乗なので、測定共分散行列 (\boldsymbol{R}_0) は次のようになる
[ \boldsymbol{R}_0=\left[\begin{matrix}16&0\0&0.25\\end{matrix}\right] ]
- この例では、距離と速度の測定誤差は互いに無関係と仮定し、共分散行列の非対角要素を 0 とする
- 初期化時点では単一の測定しかないため、測定値を初期状態推定値として使うことができる
[ \boldsymbol{\hat{x}}_{0,0}=\boldsymbol{z}_0=\left[\begin{matrix}10{,}000\200\\end{matrix}\right] ]
- この方法が可能なのは 初期化段階 だけである
予測段階: 状態と共分散の伝播
- 次の状態を予測するために等速度の動的モデルを用いる
[ v_1=v_0=v ]
[ r_1=r_0+v_0\Delta t ]
- 行列形式の状態予測は次のとおり
[ {\hat{\boldsymbol{x}}}{1,0}=\boldsymbol{F}{\hat{\boldsymbol{x}}}{0,0} ]
- (\boldsymbol{F}) は 状態遷移行列 であり、(\Delta t=5s) のとき予測結果は次のようになる
[ {\hat{\boldsymbol{x}}}_{1,0}
\left[\begin{matrix}1&5\0&1\\end{matrix}\right] \left[\begin{matrix}10,000\200\\end{matrix}\right]
\left[\begin{matrix}11,000\200\\end{matrix}\right] ]
- 一般的な状態外挿、すなわち予測方程式は次のとおり
[ {\hat{\boldsymbol{x}}}{n+1,n}=\boldsymbol{F}{\hat{\boldsymbol{x}}}{n,n}+\boldsymbol{G}\boldsymbol{u}_n ]
- (\boldsymbol{u}_n) は入力変数
- (\boldsymbol{G}) は入力遷移行列
- この例では入力がないので (\boldsymbol{u}_n=0)
- 共分散は単純に (\boldsymbol{F}\boldsymbol{P}) では計算しない
- 共分散は分散と共分散の 二乗項 を含むためである
- プロセスノイズがないときの共分散外挿方程式は次のとおり
[ \boldsymbol{P}{n+1,n}=\boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T ]
- 例で初期共分散 (\boldsymbol{P}_{0,0}) を伝播すると、次の結果が得られる
[ \boldsymbol{P}_{1,0}
\left[\begin{matrix}22.25&1.25\1.25&0.25\\end{matrix}\right] ]
- 速度分散は (0.25m^2/s^2) のまま維持される
- 距離分散は (16m^2) から (22.25m^2) へ増加する
- 速度の不確かさが時間の経過とともに距離の不確かさへとつながる
プロセスノイズの反映
- 等速度仮定だけでは、実際の航空機運動を完全に説明するのは難しい
- 風のような未知の外部要因が速度に影響する可能性がある
- このような予測不能な影響は プロセスノイズ (\boldsymbol{Q}) で表される
- プロセスノイズを含む共分散予測方程式は次のとおり
[ \boldsymbol{P}{n+1,n}=\boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T+\boldsymbol{Q} ]
- 例ではランダム加速度の標準偏差を (\sigma_a=0.2m/s^2) と仮定する
- 分散は (\sigma_a^2=0.04m^2/s^4)
- (\Delta t=5s) のとき、プロセスノイズ行列は次のようになる
[ \boldsymbol{Q}
\left[\begin{matrix}6.25&2.5\2.5&1\\end{matrix}\right] ]
- プロセスノイズを加えた予測共分散は次のとおり
[ \boldsymbol{P}_{1,0}
\left[\begin{matrix}28.5&3.75\3.75&1.25\\end{matrix}\right] ]
更新段階: 測定と予測の結合
- (t_1) における2回目の測定値は次のとおり
[ \boldsymbol{z}_1= \left[\begin{matrix}11{,}020\202\\end{matrix}\right] ]
- この測定は強いノイズスパイクのため、最初の測定より信号対雑音比が低く、不確かさも大きい
- 距離測定の標準偏差は (6m)
- 速度測定の標準偏差は (1.5m/s)
- 測定共分散行列は次のとおり
[ \boldsymbol{R}_1= \left[\begin{matrix}36&0\0&2.25\\end{matrix}\right] ]
- (t_1) では、前段階で計算した 予測状態 と新しい測定値の両方を使える
- 予測共分散 (\boldsymbol{P}_{1,0}) の対角要素は (28.5)、(1.25)
- 測定共分散 (\boldsymbol{R}_1) の対角要素は (36)、(2.25)
- この場合、予測の不確かさは測定の不確かさより小さい
- Kalman Filter は、新しい測定をそのまま使うことも、予測だけを維持することもしない
- 予測と測定を 加重平均 として結合する
- 不確かさがより小さい側に大きな重みを置く
- 1次元形式での結合は次のとおり
[ \hat{x}{1,1}=K_1z_1+(1-K_1)\hat{x}{1,0} ]
- (K_1) は Kalman Gain であり、測定と予測にどの程度の重みを与えるかを決める
- モデル仮定が正しい限り、更新後推定の不確かさを最小化する
状態更新と innovation
- 行列形式の状態更新方程式は次のとおり
[ \hat{\boldsymbol{x}}_{1,1}
\hat{\boldsymbol{x}}_{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1-\hat{\boldsymbol{x}}{1,0}) ]
- 一般には、測定値とシステム状態が同じ物理量を表さないことがある
- デジタル温度計は電気信号を測定するが、システム状態は温度かもしれない
- このとき、予測状態を測定ドメインへ変換する 観測行列 (\boldsymbol{H}) が必要になる
- 一般的な状態更新方程式は次のとおり
[ \hat{\boldsymbol{x}}_{1,1}
\hat{\boldsymbol{x}}_{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1-\boldsymbol{H}\hat{\boldsymbol{x}}{1,0}) ]
- (\boldsymbol{z}1-\boldsymbol{H}\hat{\boldsymbol{x}}{1,0}) は innovation または residual であり、新しい情報を表す
- この例では、状態と測定がどちらも距離と速度なので、(\boldsymbol{H}) は単位行列である
Kalman Gain の計算
- 1次元の Kalman Gain は次のとおり
[ K_n=\frac{p_{n,n-1}}{p_{n,n-1}+r_n} ]
- (p_{n,n-1}) は予測状態分散
- (r_n) は測定分散
- 多変量 Kalman Filter では、Kalman Gain は行列となり、次のようになる
[ \boldsymbol{K}n= \boldsymbol{P}{n,n-1}\boldsymbol{H}^T \left( \boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T+\boldsymbol{R}_n \right)^{-1} ]
- 例で計算した (t_1) の Kalman Gain は次のとおり
[ \boldsymbol{K}_1= \left[\begin{matrix}0.4048&0.6377\0.0399&0.3144\\end{matrix}\right] ]
- 行列の逆行列は MATLAB の
inv(A)または Python のnumpy.linalg.inv(A)で計算できる- 実際の実装では、明示的に逆行列を計算するより、MATLAB の
A\bや Python のnumpy.linalg.solve(A, b)のように 線形システムを直接解く方法 のほうが一般に望ましい
- 実際の実装では、明示的に逆行列を計算するより、MATLAB の
更新結果と共分散の減少
- 例における innovation は次のとおり
[ \boldsymbol{z}1-\hat{\boldsymbol{x}}{1,0}
\left[\begin{matrix}20\2\\end{matrix}\right] ]
- Kalman Gain を適用した補正量は次のとおり
[ \boldsymbol{K}_1 \left[\begin{matrix}20\2\\end{matrix}\right]
\left[\begin{matrix}9.37\1.43\\end{matrix}\right] ]
- 更新後の状態推定値は次のとおり
[ \hat{\boldsymbol{x}}_{1,1}
\left[\begin{matrix}11{,}009.37\201.43\\end{matrix}\right] ]
- 多変量の共分散更新には Joseph form がよく使われる
[ \boldsymbol{P}_{n,n}
(\boldsymbol{I}-\boldsymbol{K}n\boldsymbol{H}) \boldsymbol{P}{n,n-1} (\boldsymbol{I}-\boldsymbol{K}_n\boldsymbol{H})^T + \boldsymbol{K}_n\boldsymbol{R}_n\boldsymbol{K}_n^T ]
- 文献では簡略形もよく登場する
[ \boldsymbol{P}_{n,n}
(\boldsymbol{I}-\boldsymbol{K}n\boldsymbol{H}) \boldsymbol{P}{n,n-1} ]
- 正確な算術では両者は同じ結果になる
- コンピュータ実装では、Joseph form のほうが一般に数値的に安定している
- 例では簡略化した共分散更新を用いて、次の結果を得る
[ \boldsymbol{P}_{1,1}
\left[\begin{matrix}14.57&1.43\1.43&0.71\\end{matrix}\right] ]
- 更新後推定の不確かさは、予測の不確かさや測定の不確かさより小さい
- 予測共分散の対角要素は (28.5)、(1.25)
- 測定共分散の対角要素は (36)、(2.25)
- 更新共分散の対角要素は (14.57)、(0.71)
- 理論上、新しい情報は不確かさが大きくても推定不確かさを減らす
- 実際のシステムでは、信頼しにくい測定を棄却しなければならない場合もある
次の予測と反復ループ
- Iteration 1 の予測段階は Iteration 0 と同じ方法で行う
- ただし、開始点は更新後の (\hat{\boldsymbol{x}}{1,1}) と (\boldsymbol{P}{1,1}) である
- 状態予測は次のとおり
[ \hat{\boldsymbol{x}}_{2,1}
\boldsymbol{F}\hat{\boldsymbol{x}}_{1,1}
\left[\begin{matrix}12,016.5\201.43\\end{matrix}\right] ]
- 共分散予測は次のとおり
[ \boldsymbol{P}_{2,1}
\boldsymbol{F}\boldsymbol{P}_{1,1}\boldsymbol{F}^\top+\boldsymbol{Q}
\left[\begin{matrix}52.86&7.47\7.47&1.71\\end{matrix}\right] ]
- 新しい測定がないまま時間が経つと、両方の分散は再び増加する
- 速度の不確かさが距離の不確かさをさらに大きくし、距離分散はより速く増加する
- Kalman Filter は、開始時に一度 初期化 した後、予測と更新を継続的に繰り返す構造で動作する
- 予測は状態遷移モデルにより、現在の推定と共分散を次の時点へ伝播する
- 更新は新しい測定と予測を Kalman Gain で結合し、現在状態と不確かさを更新する
1件のコメント
Hacker News のコメント
「入門者向けチュートリアル」を見るたびに期待するものの、たいてい失望していて、今回も例外ではなかった
序盤は良くても、必ずどこかの概念や重要な用語を十分に説明せずに先へ進んでしまう。ここでは「確率変数は確率密度関数で説明され、確率密度関数はモーメントで特徴づけられる。確率値のモーメントは、確率変数のべき乗の期待値である」という部分で止まってしまった。
確率値の指数に対する期待値なのか、確率値を何らかの累乗にしたものの期待値なのか、なぜ単なる確率値そのものではなくべき乗が特別なのかも分からない。著者たちが思考の流れの途中で急に分かりやすく説明するのを諦めてしまうか、そもそも土台となる概念をきちんと理解しておらず他人に説明できないかのように感じられて、もどかしい。Udemy のように講師に質問できればよいのだが、本の著者から返答を得る手段はない
著者が説明を一度でも十分にできないだけで全体が崩れ、フィードバックループがあると大いに助けになる。なければ結局、自分で責任を持って分からない単語や句を調べていくしかない。「確率変数」や「確率密度関数」のように十分理解できていない表現を調べ、Wikipedia、ChatGPT、教科書、動画などで補えばよい。この過程は再帰的なので、また分からない概念が出てくるが、そのまま掘り下げていけばよい。チューターの価値も、こうした深さ優先探索をうまく導いてくれる点にある。新しい分野では本文よりも背景知識を埋めるのに時間がかかるのが普通で、次に似たテーマを扱うときはもっと速くなるはずだ
こうした基礎的な概念を学部と大学院を通じて内面化できていなかったというのが、不思議に思えるほどだ
そのため、自分が当然知っていると思っていることを忘れてしまう。3blue1brown の動画でも似た問題を感じる。動画は美しいが理解が生まれるわけではなく、すでに知っている人は馴染みのある概念がきれいに表現されているのを見てうなずくが、私のような人間には前提条件が多すぎるように見える
Kalman フィルタを理解するには、まず確率の基礎とガウス分布の重要性を知る必要がある。数学的導出は、関連する確率分布がすべてガウス分布であると仮定し、ガウス分布は一次および二次モーメントが分かれば一意に決まる。結局、モーメントの導入は避けられず、その後にはかなり険しい数学が続く。Kalman フィルタは簡単な題材ではなく、Rudolf Kalman はあるインタビューで、自分のフィルタがなければ米国の月面着陸は不可能だっただろうと語っていた
単純な単変量の例から始めて修正し一般化できるので、これを Kalman フィルタを教える良い方法だとずっと考えてきた
数年前に Kalman の短い連続講義を聴いたが、彼は観測データを直接扱うことの美徳を非常に強く強調していた
先にモデルを仮定してデータに合わせようとするとバイアスが生じると考えており、この原則の良い例として Newton の Principia を挙げていた。Newton は Kepler の法則を説明するモデルを探し回ったのではなく、主に幾何学的な論証を用いて Kepler の法則から逆二乗の重力法則を導いた、という説明だった。彼は優れた講演者で、意見も強く、当然 Kalman フィルタのアイデアも説明していたが、自分の仕事で直接使うことがなかったため、詳細はずっと前に忘れてしまった
実際に、非常に複雑でよく知られたシステムを配備した科学者やエンジニアたちと仕事をしたことがあるが、そういう人たちは流行のアルゴリズムに概して懐疑的で、たいてい第一原理から始める。90% の場合は、単純な、あるいは運動モデルすらない普通の線形 Kalman フィルタで十分だった
最近、友人にサイドプロジェクト用の Kalman フィルター実装を頼まれて、いろいろな資料やこのWebサイトを読んだが、いまだにどう実装すればいいのか分からない。
どれも「フクロウの残りを描いてください」式に見える。プログラマーが説明するように、たとえばシグマ記法ではなく配列の反復で説明している資料があるといいのだが。自分の理解では、Kalman フィルターは位置、速度、場合によっては加速度の移動平均のように見え、センサーが示す値の代わりに「実際の値」を推定するためにこの3つの値を使うもののように思える。
ただし、まずダイナミクスを説明する数学を書き下す必要がある。Kalman フィルターは、特定のシステムダイナミクスに Bayes の定理を適用したものに近く、測定値を受け取ったときに現在の状態推定をどう更新するか、その測定後から次の測定までの間にシステムダイナミクスが不確実性にどう影響するかを反復的に適用する。追跡対象が時間とともにどう変化するかを示すダイナミクスモデルがまず必要だ。それがなければ実装が混乱するのは避けられない。Bayes フィルターや粒子フィルターを先に読んでみると、行列なしでも概念をつかむ助けになる。数学を知らなくてもソフトウェア開発者になれるという話はいつももどかしい。Webページを作るだけならそうかもしれないが、数学を多く知っているほど、問題をモデル化して解ける範囲はずっと広がる。
重要なのは、その 状態をもとに推定し、測定を受けたあとで2つの情報を使って次の状態を反復的に調整する方式だ。式を理解すれば、コーディング自体はかなり簡単。この資料が役に立つかもしれない: http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies
外部制御とプロセスノイズが追加される場合があり、内部状態は値のベクトルで表現される。また、内部状態が観測へどう変換されるかについての線形モデルと観測ノイズも必要になる。
x はモデル状態、F は線形状態遷移モデル
x(t+1) = F x(t)、Q はプロセスノイズの共分散行列なので実際にはx(t+1) = F x(t) + N(0,Q)、H は線形観測モデル、R は観測ノイズの共分散行列、u と B は任意の外部制御ベクトルとその作用の仕方を表す。N(0,Q)は平均0、共分散 Q の正規分布である。たとえば移動する物体なら、モデル状態は位置 x と速度 v になり得る。レーダーなどでは通常、位置だけを観測し、現在速度は観測できないため、観測モデルは位置だけを取り出す形になる。Kalman フィルターを使う前に、こうした「フクロウ」がまず必要であり、それがどんなプロセスかに応じて自分で決めなければならない。Kalman フィルターは、状態遷移モデルと観測のどちらにもノイズが含まれるとき、各時点の実際の状態ベクトルを最適に推定する方法を教えてくれる。多くのチュートリアルは、選んだプロセスモデルの部分と Kalman フィルターの部分を混ぜて説明するので混乱しやすく、1次元の定数モデルのような小さすぎる例では、ダイナミクスモデルが式の中で消えてしまい、かえって混乱が大きくなる。
冒頭の数章で Kalman フィルターと情報フィルターをうまく扱っている。
センサー測定値にノイズがあると分かっているとき、複数サンプルの平均を取って実際の値により近い推定値を得ようとする方式で、センサーノイズの程度が分かれば、何個のサンプルを平均すべきかも見当がつく。ここでは、すべての検出値や推論値を、平均と分散でパラメータ化された ガウス分布として推定すると考えればよい。
加速度、速度、位置を持つ物理システムでは、時刻 t に位置 p、速度 v なら、t+dt の位置はおおよそ
p+(v*dt)になる。加速度の推定で速度も更新でき、制御中のシステムなら、指令した力によって加速度モデルも更新できる。しかし初期推定には不確実性があるため、このプロセスモデルだけを先へ進め続けると不確実性が増え続け、最終的には役に立たなくなる。Kalman フィルターは、センサー情報とプロセスモデルを組み合わせ、どちらか一方だけを使うよりも関心のある量をよりよく推定しようとする手法だ。各時間ステップで、以前の状態推定に基づいてプロセスモデルで状態を予測し、現在のセンサー測定で平均と不確実性を更新する。基本的な Kalman フィルターでは、プロセスモデルが線形で、すべての推定が単純なガウス分布であると仮定したうえで、モデルとセンサーのどちらをどの程度信頼するかを Kalman ゲインという乗算係数で決める。
Kalman フィルターに関する別の段階的な動画チュートリアルの再生リスト: https://www.youtube.com/watch?v=CaCcOwJPytQ&list=PLX2gX-ftPV...
直感をつかむと Kalman フィルターは本当に興味深く、粒子フィルターも扱ったり可視化したりするのが楽しい。
この本を持っていて、実際の問題にかなりうまく使ったことがある。
何度読み返しても追いにくい部分がいくつかあるが、全体としてはかなり良い。
関連して、もう一つ良い記事: Is the Kalman filter a low-pass filter? Sometimes!
https://jbconsulting.substack.com/p/is-the-kalman-filter-jus...
リアルタイムで顔の周辺を切り出す映像で、仮想カメラの動きの揺れを減らすために使ったことがある。検出された顔位置のストリームを Kalman フィルターのワーカーに送り、安定したカメラ位置のストリームを返してもらう方式だった。
計算資源が限られている場合、Kalmanフィルターは優秀だが、個人的には粒子フィルターのような、より新しく高度なモデルのほうが好み
粒子フィルターの利点は、非線形な物理現象や非ガウス分布を含む複雑な状況を扱える点にある。たとえば車両GPSでは、直近の旋回履歴をもとに道路地図を使ってあり得ない位置を除外できる。ガウスフィルターではこのような処理はできず、数ブロックを覆うぼんやりした塊を作るだけになってしまう
また、オフライン処理向けに、粒子フィルター以外でおすすめできる、より新しい、あるいは高度なモデルがあるのかも気になる
2007年に広告技術の会社にいたが、CEOと研究チームはGoogleとMSNネットワークの広告キャンペーンを最適化するためにKalmanフィルターに夢中だった
記憶ではある程度効果があったが、今では特許出願を見つけられず、ZetaとWalmartがその技術を買い取った
Kalmanフィルターの解説記事は、ほとんどいつも「直感的な例としてサーモスタットを考えてみよう。分かった? よし! では、もっと直感的にするために高度な線形代数を見ていこう」といった感じで始まる
数学にいきなり飛び込まないKalmanフィルターの解説を見たことがあるか気になる
目を閉じて壁に向かって歩くと、時間が経つにつれて自分の位置に対する確信は低下し、指が壁に触れた瞬間に位置への確信が急に高まる。前半が予測ステップで、後半が測定更新。線形代数は、ガウスノイズを持つ線形動力学システムでその重みを計算する方法にすぎない
Kalmanフィルターは正規分布のような統計的仮定を置くため、少なくとも統計と平均・共分散行列は知っている必要がある。その程度なら、https://sites.ualberta.ca/~dwiens/stat679/meinhold&singpurwa... の第4節までは追えるはず。第4節以降は実装に必要な数学計算を押し進める部分なので、理解を大きく深めるものではない
すべてをまず1次元で扱ってから多次元問題に拡張するやり方が、概念をつかむうえで確かに役立つ。講義プレイリストはこちらのようだ: https://youtube.com/playlist?list=PLAwxTw4SYaPkCSYXw6-a_aAoX...
Kalmanフィルターの部分は「Tracking Intro - Artificial Intelligence for Robotics」という動画から始まる。無料講義もここにあるようだが、アクセスするにはログインが必要: https://www.udacity.com/course/intro-to-artificial-intellige...
Kalmanについてよく知らなかったので、このウェブサイトの入門記事を読んでみたが、いまひとつ腹落ちしなかった
サンプルグラフを考えているうちに、ずっと理解しやすい指数移動平均のように見えてきた。Googleで比較を探すと、Stats Stack Exchangeでは「ランダムウォーク + ノイズ」に対してEMAはKalmanと同じくらい良いとされており、Brown Universityの2003年のJoseph J. LaViolaの論文では、二重指数平滑化アルゴリズムはKalmanおよび拡張Kalmanと品質は同等でありながら、135倍速く、より単純だと示されていた。
二重指数平滑化はKalmanよりはるかに理解しやすいので、LaViolaの論文が正しいと仮定するなら、Kalmanを理解するためにこれ以上労力をかけるつもりはない