Kalman Filter 學習筆記

Dboy Liao
5 min readDec 4, 2020

--

從一開始接觸 Machine Learning 的時候就聽過 Kalman filter 這東西。一方面是自己當時對 Bayesian 的東西不是太清楚,一方面對於一些數學工具也不熟悉,所以第一次看到 Kalman filter 的時候,只是覺得怎麼這麼多奇怪的步驟。但時至今日,已經可以從一些其他的角度來看 Kalman filter 的算式,也比較能理解當時設計出 Kalman filter 的 Rudolf E. Kálmán 到底在想什麼。所以就想寫一篇記錄一下自己的心得與思路,希望過幾年再看的時候一樣可以看懂。

符號定義

https://en.wikipedia.org/wiki/Kalman_filter#/media/File:Kalman_filter_model_2.svg

簡單的來說,我們有興趣的是 x ,只是因為一些測量誤差等等的問題,導致我們無法直接觀測 x ,只能看到 z ,同時我們也容許使用者對系統進行輸入,輸入的值是 u ,所以我們想問: 在已知 z、u 的值的情況下,我們對於 x 的估計值是多少?誤差的分佈又會是多少?(也就是 P)

除此之外,Kalman filter 要求 x 與 z 之間要有以下關係:

其中 w 跟 v 都是 normal distribution 且其 variance matrix, Q 跟 R 是已知知道的。除此之外我們也知道 F、B 跟 H 這些矩陣的值。

在看這些模型的時候,總是需要搞清楚知道什麼不知道什麼,才能在實作的時候派上用場,不然導公式很開心到時候程式寫不出來 XD

所以說,有了這些符號之後,我們可以把 Kalman filter 想解決的問題想成:

如果我們有上次對於 x 跟 P 的預測值,在新資料 (新的 z 跟 u) 來的時候,我們怎麼更新 x 跟 P 的預測值?而且這個預測值可以保證一些好的性質?

Kalman Filter

一言以蔽之,猜好猜滿就是 Kalman Filter 的本質。以下我們來拆解它的思路。

  1. 用 k-1 時的資訊,先猜一個 x

2. 看看猜出來的 x 代 z 的公式裡會差多少 (residual)

3. 有了這個誤差,我們想用的線性項去修正它

這邊就來了個新問題,上面的 K 應該要是多少?

我們當然會想要一個最佳的 K,但既然是“最佳”,以 machine learning 或最佳化問題的角度來說,我們就會需要一個 loss function。那 Kalman filter 李用的 loss function 也很單純,這個猜出來的 x 要跟真的 x 越近越好。那因為真的 x 不可知,所以我們考慮誤差的期望值。也就是說,這個最佳的 K 可以寫成:

從最後一個等式可以看出,其實 Kalman filter 的本質就是求出一個最佳的 K 之後,再用現在的觀測值 z 跟上一次的猜測值做個加權平均 (當然是矩陣的形式) ,得到一個修正過後更好的猜測值。

當然你可以硬展上面的期望值然後對 K 微分用一階條件找出一個最佳的 K,但 wiki 上有的解法有順便寫出 P 的遞迴式,然後用這個遞迴式去解 K,算是更漂亮的解法,這邊簡單導一下:

用一階條件 (可以用公式) 可以求出:

想看完整求解過程的人可以到 Wiki 上看,不過到目前為止,應該不難看出 Kalman 的完整思路: 先往前猜一個解,然後用已知的模型,去找出一個修正後更好的解。

結語

看到這邊,其實會發現 Kalman Filter 的關鍵在於找到最佳的 K,而這個“最佳” 其實是被一個 loss function 去控制的。所以說,你可以修改那個 loss 讓你的 Kalman Filter 給你一個符合你需求的結果。但說歸這麼說,我自己想了一下如果不是用 mean square error 的話,P 可能不會有那麼漂亮的遞迴式,所以 K 的公式解可能也不會太漂亮 XD

但至少下次再看到 Kalman Filter 的時候,我應該不會被那麼多奇怪的矩陣運算嚇到了吧。這樣也算有學到一些些想法也不錯。

順道一提,如果從 Bayesian 的角度來看,Kalman Filter 就是個標準的 Bayesian regression,然後 prior 是挑 normal distribution ,posterior 也是 normal distribution ,那因為 normal 跟 normal 之間是 conjugate prior 的關係,所以每次更新 posterior 就只需要更新 x hat 跟 P 即可,因為那兩者剛好就是 posterior 的 mean 跟 covariance matrix,更新完之後就得到新的 posterior distribution,也就是一個新的 normal distribution。

--

--

Dboy Liao

Code Writer, Math Enthusiast and Data Scientist, yet.