'that's one small step for man,one giant leap for mankind.' — neil alden armstron
[toc]
二十世紀的阿波羅登月計畫在人類歷史上是濃墨重彩的一筆, 是人類科學發展極其重要的里程碑. 在此計畫中, 阿姆斯特朗在月球上說出了上面的一句話,是對此計畫最最恰當的注釋. 說起來這個計畫很''簡單'': 送人到月球轉一圈,然後再回來. 這麼乙個'簡單'的計畫實施起來得有多困難大家心中早有尺度.而卡爾曼濾波器(kalman filter)就是其中的功臣.
卡爾曼濾波(器)是以其主要貢獻者 rudolf emil kalman 命名的. 這個濾波器做什麼的呢?
現在,時間閃回到 2023年 七月, 當時 armstrong 正坐在阿波羅11號中,飛向月球. 在此期間掌握飛船的位置及其速度是非常重要的.因為只要偏差超過一定閾值, 飛船的超高速就會將這偏差迅速放大,進而飛船就會偏離預定軌道,最終,極有可能飛向太空就再也回不來了.
那要如何得到飛船在某個時間點的位置與速度呢?
我們知道地面上的科學家在將阿波羅11號發射公升空之前肯定會預先計算飛船每個點的位置,或者一定有乙個計算精確的計算公式.但, 無論多麼精確的公式都無法包含所有因素,不確定性是無法避免的. 而阿波羅上面肯定會有一套複雜的感測系統來測算飛船的位置與速度, 然而, 傳感覺器必然地會有偏差. 也就是說我們會從兩種不同的途徑獲得兩套引數(位置與速度), 這兩套引數一般是不同的,卻又都是不準確的.
我們當然會想到:能不能綜合地考慮這兩套引數,從而獲得一套靠譜的引數,來指導飛船航行? 那這兩個引數如何綜合考慮呢? 在此關鍵時刻,榮耀騎士 — 卡爾曼濾波器登場了.它的出現就是解決此等棘手問題的.
卡爾曼濾波器是如何工作的呢? 我們知道科學家的公式是不會錯的,只不過外界因素干擾,才使其失準的.因此我們以其為基準,用感測器的引數來對基校準. 感測器的引數也有不確定性. 我們的目的是獲得更精準的引數, 故需要在感測引數校正公式引數時,首要任務即是在當前所有資訊面前最小化不確定性.這就是卡爾曼濾波器的作用. 至於它是如何最小化不確定性的,就要涉及公式了, 你確定要上嗎? 如果是,請繼續~
模型:{xk
=akx
k−1+
bkuk
+wky
k=ck
xk+v
k其中所有變數均為矩陣(或向量), xk
: k 時刻的狀態向量; ak
: 狀態轉移矩陣; bk
: 控制矩陣,uk
: 控制向量; 一般,將此控制部分當作確定部分而不包含在模型中,因此上式可簡化為:{x
k=ak
xk−1
+wky
k=ck
xk+v
kyk : k時刻的觀測向量; ck
: 觀測矩陣; wk
,vk均為零均值白雜訊,方差分別為 qk
,rk, 其互不相關,並與初始狀態亦不相關:wk
:e[w
k]=0
,σ2k
=qk;
vk:e
[vk]
=0,σ
2k=r
k;co
v[x0
,wk]
=0;c
ov(x
0,vk
)=0;
e[wk
vtk]
=0.卡爾曼濾波器即是利用遞推方法及狀態方程(式1或式2) 尋找最小均方誤差狀態變數 xk
的估計值 x^
k:x~
k=xk
−x^k
mine[x
~kx~
tk]→
x^k當不考慮白雜訊時:x^
′k=a
kx^k
−1y^
k=ck
x^′k
=cka
kx^k
−1其中 x^′
k 為 k 時刻狀態的估計值(由上一時刻狀態經轉移矩陣得到), y^
k 為測量值的估計值(由狀態估計值推出), 而 x^
k 現在稱為狀態校正後的估計值.
觀測向量的誤差(也即新息):y~
k=yk
−y^k
用觀測值來校正狀態變數:x^
k==a
kx^k
−1+h
k(yk
−y^k
)akx
^k−1
+hk(
yk−c
kakx
^k−1
)其中, hk
稱為增益矩陣,即為一新息加權矩陣.
新息(innovation)y~k
即是在 k 時刻之前沒有但在 t 時刻產生的新的新資訊. 用代數的語言即是 新息與過去的資訊是正交的:e[
y~ky
tj]=
o,1≤
j<
k而且可以容易的推論出, 新息之間也是正交的:e[
y~iy
~tj]
=o,i
≠j,a
nd1≤
i,j≤
k從而可知, 新息y~
k是乙個與k 之前時刻的資料不相關,且有白雜訊性質的隨機過程.
校正後的狀態變數估計誤差及其均方值 (p
k) 還有未經校正的狀態變數估計誤差的均方值 (p′
k):x~
kpkp
′k==
=xk−
x^ke
[x~k
x~tk
]=e[
(xk−
x^k)
(xk−
x^k)
t]e[
(xk−
x^′k
)(xk
−x^′
k)t]
卡爾曼濾波器即是最小化 pk
(不確定性) 的方式來得到 hk
,最終得到 x^
k :minpk→
hk→x
^kx~
k===
=xk−
x^ka
kxk−
1+wk
−(ak
x^k−
1+hk
(yk−
ckak
x^k−
1))a
kxk−
1+wk
−(ak
x^k−
1+hk
(ck(
akxk
−1+w
k)+v
k−ck
akx^
k−1)
)(ak
−hkc
kak)
(xk−
1−x^
k−1)
+(i−
hkck
)wk−
hkvk
偷個懶吧, 接著就是'暴力'推導, 沒有什麼技術含量, 只看你有沒有仔細,否則結果一定會出來.
經過幾張a
4紙的推導, 你可以得到以下幾個重要公式:⎧⎩
⎨⎪⎪⎪
⎪⎪⎪⎪
⎪x^k
hkp′
kpk=
===a
kx^k
−1+h
k(yk
−cka
kx^k
−1)p
′kct
k(ck
p′kc
tk+r
k)−1
akpk
−1at
k+qk
−1(i
−hkc
k)p′
k這就是卡爾曼濾波器的遞推公式了.
假設我們要研究的物件是乙個房間的溫度。根據你的經驗判斷,這個房間的溫度是恆定的,也就是下一分鐘的溫度等於現在這一分鐘的溫度(假設我們用一分鐘來做時間單位)。假設你對你的經驗不是100%的相信,可能會有上下偏差幾度。我們把這些偏差看成是高斯白雜訊(white gaussian noise),也就是這些偏差跟前後時間是沒有關係的而且符合高斯分布(gaussian distribution)。另外,我們在房間裡放乙個溫度計,但是這個溫度計也不準確的,測量值會比實際值偏差。我們也把這些偏差看成是高斯白雜訊。
好了,現在對於某一分鐘我們有兩個有關於該房間的溫度值:你根據經驗的**值(系統的**值)和溫度計的值(測量值)。下面我們要用這兩個值結合他們各自的雜訊來估算出房間的實際溫度值。
假如我們要估算k時刻的實際溫度值。首先你要根據k-1時刻的溫度值,來**k時刻的溫度。因為你相信溫度是恆定的,所以你會得到k時刻的溫度**值是跟k-1時刻一樣的,假設是23度,同時該值的高斯雜訊的偏差是5度(5是這樣得到的:如果k-1時刻估算出的最優溫度值的偏差是3,你對自己**的
不確定度是4度,他們平方相加再開方,就是5)。然後,你從溫度計那裡得到了k時刻的溫度值,假設是25度,同時該值的偏差是4度。
由於我們用於估算k時刻的實際溫度有兩個溫度值,分別是23度和25度。究竟實際溫度是多少呢?相信自己還是相信溫度計呢?究竟相信誰多一點,我們可以用他們的協方差(covariance)來判斷。因為kg=5^2/(5^2+4^2),所以kg=0.61,我們可以估算出k時刻的實際溫度值是:23+0.61*(25-23)=24.22度。可以看出,因為溫度計的協方差(covariance)比較小(比較相信溫度計),所以估算出的最優溫度值偏向溫度計的值。
現在我們已經得到k時刻的最優溫度值了,下一步就是要進入k+1時刻,進行新的最優估算。到現在為止,好像還沒看到什麼自回歸的東西出現。對了,在進入k+1時刻之前,我們還要算出k時刻那個最優值(24.22度)的偏差。演算法如下:((1-kg)*5^2)^0.5=3.12。這裡的5就是上面的k時刻你**的那個23度溫度值的偏差,得出的3.12就是進入k+1時刻以後k時刻估算出的最優溫度值的偏差(對應於上面的3)。
就是這樣,卡爾曼濾波器就不斷的把(協方差(covariance)遞迴,從而估算出最優的溫度值。他執行的很快,而且它只保留了上一時刻的協方差(covariance)。上面的kg,就是卡爾曼增益(kalman gain)。他可以隨不同的時刻而改變他自己的值,是不是很神奇!
八 時間序列
時間序列 datetime.datetime 2011 02 31 產生乙個datetimeindex物件 pd.datetimeindex 時間範圍 pd.date range start 4 1 2012 periods 20 時間戳 pd.timestamp 2011 03 12 04 20 ...
時間序列之重取樣引入
資料重取樣 時間資料由乙個頻率轉換到另乙個頻率 降取樣公升取樣 生成一條帶隨機值的時間序列 import numpy as np import pandas as pd date index pd.date range 20190701 periods 12 periods區間 data serie...
一群人花費了四年的時間以NASA的資料巨制「月球」
月亮是我們人類探測到的第一顆星球 有一群人卻把它做成了是乙個真正準確的1 2000萬的月亮模型。一圈led圍繞這它,不斷照亮月球的表面。這個模型月亮是乙個長達4年的專案,由奧斯卡萊和捻角羚在無數的原型和測試設計過程中進行。奧斯卡負責在對映三維和總體設計呈現月球表面。捻角羚負責機械部分和電子工程模擬太...