1. 程式人生 > >卡爾曼濾波器和優化的本質理解

卡爾曼濾波器和優化的本質理解

假設我們有兩個未知量想要知道他們的值。最直接的方法是找到兩個和這兩個未知量相關的方程,求解方程組就能得到他們的值。

但如果我們只能得到一個方程呢?也許你會說這個問題無解。但是換個角度想,雖然只有一個方程,但也不沒有好,至少我們還是多了一些關於這兩個位置量的資訊。

很多情況下,我們不能一下得到足夠的關於所有未知量的方程,但隨著時間的推進,我們能不斷地得到越來越多的方程(資訊)。再往後面,我們不僅能得到足夠的資訊,還能得到更多的資訊。所以我們想要有一種方法能夠在資訊不足的時候,儘可能的縮小對位置量的不確定性(未知量可能的取值範圍),在資訊有餘的時候,還能不斷的優化對未知量的判斷。甚至在位置量發生變化的時候,我們還能通過新的資訊來跟新未知量。這就是卡爾曼濾波的背景理解了。

一次使用絕對足夠,甚至多餘的方程來求解的方法就是優化發。而不斷的融合新的資訊的方法就會濾波法。

假設我們有x,y兩個未知量。

有關於他們的兩個方程:

  • x+2y=0
  • x-y=1

我們可以得出x=2/3,y=-1/3

但如果我們在第一個時刻只知道x+2y=0這個資訊呢?雖然不能求出x,y的具體值,但是我們大概知道x,y的一個關係。畫在一個二維的空間中,就是一條直線。如果我們還對這個關係不太確定,這條線就會變成一個帶狀物。

換個說法,一開始我們對x,y一無所知。所以這個x,y組成的二維空間上,任何一點都是有可能的。當我們得到第一條訊息x+2y=0後,我們對x,y的不確定度縮小到那個帶狀區域了。當又收到x-y=1這個訊息的時候,我們對x,y的不確定度縮小到一個點狀物。如果還有更多的訊息來,這個不確定度區域還能不斷縮小。

基於這個理解還可以思考下無偏估計的原理:我們希望這些訊息對應的不確定區域都是有一個共同重疊區的,這樣才能對真值有越來越穩定的估計,隨著獲得的資訊越來越多。

再舉一個計算機視覺的例子。假設攝像頭只觀測到一個空間位置已知的點,我們沒法只用這一個點確定攝像機的位置。但是我們對攝像機未知的不確定度,已經從之前的6d空間均勻分佈,縮小到一個用高斯分佈表示的區域。這個區域由相機pose這個隨機變數的均值和方差同時決定。但我們觀察到越來越多的點後,pose的不確定區域也會越來越小。但有一點很重要,方差和均值同時確定了pose的可能取值。這也是為什麼對於濾波法,我們一般只需要把協方差的初值取得足夠大就行了。

這裡還有一點需要注意:如果我們想要增量的融合資訊,我們必須知道未知量的協方差,不然我們沒有辦法去融合新的資訊。但最終有用的資訊只有均值。這也是為什麼對於一次性使用所有資訊進行的優化法,就不需要關注最終結果的協方差了,雖然這個協方差是存在,也能求出來。

再來想想卡爾曼濾波器的場景:一開始我們對相機pose一無所知,當進行了第一次觀察後,pose的不確定區域有所縮小。然後通過一次運動方程變換。pose的總體不確定區域雖然沒有變小,但是形狀和位置發生了變化。然後再進行一次觀察,不確定區域又縮小一些。就這樣我們對pose的變化規律越來越確定。但因為每次觀察和運動都會帶來額外的不確定度(加噪音)。所以最終觀察帶來的不確定性減少和額外的不確定性增加達到平衡狀態。

還可以換一種理解角度。假設不同時刻的pose都是不同的隨機變數。但和第一個pose不同,在我們用觀察值來跟新這個pose的時候,他就已經有一個先驗的概率分佈了,而不是一無所知。而這個先驗概率正好是由上一個時刻的pose通過運動方程推算過來的。這樣就是卡爾曼濾波的問題劃分為多個最普通的高斯概率合併的問題。(這裡和邊緣化還不一樣,這裡就是簡單的把上一個時刻的概率分佈,通過變換後直接作為當前時刻的概率分佈,前提是馬爾科夫假設。)

y=a*x+n中,x和y都是變數,沒有不確定度一說,而不是隨機變數。而這個式子代表的事y和x的一個聯合概率分佈。只是一個聯合隨機變數的兩種不同表示。而n其實是p(y|x),大概是這個意思,不太嚴格。

obs=a*x中,x和obs都有自己的不確定度。代表隨機變數的變換。

b-a*x~n,只有x是變數,這個表示的是X這個隨機變數滿足的方程

卡爾曼濾波問題中:運動方程其實屬於第二種意義,從一個隨機變數變換到另外一個隨機變數,再加上一個隨機變數。

觀察方程 其實屬於第二種意義,觀察值是已知的,我們需要求能讓觀察值概率最大的那個x的值。

而融合不是講把一個隨機變數變換為另一個隨機變數,而是把一個隨機變數的兩種分佈相乘,得到這個隨機變數的第三種分佈。上面三種表達都和融合無關。

所以他們講的不同的東西,不用強行把他們聯絡在一起。運動方程通過原理2得到一個關於x的分佈,觀察方程通過原理3得到關於x的另外一個分佈。然後通過融合x的這兩種分佈,得到x的第三種分佈。為什麼要用相乘的方式來融合呢?因為兩個分佈同時發生的概率分佈就是這兩個分佈的乘積。

關於這裡提到的一個隨機變數的不同分佈可以這樣理解:不同分佈其實對應的還是不同的隨機變數,這是這兩個隨機變數的取值一模一樣,然後問他們同時取相同值得概率分佈是什麼。而上面原理2的兩個隨機變數的取值可以是完全不同的,就算相同,要說他們取相同值的概率也是麼有太大意義的。

濾波法和優化法的等價理解

這兩個方法都在解決的問題是:如果一個隨機變數的概率分佈可以用一個自變數x來表示。求x取值為什麼的時候,能夠讓概率最大。這本來就是個優化問題,優化法直接進行求解。而濾波法是把x和一個正太分佈之間用一個變換矩陣聯絡起來。先求變換矩陣的表示,然後由變換矩陣反推x的分佈。最後取出平均值。這樣做的前提是x也是正態分佈,才能用一個矩陣來表示變換。優化法沒有這個限制。當x不是高斯分佈的時候,只有對這個變換進行線性展開,這裡就出現了誤差。所以當x不是正太分佈的時候,兩者就出現了差異。

另外當目標分佈是標準正太分佈的時候,優化法中的模就是普通的二次模而不是協方差的模。但一般來說觀察的誤差值之間都是獨立同分布的,其實就是標準正太分佈了。

在EKF中,雖然我們總把pose看做一個正態分佈。但是旋轉或者通過觀察得到的pose都不再是正態分佈。所以這裡每個時刻的pose的正太分佈表示都是近似表示。

總結一下就是:讓誤差最小的那個普通變數x的取值對應讓概率函式取最大的那個隨機變數x的取值。這裡的的概率分佈是指隨機變數x通過一定變換後(包含了求誤差的變換)得到的那個正太分佈的概率分佈。而這裡的誤差是指普通變數x通過某個變化後和應該取得的值之間的差異。

先驗概率和邊緣化的理解

先驗概率是和融合直接相關的:一個隨機變數x本來的分佈是先驗分佈,然後和一個特殊條件下的條件分佈融合,最後求兩個分佈相乘後的分佈。相乘就是融合,所以說先驗概率就是在做融合。這裡不是上面的原理3,所以和優化沒關係。

但是融合後的概率分佈要滿足某個分佈,那就和優化弄上關係了。

實際情況中,條件概率會有多個:t時刻的pose基於t-1, t-2等時刻的條件概率。這些概率都是通過融合(相乘)在一起,然後最終得到的那個概率分佈又要滿足某個概率分佈,然後問裡面各個變數的取值。融合後的概率分佈函式通過log後。裡面各個相乘的項就變成了相加的項。這也是為先驗項在優化問題裡面,就變成了加一個誤差項。這也是為啥我們在融合不同資料的時候,能夠簡單的把這些誤差項加起來。這個就是因子。

但是因為是不同的觀察量,所以雖然是獨立的,但是分佈就不一樣了,不同的觀察量的方差不一樣。所以需要在每個因子前面都要乘以一個超參係數。

如果有馬爾科夫假設的時候,其實是沒有邊緣化的問題的。因為當前時刻的分佈只由上一時刻決定。反之當前時刻要有歷史上所有時刻的值決定,當我們想把上一時刻之前的值拋棄的時候,就不能直接不管了,需要把之前的值邊緣化。

馬爾科夫假設

對於多個隨機變數組成的聯合概率密度函式(x1,x2,x3等),這裡一般指不同時刻的狀態變數。可以用他們之間的條件概率函式以很多不同的組合相乘表示出來。

馬爾科夫假設指: p(x3,x2,x1)=p(x3|x2x1)p(x2|x1)p(x1)=>p(x3,x2,x1)=p(x3|x2)p(x2|x1)p(x1)

因為有:p(x3|x2x1)=p(x3|x2)

正是有馬爾科夫假設,我們才能像卡爾曼濾波器那樣把上個時刻的概率變換後直接當做當前時刻的概率。也就是x3的分佈由x2唯一決定。