文章以最小二乘法為切入點展開討論卡爾曼濾波

。卡爾曼濾波與最小二乘法只有很小的區別。

經典最小二乘法解決的問題: 考慮下面的 k 個測量:

y_1=h_1x+v_1\ y_2=h_2x+v_2\ vdots\ y_k=h_kx+v_k

每次測量都有自己的誤差. v 不可觀測, E(v)=0h,x 是適當維度的向量。最小二乘法通過最小化下面的式子來獲得對 x 最有可能的估計:

J=sum_{i=1}^k(y_i-h_ix)^2

hat x =arg min_{x} J

這產生了一個問題,那就是每次測量誤差都不一樣,不能一概而論,如果每次測量都同樣的權重。會導致結果被某些誤差比較大的數據帶偏。(其實多數情況下誤差分佈也是不知道的),所以更通用的形式是帶權最小二乘法:

J=sum_{i=1}^kig(y_i-h_ixig)^2frac{1}{E(v_i^2)}=sum_{i=1}^kig(y_i-h_ixig)^2frac{1}{sigma_i^2}

其中:

DBig(frac{y_i-h_ix}{sqrt {D(y_i-h_ix)}}Big)=EBig(frac{v_i^2}{D(v_i)}Big)=1


考慮一個有點複雜的問題:

兩架飛機 A,B 我們想通過在 A 中觀察到的 B 位置信息,近似得到速度,加速度,等信息。

而往往我們自身的狀態也在改變。我們對自身狀態的改變也是一個帶有雜訊的測量。

這一過程可以表示為:

x_k=F_{k-1}x_{k-1}+G_{k-1}u_{k-1}+w_{k-1}	ag{1}

y_{k}=h_kx_{k}+v_{k}	ag{2}

w_,v 是不相關,均值為 0 的雜訊。一般記: hat x 表示對 x 估計

這裡,如果我們單看 (2) 式,這其實是一個最小二乘法可以解決的問題。

(2) 式子對應觀測數據。比如第 k 次測量 B 的相對位置,也就是 y_k 則可以驗證 x_k 。理想情況下,我們估計的  hat x_k 會有: h_khat x_k=y_k .往往測量是有誤差的(v_k)而在驗證之前,因為上一時刻A的速度,位置等狀態信息與現在有改變,導致測量的結果與A狀態的改變有關。要通過 (1) 式子對歷史x_{k-1} 進行狀態轉移。 這相當於不同參考系觀測的數據要處理到同一個參考系。這是因為一個人看到另一個人速度的快慢也跟自身速度有關。

(1) 式是一組狀態轉移, u_kk 時刻,系統的一個輸入。 F_k 則是對上一時刻狀態的轉移。例如,上一時刻 A 觀察到 B 的位置信息到當前的變換。這裡G_ku_k 理解為參考系 A 狀態的改變。比如產生了一個加速。改變了你觀測 B 的相對加速度。

卡爾曼濾波將會以下面的方式來估計狀態:

上圖中,假設 A 只能得到B 相對於自身的位置和兩次測量之間的時間間隔,以及自身位置速度,加速度等信息。

黃色箭頭表示我們對 B 的速度,加速度等狀態的估計。由於 Ak-1 時刻到與 k 時刻速度,加速度,位置等信息的不同,所以需要先通過狀態轉移對歷史估計轉移到新的估計。再利用 B 最新的位置來 矯正 轉移後新的估計。獲得 k 時刻 B 狀態的估計。


如果沒有 (1) 的狀態轉移,可以直接最小二乘法通過極小化目標函數來求 hat x

注意:此時可以假設 A 相當於靜止的。且 B 勻加速運動,觀測信息 h 是總時間的轉移矩陣而不是時間間隔。你可以認為 h=[1,t,frac{1}{2}t^2] x=[x_0,v,a]^T .這個舉例只是你便於理解上面 (1),(2) 組成的系統,也可以不用參考。由於 A 的靜止,我門忽略掉  (1) .此時就是最小二乘法可以解決的問題。

最小二乘法

J=(H_khat x-Y_k)^TR_k(H_khat x-Y_k)=(hat Y_k-Y_k)^TR_k(hat Y_k-Y_k)

其中, H_k^T=[h_1^T,h_2^T,dots h_k^T],Y_k^T=[y_1,y_2,dots y_k]

R_k=left[egin{matrix}sigma^{-2}_1&0&0&dots&0\ 0&sigma^{-2}_2&0&dots&0\ vdots&vdots&vdots&ddots&vdots\ 0&0&0&dots&sigma^{-2}_k end{matrix}
ight]

其中: sigma^2_i=E(v_i^2)

R_k 對每一次觀測進行歸一化.(這裡,其實默認假設了 E(hhat x)=y )

你也可以認為 R_k 表示了權重,即帶權最小二乘法(其實權重可以不僅僅限於 sigma

為什麼權重要是 R_k 呢。單看 (2) 式,不同時刻誤差的大小,讓我們對某些測量結果不是那麼相信。但雖然有不好的測量,但也一定程度上反映了真實的結果。經過歸一化後,每次測量誤差都變成了均值為 0 ,方差為 1 。而方差相同,意味著兩次測量的可信度相同了。

這裡其實假設了我們已經知道了測量誤差的方差,但現實中我們往往是不知道的。把它假設出來,只是為了便於數學上的說明。如果不知道,那麼大可認為方差都是一樣。此時第一直覺是設置一個常數。其實大可認為是 1 。因為此時不管取何數值,都不會影響最終結果。因為各項權重都是一樣的。

那麼一般最小二乘法中, R_k=I	imes c,(c為常數) ,按照帶權最小二乘法來說,我們默認了 sigma_k^2=c^{-}

經典的求導,令:frac{partial J}{partial hat x}=2hat x^TH_k^TR_kH_k-2Y_k^TR_kH_k=0

則: hat x=(H_k^TR_kH_k)^-H_k^TR_kY_k

一般會記:

P_k=(H_k^TR_kH_k)^- 	ag{3}

正如標題曲線擬合那樣,最小二乘法曲線擬合是不會隨時間變化的。而 (1),(2) 式組曾的系統卻反應出的是一個會變的 hat x ,也就是說, hat x_k,hat x_{k-1} 是有區別的。所以 y_k,h_ky_{k-1},h_{k-1} 兩者測量的 x 已經不一樣了。

下面你會看到卡爾曼濾波如何將最小二乘法應用到上面 (1)(2) 組成的系統中。


協方差矩陣

注意: P_k=(H_k^TR_kH_k)^-=E((hat x-x)(hat x-x)^T) ,即為 hat x 的協方差矩陣。這是卡爾曼濾波的關鍵。

證明:

hat x-x=(H_k^TR_kH_k)^-H_k^TR_kY_k-x

=(H_k^TR_kH_k)^-H^T_kR_kY_k-(H_k^TR_kH_k)^-H^T_kR_k(Y_k-V_k)

=(H_k^TR_kH_k)^-H^T_kR_kV_k

其中: V_k=[v_1,v_2,dots v_k]^T

解釋一下:

當我們知道誤差 V_k 時,這其實就是確定性求解。

Y_k-V_k=H_kx

H_k^TR_k(Y_k-V_k)=H^T_kR_kH_kx

x = (H_k^TR_kH_k)^-H^T_kR_k(Y_k-V_k)

則:

EBig((hat x-x)(hat x-x)^TBig)=(H_k^TR_kH_k)^-H_k^TR_kEig(V_kV_k^Tig)R_k^TH_k(H_k^TR_kH_k)^-

=(H_k^TR_kH_k)^-=P_k

這裡, E(V_kV_k^T)=R_k^-E(v_iv_j)=0,i
ot= j ,這是因為,不同時刻的測量誤差是不相關的。

注意:到這裡我們只需要知道了協方差矩陣即可立即有: hat x = P_kH_k^TR_kY_k

進一步令 r_k=sigma^{-2}_k=frac{1}{E(v_k^2)}

P_k=(H^T_kR_kH_k)^-=(H^T_{k-1}R_{k-1}H_{k-1}+h_k^Tr_kh_k)^-=(P_{k-1}^-+h_k^Tr_kh_k)^-

得到一組遞推關係。將協方差轉為在線計算。


協方差傳遞

注意,之所以要傳遞協方差很容易理解。上一時刻與當前時刻的狀態是不同。比如參考系 A 位置,速度,加速度的改變。

由於 P_k 就是協方差 (同時也是(H^T_kR_kH_k)^-) 的這一性質,那麼當經過 (1) 式,狀態轉移時,協方差也可以傳遞。

P_k=EBig((hat x_{k}-x_{k})(hat x_{k}-x_{k})^TBig) =E((F_{k-1}hat x_{k-1}+G_{k-1}u_{k-1}+w_{k-1}-x_{k})(F_{k-1}hat x_{k-1}+G_{k-1}u_{k-1}+w_{k-1}-x_{k})^T)

對於:

E(F_{k-1}hat x_{k-1}+G_{k-1}u_{k-1}+w_{k-1})=F_{k-1}x_{k-1}+G_{k-1}u_{k-1}=x_{k}

解釋一下,對於前面的式子中,都是在最小二乘法的背景下來討論的。那個時候, x 是不隨時間變化的。而在加入 (1) 的狀態轉移後,狀態的轉移,使得 k-1 時刻的x_{k-1}k 時刻的 x_{k} 有所不同。所以要有下標來做時間上的區分。

那麼:

E(F_{k-1}hat x_{k-1}+G_{k-1}u_{k-1}+w_{k-1}-x_{k})

=E(F_{k-1}(hat x_{k-1}-x_{k-1})+w_{k-1})

協方差傳遞矩陣為:

P_k=F_{k-1}P_{k-1}F^T_{k-1}+Q_{k-1}	ag{4}

其中: Q_{k}=E(w_{k}w^T_k) .

這樣就方便我們將最小二乘法擴展到 (1),(2) 所組成的系統。


卡爾曼濾波

 x^{(-)}_k 表示在不參考 y_kh_k 時,系統對 x_k 的估計。

x_k^{(+)} 表示參考了 y_k,h_k 後,系統對 x_k 的估計。

x^{(-)}_k=F_{k-1}x_{k-1}^{(+)} +G_{k-1}u_{k-1}	ag{5}

P_{k}^{(-)}=F_{k-1}P_{k-1}^{(+)}F_{k-1}^T+Q_{k-1}	ag{6}

P_k^{(+)}=(P_{k}^{(-)-}+h_{k}^Tr_kh_{k})^-	ag{7}

這裡,為了區分矩陣的逆。用上標 (-) 表示先驗。

但,此時 P_k^{(+)}	imes H_k^TR_kY_k
ightarrow x_k^{(+)} 這個操作是不對的,按照 A,B 來說因為參考系 A 在不斷的運動。觀察到的數據兩個時刻差異可能很大。但被觀察的 B 卻是一個勻加速運動這就好比你 過去的觀察數據 現在的觀察數據 參考系的 狀態一直在改變所以最好只是利用當前觀測數據來修正,不要牽扯過去。其實過去的數據也通過狀態轉移來傳遞,例如協方差。但沒必要所有都傳遞

所以修改最小二乘法。使它只需要使用 h_k,y_k (即最新的觀測數據)來更新修正 hat x_k^{(+)}


最小二乘法與卡爾曼濾波

在最小二乘法中:

hat x_k=P_kH^T_kR_kY_k 得: H_kR_kY_k=P_k^-hat x_k

因為: P_k=(H_k^TR_kH_k)^-=(P_{k-1}^-+h^T_kr_kh_k)^- ,其中: r_k=frac{1}{sigma_k^2}

得到: P_{k-1}^-=P^-_k-h^T_kr_{k}h_k

整理一下:

hat x_k=P_kH^T(k)Y(k)

=P_kBig(P_{k-1}^-hat x_{k-1}+h^T_kr_ky_kBig)

=P_kBig((P_k^--h^T_kr_kh_k)hat x_{k-1}+h^T_kr_ky_kBig)

=hat x_{k-1}+P_{k}h^T_kr_k(y_k-h_khat x_{k-1})

這樣,我們不需要維護 H_k,Y_k(1) 的狀態轉移下的形式。只需要維護 x,P

在卡爾曼濾波中的形式為:

hat x^{(+)}_k=hat x_{k}^{(-)}+P_{k}^{(+)}h^T_kr_k(y_k-h_kx_k^{(-)})	ag{8}

結合 (5),(6),(7) 共同組成了卡爾曼濾波的基本形式。其實就是最小二乘法

到這裡,唯一與我們看到的卡爾曼濾波那幾個公式形式不同的是 P_k的計算。下面給出遞推計算 P_k .

有時候,為了方便計算,會定義: K_k=P_{k}^{(+)}h^T_kr_k .

出現了 經典的五個公式的影子。


遞推計算 P_k

一個精巧的矩陣反演:

任意給定兩個可逆矩陣 A,D

left[egin{matrix}A&B\ C&Dend{matrix}
ight] 	ag{9}

令: E=D-CA^-B,F=A-BD^-C ,計算可得:

left[egin{matrix}A&B\ C&Dend{matrix}
ight] left[egin{matrix}A^-+A^-BE^-CA^-&-A^-BE^-\ -E^-CA^-&E^-end{matrix}
ight] =I	ag{10}

left[egin{matrix}A&B\ C&Dend{matrix}
ight] left[egin{matrix}F^-&-A^-BE^-\ -E^-CA^-&E^-end{matrix}
ight] =I	ag{11}

這也就是說,只要矩陣 A,D 可逆: (A+BD^-C)^-=A^--A^-B(D+CA^-B)^-CA^-	ag{12}

那麼遞推計算 P_k=(H_k^TR_kH_k)^-=(P_{k-1}^-+h_k^Tr_kh_k)^-

根據 (12)

P_k=P_{k-1}-frac{P_{k-1}h^T_kh_kP_{k-1}}{r_k^-+h_kP_kh^T_k}=Big(I-frac{P_{k-1}h^T_kh_k}{r_k^-+h_kP_kh^T_k}Big)P_{k-1}	ag{13}

令:

K_k=P_kh^T_kr_k =frac{P_{k-1}h^T_k}{r_k^-+h_kP_{k-1}h^T_k}	ag{14}

則:

P_k=(I-K_kh_{k})P_{k-1}	ag{15}


卡爾曼濾波更新公式總結

如此,卡爾曼濾波的基本形式也已經走通。本質上還是最小二乘法。只是在狀態轉移時傳遞了協方差。那麼最小二乘法的幾種形式均可以引用在卡爾曼濾波。例如設置遺忘。

hat x_{k}^{(-)}=F_{k-1}hat x_{k-1}^{(+)}+G_{k-1}u_{k-1}	ag{16}

P_{k}^{(-)}=F_{k-1}P_{k-1}^{(+)}F_{k-1}^T+Q_{k-1} 	ag{17}

K_{k}=frac{P_{k}^{(-)}h_{k}^T}{r_k^-+h_kP_{k}^{(-)}h^T_k}	ag{18}

P_{k}^{(+)}=(I-K_kh_k)P_{k}^{(-)} 	ag{19}

hat x_k^{(+)}=hat x_{k}^{(-)}+K_k(y_k-h_khat x_{k}^{(-)}) 	ag{20}

關於這5個公式:

回到最初 A,B 的那個問題。當我們知道k-1 時刻的 hat x_{k-1} 。到了 k 時刻,產生了一組觀測數據: h_k,y_k .但由於 A 的速度一直在改變。那麼我們要推算以現在的狀態 (A) 觀察歷史的數據 (k-1時刻) 應該是什麼樣的。比如 AB 的反向上做了加速。那麼觀察到的 B加速度應該更大了。通過 (16) 得出。同時,我們將協方差矩陣 P_{k-1} 通過 (17) 也傳遞過來。

然後通過 (18),(19),(20),遞推最小二乘法計算當前 A 中觀察下的 B 的狀態。

如麼沒有 (1) 的狀轉移,那麼我們其實也得出了遞推版本的最小二乘法 (RLS)

K_{k}=frac{P_{k-1}^{}h_{k}^T}{r_k^-+h_kP_{k-1}^{}h^T_k}	ag{21}

P_{k}^{}=(I-K_kh_k)P_{k-1}^{} 	ag{22}

hat x_k^{}=hat x_{k-1}^{}+K_k(y_k-h_khat x_{k-1}^{}) 	ag{23}


設置初始值

P_0 如何確定呢? .

根據最小二乘法:

P_k=Big(H_k^TR_kH_kBig)^-=Big(P_{k-1}^-+h_{k}^{T}r_kh_kBig)^-

得到:

P_k=Big(sum_{i=1}^{k}h_i^Tr_ih_iBig)^-approxBig(sum_{i=1}^{k}h_i^Tr_ih_i+ eta IBig )^-,   eta
ightarrow0

其中, eta 足夠小。可以定義: P_0=eta^-I, eta^- 
ightarrowinfty

即: P_0=infty I

這是不是就在說明,當我們沒有任何觀測數據時, hat x 的方差為 infty


推薦閱讀:
相關文章