最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【經(jīng)典教程翻譯】卡爾曼與貝葉斯濾波器:離散貝葉斯濾波器(上)

2023-02-22 21:38 作者:MyEncyclopedia公號  | 我要投稿

本期繼續(xù)大神 Roger Labbe 的?Kalman and Bayesian Filters in Python。本文為第二章離散貝葉斯過濾器,通過逐漸復(fù)雜的例子建立離散貝葉斯的直覺觀念。

所有文章首發(fā)于?MyEncyclopedia公眾號

  • 【經(jīng)典教程翻譯】卡爾曼與貝葉斯濾波器:直覺理解濾波器背后的原理(上)

    https://mp.weixin.qq.com/s/TTkmCgYimWhcJeMxBh05fg

  • 【經(jīng)典教程翻譯】卡爾曼與貝葉斯濾波器:直覺理解濾波器背后的原理(下:濾波器的思考框架)

    https://mp.weixin.qq.com/s/WObX_20GDr1Kc5vmWtae4Q

離散貝葉斯濾波器

卡爾曼濾波器屬于稱為貝葉斯濾波器的濾波器家族。大多數(shù)卡爾曼濾波器的教科書介紹了貝葉斯公式,也許顯示了它如何影響卡爾曼濾波器方程,但大多數(shù)情況下討論的非常抽象。

這種方法需要對數(shù)學(xué)的幾個領(lǐng)域有相當復(fù)雜的理解,盡管它仍然把理解和形成直覺的大部分工作留給了讀者。

我將使用不同的方式來展開這個主題,我對 Dieter Fox 和 Sebastian Thrun 的工作感激不盡。他們通過跟蹤穿過走廊的物體來建立貝葉斯統(tǒng)計如何工作的直覺——他們使用機器人,我使用狗。我喜歡狗,它們比機器人更難以預(yù)測,這給濾波帶來了有趣的困難。我能找到的第一個發(fā)布的例子似乎是 Fox 1999 (Monte carlo localization: Efficient position estimation for mobile robots),F(xiàn)ox 2003 (Bayesian Filters for Location Estimation) 中有一個更完整的例子。Sebastian Thrun 在他出色的 Udacity 課程 Artificial Intelligence for Robotics ?中也使用了這個公式。事實上,如果您喜歡看視頻,我強烈建議您暫停閱讀本書,轉(zhuǎn)而閱讀該課程的前幾課,然后再返回本書以更深入地探討該主題。

現(xiàn)在讓我們使用一個簡單的思想實驗,就像我們對 g-h 濾波器所做的一樣,看看我們?nèi)绾瓮茢嗍褂酶怕蔬M行濾波和跟蹤。

追蹤小狗

讓我們從一個簡單的問題開始。我們有一個歡迎狗的工作空間,所以人們帶著他們的狗來工作。偶爾,這些狗會走出辦公室,穿過大廳。我們希望能夠追蹤他們。因此,在黑客馬拉松期間,有人發(fā)明了一種聲納傳感器,可以掛在狗的項圈上。它發(fā)出信號,聆聽回聲,根據(jù)回聲返回的速度,我們可以判斷狗是否在敞開的門口前。它還會感知狗何時行走,并報告狗移動的方向。它通過 wifi 連接到網(wǎng)絡(luò)并每秒發(fā)送一次更新。

我想追蹤我的小狗 Simon ,所以我將設(shè)備系在它的項圈上,然后啟動 Python,準備編寫代碼來追蹤它穿過大樓。乍一看,這似乎是不可能的。如果我開始聽 Simon 衣領(lǐng)上的傳感器,我可能會讀到door、hall、hall等等。我如何使用該信息確定 Simon 的位置?

為了使問題足夠小以便于繪制,我們假設(shè)走廊中只有 10 個位置,我們將其編號為 0 到 9,其中 1 在 0 的右邊。出于稍后將清楚的原因,我們還將假設(shè)走廊是圓形或矩形的。如果你從位置 9 向右移動,你將在位置 0。

當我開始聽傳感器時,我沒有理由相信Simon在走廊的任何特定位置。從我的角度來看,他處于任何位置的可能性都是一樣的。有 10 個位置,所以他在任何給定位置的概率是 1/10。

讓我們在 NumPy 數(shù)組中表示我們對他的位置的信念。我可以使用 Python List,但 NumPy 數(shù)組提供了我們即將使用的功能。

In?[3]:

貝葉斯統(tǒng)計中,這稱為先驗。它是合并測量或其他信息之前的概率。更完整地說,這稱為先驗概率分布。概率分布是一個事件所有可能概率的集合。概率分布總和為 1,因為某些事情必須發(fā)生;該分布列出了所有可能的事件和每個事件的概率。

我相信您以前使用過概率——例如“今天下雨的概率是 30%”。最后一段聽起來更多。但是貝葉斯統(tǒng)計是概率的一場革命,因為它將概率視為對單個事件的信念。讓我們舉個例子。我知道如果我無限次地擲一枚公平的硬幣,我將得到 50% 的正面和 50% 的反面。這被稱為頻率派統(tǒng)計,以區(qū)別于貝葉斯統(tǒng)計,來計算基于事件發(fā)生的頻率。

我又擲了一次硬幣,讓它落地。我認為它以哪種方式著陸?頻率派概率論對此無話可說。它只會說 50% 的硬幣以正面朝上。在某些方面,將概率分配給硬幣的當前狀態(tài)是沒有意義的。它要么是正面,要么是反面,我們只是不知道是哪一個。貝葉斯將其視為對單個事件的信念——我相信或知道這個特定的拋硬幣是正面的強度是 50%。有些人反對“信念”一詞;信念可能意味著在沒有證據(jù)的情況下認為某事是真實的。在本書中,它始終是我們知識強度的衡量標準。隨著我們的進行,我們將了解更多相關(guān)信息。

貝葉斯統(tǒng)計考慮了過去的信息(先驗信息)。我們觀察到每 100 天下 4 次雨。由此我可以說明天下雨的可能性是 1/25。這不是天氣預(yù)報的方式。如果我知道今天在下雨并且風暴前線停滯不前,那么明天很可能會下雨。天氣預(yù)報是貝葉斯的。

在實踐中,統(tǒng)計學(xué)家混合使用頻率派和貝葉斯技術(shù)。有時很難或不可能找到先驗,因而頻率派占主導(dǎo)地位。在本書中我們可以找到先驗。當我談?wù)撃呈碌母怕蕰r,我指的是在給定過去事件的情況下某些特定事物為真的概率。當我這樣做時,我采用了貝葉斯方法。

現(xiàn)在讓我們創(chuàng)建走廊的地圖。我們將把前兩扇門靠在一起,然后將另一扇門放在更遠的地方。我們將 1 用于門,0 用于墻:

In?[4]:

我開始在網(wǎng)絡(luò)上監(jiān)聽 Simon 的傳輸,我從傳感器獲得的第一個數(shù)據(jù)是door。目前假設(shè)傳感器總是返回正確的答案。由此我斷定他在一扇門前,但哪一扇呢?我沒有理由相信他在第一、第二或第三扇門前。我能做的是為每扇門分配一個概率。所有門的可能性都一樣,而且一共有三扇門,所以我為每扇門分配了 1/3 的概率。

In?[5]:

這種分布稱為分類分布,它是描述觀察概率的離散分布n結(jié)果。這是一個多峰分布,因為我們對我們的狗的位置有多種看法。當然,我們并不是說我們認為他同時在三個不同的位置,只是我們將我們的知識范圍縮小到這三個位置之一。我的(貝葉斯)信念是,有 33.3% 的機會在 0 號門,33.3% 的機會在 1 號門,33.3% 的機會在 8 號門。

這是兩個方面的改進。我已經(jīng)拒絕了一些不可能的走廊位置,我對剩余位置的信念強度從 10% 增加到 33%。隨著我們知識的提高,概率將接近 100%。

關(guān)于分布的眾數(shù)的幾句話。給定一個數(shù)字列表,例如 {1, 2, 2, 2, 3, 3, 4},眾數(shù)是最常出現(xiàn)的數(shù)字。對于這個集合,眾數(shù)是 2。一個分布可以包含多個眾數(shù)。列表 {1, 2, 2, 2, 3, 3, 4, 4, 4} 的眾數(shù)是 2 和 4,因為它們都出現(xiàn)了三次。我們說前者是單峰的,后者是多峰的。

用于此分布的另一個術(shù)語是直方圖。直方圖以圖形方式描述了一組數(shù)字的分布。上面的條形圖是一個直方圖。

我在上面的代碼中手工編碼了belief數(shù)組。我們將如何在代碼中實現(xiàn)它?我們用 1 表示門,用 0 表示墻,所以我們將走廊變量乘以百分比,如下所示;

In?[6]:

讓我們把 Python 放在一邊,稍微思考一下這個問題。假設(shè)我們要從 Simon 的傳感器中讀取以下內(nèi)容:

  • 向右移

我們能推斷出Simon的位置嗎?當然!考慮到走廊的布局,只有一個地方可以得到這個序列,那就是在左端。因此我們可以自信地說Simon在第二個門口。如果你不清楚,假設(shè)Simon是從第二或第三扇門開始的。向右移動后,他的傳感器會返回“墻”。這與傳感器讀數(shù)不符,所以我們知道他不是從那里開始的。對于所有剩余的起始位置,我們可以繼續(xù)使用該邏輯。唯一的可能,就是他現(xiàn)在就在第二道門前。我們的信念是:

In?[7]:

我設(shè)計了走廊布局和傳感器讀數(shù),以便快速為我們提供準確的答案。真正的問題并不是那么明確。但這應(yīng)該觸發(fā)你的直覺——第一個傳感器讀數(shù)只給了我們Simon位置的低概率 (0.333),但在位置更新和另一個傳感器讀數(shù)之后,我們更了解他在哪里。你可能會懷疑,如果你有一個很長的走廊,有很多門,那么在幾次傳感器讀數(shù)和位置更新之后,我們要么能夠知道Simon在哪里,要么將可能性縮小到少數(shù)可能性。當一組傳感器讀數(shù)僅匹配一個或幾個起始位置時,這是可能的。

我們現(xiàn)在可以實施這個解決方案,但讓我們考慮這個問題在現(xiàn)實世界中的復(fù)雜性。

有噪聲的傳感器

完美的傳感器很少見。如果Simon坐在門前抓撓自己,傳感器可能不會檢測到門,或者如果他沒有面朝走廊,傳感器就會誤讀。因此,當我得到 door ,就不能使用 1/3 作為概率。我要給每扇門分配不到1/3,給每個空白墻位置分配一個小概率。就像是

乍一看,這似乎是無法克服的。如果傳感器有噪音,就會對每條數(shù)據(jù)產(chǎn)生懷疑。如果我們總是不確定,我們怎么能得出結(jié)論呢?

對于上述問題,答案是有概率的。我們已經(jīng)很樂意為狗的位置分配概率信念;現(xiàn)在我們必須考慮由傳感器噪聲引起的額外不確定性。

假設(shè)我們得到了door的讀數(shù),并假設(shè)測試表明傳感器正確的可能性是錯誤的 3 倍。我們應(yīng)該在有門的地方將概率分布縮放 3 倍。如果我們這樣做,結(jié)果將不再是概率分布,但我們稍后會學(xué)習如何解決這個問題。

讓我們在 Python 代碼中看一下。這里我使用變量z來表示測量。z或者y是測量文獻中的習慣選擇。作為一名程序員,我更喜歡有意義的變量名,但我希望您能夠閱讀文獻或其他濾波代碼,所以我現(xiàn)在將開始介紹這些縮寫名稱。

In?[8]:

這不是概率分布,因為它的總和不等于 1.0。但代碼基本上做對了——門被分配的數(shù)字 (0.3) 比墻 (0.1) 高 3 倍。我們需要做的就是對結(jié)果進行歸一化,以便概率總和正確為 1.0。歸一化是通過將每個元素除以列表中所有元素的總和來完成的。使用 NumPy 很容易:

Out[9]:

FilterPy 使用以下函數(shù)實現(xiàn)此normalize功能:

說“正確的可能性是錯誤的 3 倍”有點奇怪。我們正在研究概率,所以讓我們指定傳感器正確的概率,并從中計算比例因子。方程式是

scale%20%3D%20%20%5Cfrac%7Bprob_%7Bcorrect%7D%7D%7Bprob_%7Bincorrect%7D%7D%20%3D%20%5Cfrac%7Bprob_%7Bcorrect%7D%7D%20%7B1-prob_%7Bcorrect%7D%7D%0A

此外,for循環(huán)很麻煩。作為一般規(guī)則,您將希望避免for在 NumPy 代碼中使用循環(huán)。NumPy 是在 C 和 Fortran 中實現(xiàn)的,因此如果您避免 for 循環(huán),結(jié)果通常比等效循環(huán)運行速度快 100 倍。

我們?nèi)绾螖[脫這個for循環(huán)?NumPy 允許您使用布爾數(shù)組索引數(shù)組。您使用邏輯運算符創(chuàng)建一個布爾數(shù)組。我們可以找到走廊中的所有門:

Out[10]:

當您使用布爾數(shù)組作為另一個數(shù)組的索引時,它只返回索引所在的元素True。因此我們可以如此代替 for

教你 NumPy 超出了本書的范圍。我將使用慣用的 NumPy 結(jié)構(gòu),并在我第一次展示它們時對其進行解釋。如果您是 NumPy 的新手,有很多博客文章和視頻介紹如何高效且地道地使用 NumPy。

這是我們的改進版本:

In?[11]:

我們可以從輸出中看到,總和現(xiàn)在是 1.0,門與墻的概率仍然是原來的三倍。結(jié)果也符合我們的直覺,門的概率必須小于 0.333,而墻的概率必須大于 0.0。最后,它應(yīng)該符合我們的直覺,即我們還沒有得到任何信息可以讓我們區(qū)分任何給定的門或墻的位置,所以所有的門位置應(yīng)該具有相同的值,墻的位置也應(yīng)該如此。

這個結(jié)果稱為后驗,是后驗概率分布的簡稱。它們都表示合并測量信息后的概率分布(在此上下文中后驗表示“之后”)。回顧一下,先驗是包含測量信息之前的概率分布。

另一個術(shù)語是似然。當我們計算時,belief[hall==z] *= scale 我們正在計算每個位置被測量的可能性。似然值不是概率分布,因為它總和不為一。

這些的組合給出了等式

%5Cmathtt%7Bposterior%7D%20%3D%20%5Cfrac%7B%5Cmathtt%7Blikelihood%7D%20%5Ctimes%20%5Cmathtt%7Bprior%7D%7D%7B%5Cmathtt%7Bnormalization%7D%7D%0A

當我們談?wù)摓V波器的輸出時,我們通常將執(zhí)行預(yù)測后的狀態(tài)稱為先驗預(yù)測,并將更新后的狀態(tài)稱為后驗狀態(tài)估計。

學(xué)習和內(nèi)化這些術(shù)語非常重要,因為大多數(shù)文獻都廣泛使用它們。

scaled_update()執(zhí)行了此計算?確實如此。讓我把它改寫成這種形式:

In?[12]:

這個功能并不完全通用。它包含有關(guān)走廊的知識,以及我們?nèi)绾螌y量值與其匹配。我們總是努力編寫通用函數(shù)。這里我們將從函數(shù)中移除似然計算,并要求調(diào)用者自己計算似然。

這是該算法的完整實現(xiàn):

似然的計算因問題而異。例如,傳感器可能不會只返回 1 或 0,而是返回float 0 和 1 之間的值,表示在門前的概率。它可能會使用計算機視覺并報告一個斑點形狀,然后您可以概率地將其與門匹配。它可能會使用聲納并返回距離讀數(shù)。在每種情況下,似然的計算都會不同。我們將在本書中看到許多這樣的例子,并學(xué)習如何進行這些計算。

FilterPy 實現(xiàn)update. 這是完全通用形式的先前示例:

In?[13]:

Out[13]:

結(jié)合運動測量值

回想一下,當我們結(jié)合一系列測量和運動更新時,我們能夠以多快的速度找到一個精確的解決方案。然而,這發(fā)生在一個完美傳感器的虛構(gòu)世界中。我們能否找到帶有噪聲傳感器的精確解決方案?

不幸的是,答案是否定的。即使傳感器讀數(shù)與極其復(fù)雜的走廊地圖完美匹配,我們也不能 100% 確定狗在特定位置,畢竟,每個傳感器讀數(shù)都有錯誤的可能性很??!自然地,在更典型的情況下,大多數(shù)傳感器讀數(shù)都是正確的,我們可能接近 100% 確定我們的答案,但永遠不會 100% 確定。這可能看起來很復(fù)雜,但讓我們繼續(xù)進行數(shù)學(xué)編程。

首先讓我們處理簡單的情況——假設(shè)運動傳感器是完美的,它報告說狗向右移動了一個空間。我們將如何改變我們的belief陣列?

我希望經(jīng)過片刻的思考后,很明顯我們應(yīng)該將所有值向右移動一個空格。如果我們之前認為 Simon 有 50% 的機會在位置 3,那么在他向右移動一個位置后我們應(yīng)該相信他有 50% 的機會在位置 4。走廊是圓形的,所以我們將使用模運算來執(zhí)行移位。

In?[14]:

我們可以看到我們正確地將所有值向右移動了一個位置,從數(shù)組的末尾回到開頭。

下一個單元格對此進行動畫處理,以便您可以看到它的運行情況。使用滑塊及時向前和向后移動。這模擬了Simon在走廊里走來走去。它尚未包含新的測量值,因此概率分布不會改變形狀,只會改變位置。

In?[15]:

復(fù)習術(shù)語

讓我們暫停一下來回顧一下術(shù)語。我在上一章介紹了這個術(shù)語,但讓我們花點時間來幫助鞏固你的知識。

系統(tǒng)是我們試圖建?;驗V波的對象。這里的系統(tǒng)是我們的狗。狀態(tài)是其當前配置或值。在本章中,狀態(tài)是我們狗的位置。我們很少知道實際狀態(tài),所以我們說我們的濾波器產(chǎn)生系統(tǒng)的狀態(tài)估計。在實踐中,這通常被稱為狀態(tài),所以要小心理解上下文。

預(yù)測和更新測量的一個周期稱為狀態(tài)的或系統(tǒng)的迭代,它是時間迭代的簡稱。另一個術(shù)語是系統(tǒng)傳播。它指的是系統(tǒng)的狀態(tài)如何隨時間變化。對于濾波器,時間通常是離散的步長,例如 1 秒。對于我們的狗追蹤器,系統(tǒng)狀態(tài)是狗的位置,狀態(tài)迭代是經(jīng)過離散時間后的位置。

我們使用過程模型對系統(tǒng)行為進行建模。在這里,我們的過程模型是狗在每個時間步移動一個或多個位置。這不是一個關(guān)于狗行為的特別準確的模型。模型中的錯誤稱為系統(tǒng)錯誤過程錯誤。

預(yù)測是我們的新先驗。時間向前發(fā)展,我們在不知道測量結(jié)果的情況下做出了預(yù)測。

讓我們舉個例子。狗的當前位置是 17 m。我們的迭代時長為 2 秒,狗以 15 m/s 的速度行進。我們預(yù)測他將在兩秒鐘內(nèi)到達哪里?

顯然,

%5Cbegin%7Baligned%7D%0A%5Cbar%20x%20%26%3D%2017%20%2B%20(15*2)%20%5C%5C%0A%26%3D%2047%0A%5Cend%7Baligned%7D%0A

我在變量上使用條形圖來表示它們是先驗(預(yù)測)。我們可以這樣寫過程模型的等式:

%5Cbar%20x_%7Bk%2B1%7D%20%3D%20f_x(%5Cbullet)%20%2B%20x_k%0A

x_k是當前位置或狀態(tài)。如果狗在 17 m 處,則x_k%20%3D%2017.

f_x(%5Cbullet)是 x 的狀態(tài)傳播函數(shù)。它描述了x_k在一個時間步內(nèi)發(fā)生變化多少。對于我們的示例,它執(zhí)行計算15%20%5Ccdot%202,所以我們將其定義為

f_x(v_x%2C%20t)%20%3D%20v_k%20t%0A

.

給預(yù)測增加不確定性

perfect_predict()假設(shè)完美的測量,但所有傳感器都有噪音。如果傳感器報告我們的狗移動了一個空間,但他實際上移動了兩個空間,或者零個空間怎么辦?這聽起來像是一個無法克服的問題,但讓我們對其建模并看看會發(fā)生什么。

假設(shè)傳感器的移動測量有 80% 的可能性是正確的,有 10% 的可能性向右超過一個位置,有 10% 的可能性低于向左的位置。也就是說,如果移動測量值為 4(即向右移動 4 個空格),則狗向右移動 4 個空格的可能性為 80%,向右移動 3 個空格的可能性為 10%,向右移動 5 個空格的可能性為 10%。

數(shù)組中的每個結(jié)果現(xiàn)在都需要包含 3 種不同情況的概率。例如,考慮測量值 2。如果我們 100% 確定狗從位置 3 開始,那么他有 80% 的機會在 5,10% 的機會在 4 或 6。讓我們嘗試編碼:

In?[16]:

它似乎工作正?!,F(xiàn)在,當我們的信念不是 100% 確定時會發(fā)生什么?

In?[17]:

Out[17]:

這里的結(jié)果比較復(fù)雜,但你應(yīng)該仍然能夠在腦海中計算出來。0.04 (新位置3)是由于 0.4 (原位置2)有10%過低測量導(dǎo)致的。0.38 (新位置4)是由于以下原因:80% 的機會我們從原位置2移動了 2 個位置(0.4$\times0.8)%20%E5%92%8C%2010%25%20%E7%9A%84%E6%9C%BA%E4%BC%9A%E4%BB%8E%E5%8E%9F%E4%BD%8D%E7%BD%AE3%20%E8%BF%87%E4%BD%8E%E6%B5%8B%E9%87%8F%20(0.6\times$0.1)。過高的測量值在這里不起作用,因為如果我們從 0.4 和 0.6 對應(yīng)的位置得到過高測量值都會超過這個位置。我強烈建議做一些例子,直到所有這些都非常清楚,因為接下來的大部分內(nèi)容都取決于對這一步的理解。

如果您在執(zhí)行更新后查看概率,您可能會感到沮喪。在上面的示例中,我們從兩個位置的概率 0.4 和 0.6 開始;執(zhí)行更新后,概率不僅降低了,而且分散在地圖上。

這不是巧合,也不是精心挑選的例子的結(jié)果——預(yù)測總是正確的。如果傳感器有噪聲,我們會丟失一些關(guān)于每個預(yù)測的信息。假設(shè)我們要進行無限次預(yù)測——結(jié)果會是什么?如果我們在每一步都丟失信息,我們最終肯定會完全沒有信息,我們的概率將平均分布在數(shù)組中belief。讓我們嘗試 100 次迭代。情節(jié)是動畫的;使用滑塊更改步數(shù)。

In?[18]:

In?[19]:

在 100 次迭代之后,我們幾乎丟失了所有信息,即使我們 100% 確定我們從位置 0 開始。你可以隨意修改數(shù)字以查看不同更新次數(shù)的效果。例如,在 100 次更新后留下少量信息,在 50 次更新后留下很多信息,但是經(jīng)過 200 次迭代,基本上所有信息都丟失了。

而且,如果您在線查看此內(nèi)容,這里是該輸出的動畫。

我不會在本書的其余部分生成這些獨立的動畫。請參閱前言以獲取在 Web 上免費運行本書或在您的計算機上安裝 IPython 。這將允許您運行所有單元格并查看動畫。練習這段代碼非常重要,而不僅僅是被動地閱讀。

用卷積抽象

我們假設(shè)運動誤差最多是一個位置。但錯誤可能是兩個、三個或更多位置。作為程序員,我們總是希望抽象我們的代碼,使其適用于所有情況。

這很容易用卷積解決。卷積用另一個函數(shù)修改一個函數(shù)。在我們的例子中,我們正在使用傳感器的誤差函數(shù)修改概率分布。predict_move()是一個卷積的實現(xiàn),雖然我們沒有這樣稱呼它。形式上,卷積定義為

(f%20%5Cast%20g)%20(t)%20%3D%20%5Cint_0%5Et%20%5C!f(%5Ctau)%20%5C%2C%20g(t-%5Ctau)%20%5C%2C%20%5Cmathrm%7Bd%7D%5Ctau%0A

f%5Cast%20g 是將 f 與 g 進行卷積的符號。這并不意味著倍增。

積分用于連續(xù)函數(shù),但我們使用的是離散函數(shù)。我們用求和代替積分,用數(shù)組括號代替括號。

(f%20%5Cast%20g)%20%5Bt%5D%20%3D%20%5Csum%5Climits_%7B%5Ctau%3D0%7D%5Et%20%5C!f%5B%5Ctau%5D%20%5C%2C%20g%5Bt-%5Ctau%5D%0A

predict_move()正在計算這個方程 - 它計算一系列乘法的總和。

可汗學(xué)院對卷積有很好的介紹,維基百科有一些關(guān)于卷積的優(yōu)秀動畫。但是大意已經(jīng)很清楚了。您將一個稱為內(nèi)核的數(shù)組滑過另一個數(shù)組,將當前單元格的鄰居與第二個數(shù)組的值相乘。在上面的示例中,我們使用 0.8 表示移動到正確位置的概率,0.1 表示過低,0.1 表示過高。我們用 array 表示這個內(nèi)核[0.1, 0.8, 0.1]。我們需要做的就是編寫一個循環(huán)遍歷數(shù)組的每個元素,乘以內(nèi)核,然后對結(jié)果求和。為了強調(diào)信念是一種概率分布,我將其命名為pdf。

In?[20]:

代碼雖然實現(xiàn)了算法,但運行速度非常慢。SciPy在ndimage.filters模塊中提供了一個卷積方法 convolve()。我們需要在卷積之前將 pdf 移動 offsetnp.roll()就可以。這樣,移動和預(yù)測可以用一行來實現(xiàn):

FilterPy 使用 discrete_bayes.predict() 函數(shù)來實現(xiàn)。

In?[21]:

除了中間的元素外,所有元素都沒有變化。位置 4 和 6 的值應(yīng)該是

(0.1%20%5Ctimes%200.05)%2B%20(0.8%20%5Ctimes%200.05)%20%2B%20(0.1%20%5Ctimes%200.55)%20%3D%200.1%0A

位置5應(yīng)該是

(0.1%20%5Ctimes%200.05)%20%2B%20(0.8%20%5Ctimes%200.55)%2B%20(0.1%20%5Ctimes%200.05)%20%3D%200.45%0A

讓我們確保對大于 1 的運動和不對稱內(nèi)核(下面例子的內(nèi)核為 [0.05, 0.05, 0.6, 0.2, 0.1])能正確工作。

In?[22]:

位置被正確地移動了 3 個位置,我們給過高測量給與更多權(quán)重,所以這看起來是正確的。

確保您了解我們在做什么。我們正在預(yù)測狗的移動位置,并對概率進行卷積以獲得先驗。

如果我們不使用概率,我們會使用我之前給出的這個等式:

%5Cbar%20x_%7Bk%2B1%7D%20%3D%20x_k%20%2B%20f_%7B%5Cmathbf%20x%7D(%5Cbullet)%0A

先驗概率是我們對狗在哪里的預(yù)測,是狗移動的量加上他當前的位置。例如,狗在 10 點,他移動了 5 米,所以他現(xiàn)在在 15 米處。再簡單不過了。但是我們使用概率對此進行建模,所以我們的等式是:

%5Cbar%7B%20%5Cmathbf%20x%7D_%7Bk%2B1%7D%20%3D%20%5Cmathbf%20x_k%20%5Cast%20f_%7B%5Cmathbf%20x%7D(%5Cbullet)%0A

我們正在將當前概率位置估計與我們認為狗移動了多少的概率估計進行卷積。這是相同的概念,但數(shù)學(xué)略有不同。%5Cmathbf%20x 粗體表示它是一個數(shù)組。

【經(jīng)典教程翻譯】卡爾曼與貝葉斯濾波器:離散貝葉斯濾波器(上)的評論 (共 條)

分享到微博請遵守國家法律
德安县| 平顺县| 南陵县| 贵州省| 明水县| 柘荣县| 综艺| 苏尼特右旗| 大城县| 青铜峡市| 海原县| 神农架林区| 石泉县| 海晏县| 望谟县| 华容县| 黄陵县| 错那县| 昌邑市| 海伦市| 四川省| 平原县| 乌兰察布市| 承德市| 元阳县| 荣昌县| 大宁县| 齐河县| 濉溪县| 苗栗县| 威宁| 定西市| 通榆县| 乐业县| 赤水市| 商河县| 汽车| 扎囊县| 汶上县| 安图县| 镇安县|