何爲濾波?什麼是卡爾曼濾波?

門外漢可以通過前面幾句話大概知道什麼是濾波及爲什麼卡爾曼濾波只能處理線性高斯問題。

所謂濾波,實際上是要去掉自己不想要的信號,保留想要的部分。一般來說,是把過程中的噪聲去掉。 爲什麼卡爾曼濾波只能處理線性高斯,緣於算法的一些前提假設,1、當前估計是前一個估計個當前觀測值的線性疊加;2、卡爾曼算法模型中重要的參數矩陣是線性的;3、估計值是服從高斯分佈的(系統狀態是一個高斯分佈的隨機變量)。 前兩個說明爲什麼線性,後一個說明爲什麼高斯。


【本文轉自】http://blog.csdn.net/tudouniurou/article/details/6277512

一直在看,一直不懂。 我這人學數學的毛病,就是需要非常細緻的知道每個變量的含義,誰變誰不變必須清清楚楚告訴我,否則我就沒有那個直覺。 anyway,從這篇文章入手吧:

http://www.cs.unc.edu/~welch/kalman/media/pdf/kalman_intro_chinese.pdf

所謂濾波,實際上是要去掉自己不想要的信號,保留想要的部分。一般來說,是把過程中的噪聲去掉。

卡爾曼濾波的默認假定是,世界充滿噪聲,任何測量結果都有噪聲,狀態轉移過程會有噪聲,你想知道系統的真實值麼?玩兒蛋去吧。

卡爾曼濾波另一個重要假定模型是這樣的,一個系統會處在各種不同的狀態,並且會在狀態之間轉化來轉化去。但是呢,倒黴的是我們誰也不知道該系統當前到底是在什麼狀態;但是呢,幸運的是我們可以通過測量的結果猜測到系統當前在一個什麼狀態。

那啥叫狀態呢?例如系統的速度,加速度,溫度,腦殘度都算。離散系統的話,我們可以假設一個黑盒,黑盒裏有許多顏色的燈(紅橙黃綠青藍紫),同時只能有一個顏色在亮着,ok,哪個燈在亮就是當前狀態。

 

下面就是建模:

z_t = H*x_t + v_t;   (1)

x_t = A*x_(t-1) + B*u_(t-1) + w_(t-1);  (2)

初看起這倆式子來,我也頭大,不過稍微分析一下也不太難。x_t是t時刻系統所在狀態,z_t是所謂觀測值,u_t是系統控制變量(已知,但我做的領域一般用不着),w_t , v_t都是噪聲。 

那麼式子(1)就是想說,觀測值和系統狀態的關係: 如果你看到種子發芽了,那麼它的狀態就是剛出生;如果你看到它開始長葉兒了,那狀態就叫生長期;如果丫開花了,就叫啥啥期;如果結果了,就叫成熟期;如果蔫兒了,就叫嗝屁期。 

哦,對了,個人理解一下,以上公式限定爲了線性系統,傳說中卡爾曼濾波是線性的,來源就在這裏了,誰叫你是矩陣乘向量呢,你要是寫成f(x_t),那有可能就是非線性的了。

那麼式子(2)就是說,前一時刻狀態和下一時刻狀態之間的關係。我在這裏卡了好久,總是以爲丫是馬爾科夫過程,所以就完全無法理解A這個係數是憑啥得來的。其實,就是一個固定的轉移方程,該方程完全沒有概率問題。

所以!以上式子中,固定下來的是H, A, B,這三個矩陣千年不變,萬年不變,並且是事先設定好的,全都已知。未知的話....你自己編一個模型吧。 那麼w_t,v_t 在這裏限定爲兩個高斯白噪聲N(0, Q)和N(0, R)。 哦,對,這裏要記得,Q,R都tm是協方差矩陣啊,因爲,系統狀態和觀測值都是向量。我對協方差可鬱悶可鬱悶了。這裏提一句,我就完全無法理解協方差想表達什麼,爲什麼倆隨機變量獨立,協方差一定爲0,雖然我也知道怎麼推導,但就是不能直觀理解之,如果有人知道,還煩請告知。

那繼續扯淡。卡爾曼濾波,本質是想要預測下一步的觀測值,或者實時監控一下系統所在狀態。但一般在我這個領域,大家還都是在玩兒預測,那咱就從預測角度分析。OK,直覺上,給定上一個位置的狀態x_(t-1),式子(2)足夠了。但是,回到開始的默認假設,式子(2)得到的結果x^-_t那是各種不準確啊。不準確怎麼辦?那就去看觀測值唄,於是得到觀測值z_t,但是觀測值也不準確唉,那怎麼辦?噹噹噹當,卡爾曼告訴我們一個灰常牛B的事情,一個相對準確的系統值具有如下結構:

x&_t = x&-_t + K( z_t - H*x_(t-1) );  (3)

提一下,這裏" & "表示估計值," - "表示是用前面式子算出來的估計值,不帶" - "表示是最後的估計值。 (3)這個式子是想說,你不是式子估計和觀測值都不準麼,那麼你把他倆加個權,求個和,那就可能更準確了。啥?你說這個式子不像加權?你把丫拆了,倒騰倒騰不就像了。 所以,最牛B就牛B在了這個“K”,傳說中的卡爾曼增益。 這個K怎麼得到的?我也不知道。 文章說法是,定義誤差 e_t = x_t - x&_t ,P_t爲此誤差的協方差矩陣,目的是使這個誤差協方差矩陣最小化,把(3)代過去,於是折騰來折騰去,再求個導數爲0,解得K,這個關鍵值的算法:

K = P-_t * H^T * ( H * P-_t * H^T + R) ^(-1);  (4)

哦,對了,另外注意一點,從此以後,我們就都在估計上做文章了,你只要記得,咱永遠看不到真實值就行了,於是我們的式子裏不是帶"&"就是帶"-"。

那麼式子(4)就是在說,你丫這麼着就把K求出來了。於是,問題就變成了這個P-_t怎麼個求法。

說到這裏,傳說中的卡爾曼濾波就算講完了。神馬?你說P-_k還沒求呢。是啊,卡爾曼濾波一共就倆需要求的玩意兒,還都tm是迭代求解,一個就是這個P-_t,另一個就是狀態x-_t。你隨便給個初始值,然後就迭着吧。

言歸正傳,我還得給出迭代的公式:

x-_t = A * x&_(t-1) + B * u_(t-1);  (5)

P-_t = A * P_(t-1) * A^T + Q;    (6)

大家一定別搞混Q和R誰是哪個公式冒出來的啊。 另外嚴重關切一下這裏"-","&"以及不加的關係。 注意到啥沒有?對了,(6)式中等號右邊的P_(t-1)不帶任何符號,嘿嘿,那自然是還差一個公式啦:

P_t = (I - K_t * H ) P-_(t-1);   (7)

大功告成,以上就是傳說中的卡爾曼濾波的迭代求解方法,如果你要預測狀態呢,就用式子(5)的結果;如果預測觀測值呢,就把式子(5)的結果乘個H;如果是監測狀態呢,就用式子(3)的結果。

至於一切式子中的推導過程,還有爲神馬是這樣求出來的,咕~~(╯﹏╰)b,本人一概不知。淚奔告退。

 

最後小注一下,文章指出,如果Q,R是常數,K會收斂,也即P也會收斂到常量。 另外,大家經常詬病卡爾曼濾波都是假定高斯分佈,我勒個去,這裏的高斯分佈到底說誰呢?噪聲項?雖然看上去應該是,但我打賭不是。可是其它又都是定值,唉,頭大。我本來就是爲了理解這句話纔來學習卡爾曼濾波的。 還得慢慢學,繼續淚奔

PS, 於是,果然,文中提到x_t是一個隨機變量,並且在已知z_t的情況下 p(x_t | z_t) 服從N( x&_t, E[(x_t - x&_t)(x_t - x&_t)]),切記切記,這裏所說的正態分佈,是指已知觀測值的情況下,系統狀態是一個高斯分佈的隨機變量。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章