粒子濾波算法學習

今天我們來講一下粒子濾波算法,這也是我在學習過程中的一個筆記,由於有很多的個人理解,有不對的地方歡迎大家批評指正。

另:個人博客 Glooow 開業啦!歡迎各位大駕光臨

貝葉斯濾波

貝葉斯濾波是我們理解粒子濾波的基礎。假設我們有如下圖的隱馬爾科夫模型(Hidden Markov Model),並且有如下的系統方程與觀測方程,我們只有觀測值 y1:T\boldsymbol{y}_{1:T},但是現在想要根據觀測值估計隱變量 x1:T\boldsymbol{x}_{1:T},也就是濾波所要做的事情。
System Model:xk=fk(xk1,vk1)Observation Model:yk=hk(xk,nk) \begin{aligned} \text{System Model}&: x_{k}=f_{k}\left(x_{k-1}, v_{k-1}\right) \\ \text{Observation Model}&: \mathrm{y}_{k}=h_{k}\left(\mathrm{x}_{k}, \mathrm{n}_{k}\right) \end{aligned}
hmm

假設我們現在已經處於 tk1t_{k-1},且已經獲得了 p(xk1y1:k1)p({x}_{k-1}|\boldsymbol{y}_{1:k-1}),這個概率分佈的含義是什麼呢?我們現在已經有了前 k1k-1 個時刻的觀測值 y1:k1\boldsymbol{y}_{1:k-1},並且根據這些觀測值估計了 k1k-1 時刻隱變量 xk1x_{k-1}後驗概率分佈,也即 p(xk1y1:k1)p({x}_{k-1}|\boldsymbol{y}_{1:k-1})。那麼接下來到 kk 時刻,我們又獲得了一個觀測 yky_k,要怎麼估計新的後驗概率分佈 p(xky1:k)p({x}_{k}|\boldsymbol{y}_{1:k}) 呢?我們通過預測更新兩個階段來估計,下面我就解釋一下這兩個階段的含義。

1. 預測

前面說了我們有系統模型和觀測模型,首先根據系統模型,我們有了 k1k-1 時刻的後驗,就可以根據 xk1x_{k-1}xkx_k 的轉移模型得到 xkx_k 對應的概率分佈,這個過程就叫做預測(Update)。通過預測階段,我們可以獲得先驗概率分佈(注意這裏我們將 p(xky1:k1)p({x}_k|\boldsymbol{y}_{1:k-1}) 稱爲先驗概率分佈)
p(xky1:k1)=p(xkxk1)p(xk1y1:k1)dxk1 \begin{aligned}p({x}_k|\boldsymbol{y}_{1:k-1})=\int p({x}_k|x_{k-1})p(x_{k-1}|\boldsymbol{y}_{1:k-1})dx_{k-1}\end{aligned}
也就是說,我們即使沒有觀測值,也能對 xkx_k 的分佈進行估計,但是由於沒有利用觀測值 yky_k 帶來的信息,因此這個估計是不準確的,下面我們就需要用觀測值對這個先驗概率分佈進行糾正,也就是 更新階段。

2.更新

有了先驗,又有了觀測,根據貝葉斯公式,我們可以很容易得到後驗概率分佈 p(xky1:k)p\left(x_{k} | \boldsymbol{y}_{1: k}\right)。怎麼理解下面一個式子呢?我們有似然函數 p(ykxk)p\left(y_{k} | x_{k}\right),現在有了觀測 yky_k,那麼似然值越大,表明對應的 xkx_k 的概率應該也越大, 就是用似然函數先驗概率進行加權就得到了後驗概率
p(xky1:k)=p(ykxk,y1:k1)p(xky1:k1)p(yky1:k1)p(ykxk,y1:k1)p(xky1:k1)=p(ykxk)p(xky1:k1) \begin{aligned} p\left(x_{k} | \boldsymbol{y}_{1: k}\right)&=\frac{p\left(y_{k} | x_{k},\boldsymbol{y}_{1: k-1}\right) p\left(x_{k} | \boldsymbol{y}_{1: k-1}\right)}{p\left(y_{k} | \boldsymbol{y}_{1: k-1}\right)} \\ &\propto p\left(y_{k} | x_{k},\boldsymbol{y}_{1: k-1}\right) p\left(x_{k} | \boldsymbol{y}_{1: k-1}\right) \\ &= p\left(y_{k} | x_{k}\right) p\left(x_{k} | \boldsymbol{y}_{1: k-1}\right) \end{aligned}

怎麼理解這個加權呢?舉個栗子

比如

總結

總結起來,我們濾波分爲兩個階段
Prediction:p(xky1:k1)=p(xkxk1)p(xk1y1:k1)dxk1Update:p(xky1:k)p(ykxk)p(xky1:k1) \begin{aligned} \text{Prediction}&: p({x}_k|\boldsymbol{y}_{1:k-1})=\int p({x}_k|x_{k-1})p(x_{k-1}|\boldsymbol{y}_{1:k-1})dx_{k-1} \\ \text{Update}&: p\left(x_{k} | \boldsymbol{y}_{1: k}\right)\propto p\left(y_{k} | x_{k}\right) p\left(x_{k} | \boldsymbol{y}_{1: k-1}\right) \end{aligned}
可以看到,上面的預測階段含有積分,這在實際當中往往是很難計算的,而對於那些非常規的PDF,甚至不能給出解析解。解決這種問題一般有兩種思路:

  • 建立簡單的模型,獲得解析解,如卡爾曼濾波(Kalman Filter)及EKF、UKF等;
  • 建立複雜的模型,獲得近似解,如粒子濾波(Particle Filter)等。

卡爾曼濾波

卡爾曼濾波的思路就是將系統建模線性模型,隱變量、控制變量、控制噪聲與觀測噪聲均爲高斯分佈,那麼觀測變量也是隨機變量,整個模型中所有的隨機變量都是高斯的!高斯分佈是我們最喜歡的分佈,因爲在前面貝葉斯濾波的預測階段我們可以不用積分了,只需要計算均值和協方差就可以了!根據系統模型和觀測模型,我們可以獲得濾波的閉式解,這就是卡爾曼濾波的思想。
System Model:xk=Axk1+Buk1+vk1Observation Model:yk=Cxk+nk \begin{aligned} \text{System Model}&: \mathrm{x}_{k}=A\mathrm{x}_{k-1} + B\mathrm{u}_{k-1} + v_{k-1} \\ \text{Observation Model}&: \mathrm{y}_{k}=C\mathrm{x}_{k}+ \mathrm{n}_{k} \end{aligned}
但實際中要求線性系統模型往往是很困難的,對於非線性模型,如果我們還想應用卡爾曼濾波該怎麼辦呢?線性近似,也就是求一個雅可比矩陣(Jacobi),這就是擴展卡爾曼濾波(EKF)。

大數定律

粒子濾波是什麼是意思呢?我們可以用大量的採樣值來描述一個概率分佈,當我們按照一個概率分佈進行採樣的時候,某個點的概率密度越高,這個點被採到的概率越大,當採樣數目足夠大(趨於無窮)的時候,粒子出現的頻率就可以用來表示對應的分佈,實際中我們可以理解一個粒子就是一個採樣。

particle

但是對於離散型的隨機變量還好,可以很容易的求出來狀態空間中每個狀態的頻率。但如果對於連續分佈,其實是很不方便的,所幸實際中我們也不需要獲得概率分佈的全部信息,一般只需要求出期望就可以了。

下面爲了公式書寫和推導方便,以離散型隨機變量爲例,假設狀態空間爲 Z={1,2,...,K}\mathcal{Z}=\{1,2,...,K\},有 NN 個採樣樣本 ziZz_i \in \mathcal{Z},服從概率分佈 q(z)q(\mathbf{z})。我們將根據 NN 個採樣樣本 z1:N\boldsymbol{z}_{1:N} 得到的分佈記爲經驗分佈 p^(bz1:N)=1NiI(bzi)\hat{p}(b|\boldsymbol{z}_{1:N}) = \frac{1}{N}\sum_i \mathbb{I}(b-z_i),其中 I()\mathbb{I}(\cdot) 爲指示函數,那麼當 NN 足夠大的時候,經驗分佈 p^(bz1:N)\hat{p}(b|\boldsymbol{z}_{1:N}) 就足夠接近真實分佈 q(z)q(\mathbf{z})。現在我們想估計隨機變量 t=g(z)\mathsf{t}=g(\mathsf{z}) 的期望,即
E[t]=E[g(z)]=bZg(b)q(b)bg(b)p^(bz1:N)=bg(b)1NiI(bzi)=1Nig(zi) \begin{aligned} \mathbb{E}[\mathsf{t}] &= \mathbb{E}[g(\mathsf{z})]=\sum_{b\in\mathcal{Z}}g(b)q(b) \\ &\approx \sum_b g(b)\hat{p}(b|\boldsymbol{z}_{1:N}) \\ &= \sum_b g(b)\frac{1}{N}\sum_i \mathbb{I}(b-z_i)\\ &= \frac{1}{N}\sum_i g(z_i) \end{aligned}
也就是說,我們只需要對樣本進行簡單求和就可以了!連續型隨機變量也是類似的,所以在後面的粒子濾波中,我們利用粒子估計了概率密度分佈,要想求期望就只需要進行求和平均就可以了。

粒子濾波簡單實例

好了,有了前面的預備知識,我們可以先看一個粒子濾波的簡單例子。

假設我們現在有采樣好的 NN 個粒子 {xk1i}i=1N\{x_{k-1}^i\}_{i=1}^N,他們服從分佈 p(xk1y1:k1)p({x}_{k-1}|\boldsymbol{y}_{1:k-1}),那麼我們現在如何進行貝葉斯濾波中的預測更新階段呢?

1. 預測

回顧一下預測的公式
Prediction:p(xky1:k1)=p(xkxk1)p(xk1y1:k1)dxk1 \text{Prediction}: p({x}_k|\boldsymbol{y}_{1:k-1})=\int p({x}_k|x_{k-1})p(x_{k-1}|\boldsymbol{y}_{1:k-1})dx_{k-1} \\
想一下:只要我們讓每個粒子 xk1ix_{k-1}^i進化”一步,也就是說按照分佈 p(xkxk1)p(x_k|x_{k-1}) 進行採樣,使得 xkip(xkxk1i)x_k^i \sim p(x_k|x_{k-1}^i),這樣我們就獲得了 NN 個新的粒子 {xki}i=1N\{x_k^i\}_{i=1}^N。很容易驗證,如果 {xk1i}i=1N\{x_{k-1}^i\}_{i=1}^N 能夠很好的表示 p(xk1y1:k1)p({x}_{k-1}|\boldsymbol{y}_{1:k-1}) 的話,那麼 {xki}i=1N\{x_k^i\}_{i=1}^N 也能很好的表示 p(xky1:k1)p({x}_k|\boldsymbol{y}_{1:k-1})(這一部分可以憑直觀感覺來理解,這是一個很自然的事情,也可以用前面的經驗分佈的思路進行公式推導)。

這樣做的好處是什麼呢?我們避免了積分!只需要對一個已知的分佈 p(xkxk1i)p(x_k|x_{k-1}^i) 進行採樣,而這個分佈是我們假設的系統模型,可以是很簡單的,因此採樣也很方便。

2. 更新

通過預測我們獲得了 xkip(xkxk1i)x_k^i \sim p(x_k|x_{k-1}^i),這 NN 個粒子就描述了先驗概率分佈。接下來就是更新,再回顧一下更新的公式
Update:p(xky1:k)p(ykxk)p(xky1:k1) \text{Update}: p\left(x_{k} | \boldsymbol{y}_{1: k}\right)\propto p\left(y_{k} | x_{k}\right) p\left(x_{k} | \boldsymbol{y}_{1: k-1}\right)
更新是什麼呢?前面提到了:更新就是用似然函數先驗概率進行加權就得到了後驗概率。如果簡單的把 xkix_k^i 帶入到上面的公式裏,就可以得到下面的式子
p(xkiy1:k)p(ykxki)p(xkiy1:k1) p\left(x_{k}^i | \boldsymbol{y}_{1: k}\right)\propto p\left(y_{k} | x_{k}^i\right) p\left(x_{k}^i | \boldsymbol{y}_{1: k-1}\right)
實際上就表示每個粒子有不同的權重

這裏怎麼理解呢?想一下前面提到的經驗分佈,我們只需要用粒子出現的頻率來表示對應的概率,實際上就是在統計頻率的時候每個粒子的權重都是相同的,出現一次計數就加一。

而這裏的區別是什麼呢?由於我們有一個觀測值 yky_k,根據 yky_k 來反推,某一個粒子 i1i_1 的導致 yky_k 出現的概率更大,那麼我們在統計頻率的時候,就給這個粒子加一個更大的權重,以表示我們更相信/重視這個粒子。

那麼問題來了,前面我們說了濾波過程中要想求期望,只需要簡單求和就可以了
E[t]=1Nig(zi) \mathbb{E}[\mathsf{t}] = \frac{1}{N}\sum_i g(z_i)
現在粒子有了權重怎麼辦呢,同理,加個權就好了(推導也很簡單,相信大家都會),下面的式子裏對權重進行了歸一化
E[t]=iwijwjg(zi) \mathbb{E}[\mathsf{t}] = \sum_i \frac{w_i}{\sum_j w_j}g(z_i)

3. 遞推

前面只講了一次預測和一次更新的過程,注意到我們前面只是從 k1k-1kk 時刻的濾波過程,但每一輪循環原理都是相同的。

不過細心的朋友們可能會覺得不太對勁,前面一個階段的例子裏,預測之前我們有采樣 {xk1i}i=1N\{x_{k-1}^i\}_{i=1}^N,推導過程中我們是默認這些粒子的權重都是相同的,然後我們進行了預測和更新,但是更新之後我們給每個粒子加權了呀,到下一個階段怎麼辦?!!!也很簡單,預測階段不必要求每個粒子的權重都相同,也加上一個權重就好了。也就是說我們時時刻刻都保存有每個粒子的權重信息。

這樣我們就可以得到一個完整的粒子濾波算法了!但是還有問題!

重採樣

但是呢,有人發現了上面的算法不好啊!不是因爲麻煩,而是濾波到最後會發現只有少數一部分粒子有很大的權重,而其他絕大部分粒子的權重幾乎爲 0,這就意味着對於那些“不重要”的粒子,他們在我們求期望的時候貢獻並不大,但是我們卻花費了大量的計算精力來維護這些粒子,這樣不好不好!於是就有人提出了重採樣

重採樣什麼意思呢?你們粒子的權重不是不同嗎,那我就採取手段給你們整相同了!簡單理解,有兩個粒子,粒子 aa 的權重是 8,粒子 bb 權重是 2,那我就把粒子 aa 複製 8 份,粒子 bb 複製 2 份,這樣得到的 10 個粒子權重就都是 1 了。但是另一個問題是一開始我們只有 2 個粒子,這樣弄完我們就有 10 個粒子了,如果一直這麼做我們的粒子數會越來越多,算力跟不上。那就從這 10 個粒子裏均勻分佈地隨機抽 2 個!那麼粒子 aa 的概率就是 0.80.8,這就成了。

resample

至此,加上重採樣我們就獲得了一個完整的比較好用的粒子濾波算法

sir

粒子濾波原理推導

但是還有一個問題,就是前面我們直接說有 NN 個粒子 xk1ip(xk1y1:k1)x_{k-1}^i \sim p({x}_{k-1}|\boldsymbol{y}_{1:k-1}),但是第 1 步(剛開始)的時候我們怎麼獲得這些粒子來描述 p(x1y1)p(x_1|y_1) 啊?如果是高斯分佈還好,我們可以很方便的對高斯分佈進行採樣,但是如果是一個特別特別特別複雜的分佈呢?我們甚至不能寫出解析表達式,更沒辦法按照這個分佈進行隨機採樣,那我們是不是就涼了?不!我們前面不是講了粒子可以有權重嘛。

假如我們現在有另一個分佈 q(x1:ky1:k)q(\mathbf{x}_{1:k}|\mathbf{y}_{1:k}),這個分佈是我們自己指定的,可以很簡單,而且我們可以按照這個分佈來進行採樣,那麼我們就有 xk1iq(x1:ky1:k)x_{k-1}^i \sim q(\mathbf{x}_{1:k}|\mathbf{y}_{1:k}),那麼我們怎麼用這些粒子來表示我們想要得到的真正的分佈 p(x0:ky1:k)p(\mathbf{x}_{0:k}|\mathbf{y}_{1:k}) 呢?再加個權就行了,就像前面用似然函數進行加權。
p(x0:ky1:k)i=1Nwkiδ(x0:kx0:ki)wkip(x0:kiy1:k)q(x0:kiy1:k) \begin{aligned} p(\mathbf{x}_{0:k}|\mathbf{y}_{1:k})&\approx \sum_{i=1}^{N}w_k^i\delta(\mathbf{x}_{0:k}-\mathbf{x}_{0:k}^i) \\ w_{k}^{i} &\propto \frac{p\left(\mathbf{x}_{0: k}^{i} | \mathbf{y}_{1: k}\right)}{q\left(\mathbf{x}_{0: k}^{i} | \mathbf{y}_{1: k}\right)} \end{aligned}
再考慮前面提到的的預測更新兩個遞推進行的階段,就有
q(x0:ky1:k)=q(xkx0:k1,y1:k)q(x0:k1y1:k1)=q(xkxk1,yk)q(x0:k1y1:k1)wkiwk1ip(ykxki)p(xkixk1i)q(xkixk1i,yk) \begin{aligned}q\left(\mathbf{x}_{0: k} | \mathbf{y}_{1: k}\right)&=q\left(\mathbf{x}_{k} | \mathbf{x}_{0: k-1}, \mathbf{y}_{1: k}\right) q\left(\mathbf{x}_{0: k-1} | \mathbf{y}_{1: k-1}\right) \\ &= q\left(\mathbf{x}_{k} | \mathbf{x}_{k-1}, \mathbf{y}_{ k}\right) q\left(\mathbf{x}_{0: k-1} | \mathbf{y}_{1: k-1}\right) \\ w_{k}^{i} &\propto w_{k-1}^{i} \frac{p\left(\mathbf{y}_{k} | \mathbf{x}_{k}^{i}\right) p\left(\mathbf{x}_{k}^{i} | \mathbf{x}_{k-1}^{i}\right)}{q\left(\mathbf{x}_{k}^{i} | \mathbf{x}_{k-1}^{i}, \mathbf{y}_{k}\right)} \end{aligned}
然後我們就得到了一個更加 universal/generic 的粒子濾波算法(下面圖片所示算法中沒加重採樣步驟)。

sis

總結

這篇文章主要是自己學習粒子濾波之後的一些理解,主要參考了文章 A Tutorial on Particle Filters for Online Nonlinear/Non-Gaussian Bayesian Tracking,但是這篇文章中是從 general 的情況開始講,然後舉了一些常用的特例,個人感覺不利於初學者理解,因此本文寫作過程中的思路是從簡單的特例開始再到更一般的情況。

最後一部分 [粒子濾波原理推導](## 粒子濾波原理推導) 其實寫的並沒有很清楚,主要是因爲自己太懶,到最後懶得一個個手敲公式了,如果想更清楚地瞭解其中的細節,可以閱讀上面那篇論文。

Reference

  1. M. S. Arulampalam, S. Maskell, N. Gordon and T. Clapp, “A tutorial on particle filters for online nonlinear/non-Gaussian Bayesian tracking,” in IEEE Transactions on Signal Processing, vol. 50, no. 2, pp. 174-188, Feb. 2002.
發佈了38 篇原創文章 · 獲贊 33 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章