「學習的同時記錄,記錄的同時分享,分享的同時交流,交流的同時學習。」node
先上一個卡爾曼的照片,以表敬意:python
卡爾曼濾波器
-
英文kalman filter -
這裏介紹簡單的,只有一個狀態的濾波器 -
卡爾曼濾波器常常用在控制系統中、機器人系統中,可是這裏主要講解如何用在AI的大數據分析預測中 -
爲何考慮到用這個處理時間序列?由於有一個隊員提出,在處理電信號、語音、位置信息的時候,使用kalman濾波器能夠更有效的過濾更多的噪音。 -
在嘗試特徵工程的時候,我是把這個方法當成一個玄學,看看是否能夠提升效果,由於我目前還理解不了這其中的統計學的奧祕。
爲何要用kalman filter
假設咱們有100個時間點的數據,這個數據就是分別在100個點觀測出來的結果。web
對於每個時間點的數據,獲取的方法有兩個:面試
-
第一個就是觀測,可是測量的結果不必定準確,可能受限於測量儀器的精度? -
第二個就是用這個時間點以前的全部數據,預測這個時間點的數據,固然,這個預測值也是不許的。 -
能否利用這兩種方法,相互促進,預測的值更準,或者說讓觀測到的值更接近本質?Kalman Filter卡爾曼濾波器就這樣作的。
這裏確定會有人不理解,觀測到的值都不必定準,你怎麼還能依賴於預測的值呢?(其實這個是阿里的面試官反駁個人話,當時我確實蒙了,由於這個方法只是拿來用在特徵構建中,其實濾波器是用在控制系統專業中的,下面是朋友給我講的一個例子。)算法
【破解概念上的認知枷鎖:卡爾曼濾波究竟作了什麼事情】微信
卡爾曼濾波作的事就是:舉個例子,已知上個時刻飛機的位置,知道如今這個時刻收到的雷達測量的飛機的位置。用前面兩個數據來估計此時飛機的位置。精簡的說就是知道上個時刻狀態,又知道測量數據,融合這兩個數據來求當前狀態。機器學習
你必定會問如今知道當前時刻的測量數據那麼我認爲當前狀態就是測量數據不就行了麼?換句話說:「你必定會以爲雷達測量到的飛機位置不就是當前飛機的位置嘛?爲什麼要用卡爾曼濾波來估計飛機當前的位置?」。編輯器
答:如今這個時刻收到的雷達信號測量的飛機的位置還真不必定是飛機當前的真實位置。首先雷達信號測量有偏差。其次你想一想我如今收到雷達信號,那是以前發射過去而後返回的信號。這個過程是否是要時間?這段時間飛機說不定以超2倍音速飛行,說不定直接墜機,這些都有可能。也就是說即便收到測量數據可是仍是不確飛機位置在哪。因而我得須要根據前一個時刻的位置估計出當前時刻的飛機位置 結合 測量數據 綜合考慮來 估計當前飛機位置。這就是卡爾曼濾波的做用。svg
那麼你必定會問:根據前一個時刻估計的飛機位置怎麼就能夠估計如今這個時刻的飛機位置了?函數
答:卡爾曼認爲全部的狀態變化(位置變化)都是線性的。什麼叫作線性?上個時刻位置是0.3,速度是0.2。那麼我估計下個時刻的位置就是0.5。這就叫作線性。
接下來你必定會問:那並非全部的狀態變化都是線性的怎麼辦?你像風速變化它就不是線性的。
答:恭喜你發明了新的算法。事實上別人已經爲這個算法命名了叫作擴展卡爾曼濾波。如今咱們要學習的是卡爾曼濾波。你只須要記住卡爾曼濾波就是認爲全部變化都是線性的。
那麼如今我知道了怎麼用上個時刻飛機的位置估計當前時刻的飛機位置,也知道了還得藉助當前時刻收到的測量數據來綜合考慮來估計當前飛機的位置。那麼怎麼綜合考慮呢?這就涉及到一個比例。到底這兩個數據佔比多少?這就是卡爾曼濾波的核心精髓。卡爾曼濾波算法要動態的調這個比例。(有種中庸之道的調調,既不僅信測量數據,也不僅信上個時刻的位置所估算的當前時刻位置。)
簡單講講kalman filter的過程
每個觀測數據,嚴謹的說都應該會有一個誤差值。比方說,如今溫度計測量是26度,誤差值是0.5度,那麼真實的問題應該是在(25.5,26.5)之間,或者寫成 。
這樣咱們預測的值,和觀測的值,再加上這兩個各自的誤差,總共四個已知信息,來推測真實的、更本質的數據。
-
預測的值:能夠經過事先設定的公式,上一個時刻的真實的值算出來; -
觀測的值:直接讀取測量儀器的值。 -
觀測的值的誤差:這個也是能夠直接獲得的; -
預測的值的誤差:這個是從上一個時間點的預測的值的誤差通過給定公式計算出來的。
下面的公式中,腳標k表示時間點,k-1是上一個時間點。大寫字母A,B,C表示常數,事先設定的;大寫字母H,是一個須要計算的。
-
預測的值: -
觀測的值: -
觀測的值的誤差: -
預測的值的誤差: -
kalman增益H: -
真實的值:
能夠看出,這個kalman增益就是一個加權平均的權重,是觀測值更重要仍是預測值更重要;二者的重要性就由二者的誤差大小決定,誤差小的更重要。
其中 表示上一個時間點的控制信號,比方說一個機器人,機器人的狀態去以爲機器人自身的行爲,可是不少狀況這個控制信號是不用考慮的。比方對股市的時間序列作kalman濾波,那麼並無什麼控制信號去控制,只是任由其自由發展。
舉一個例子,房間的溫度的例子:
總共有三個時刻,上午、下午和晚上(實際的話,時間點間隔應該會很短,這裏只是舉例),上午溫度是觀測值是23度,誤差是0.5,由於上午是第一個時間點,因此沒有預測值;
下午,假設A=1,B=0,因此下午的預測值是23度,而後假設初始誤差是1;下午的觀測值是25度,觀測值的誤差是0.5,因此能夠計算獲得kalman增益 ,因此下午的真實值是:
晚上,晚上的預測值就是上一時刻的真實值,因此是24.6,誤差是 ;晚上的觀測值是20度,而後誤差是0.5,因此kalman增益增益,因此這個時刻的真實值是:
最後總結一下,其實咱們只須要什麼呢?須要知道觀測的偏差是0.5,而後三個時間點的觀測數據:[23,25,20],而後用kalman濾波器以後,就變成[23,24.6,22.56]。相似於一個平滑的做用。
python怎麼實現呢?
from pykalman import KalmanFilter
def Kalman1D(observations,damping=1):
# To return the smoothed time series data
observation_covariance = damping
initial_value_guess = observations[0]
transition_matrix = 1
transition_covariance = 0.1
initial_value_guess
kf = KalmanFilter(
initial_state_mean=initial_value_guess,
initial_state_covariance=observation_covariance,
observation_covariance=observation_covariance,
transition_covariance=transition_covariance,
transition_matrices=transition_matrix
)
pred_state, state_cov = kf.smooth(observations)
return pred_state
這裏面使用的是pykalman庫中的KalmanFilter,由於上面講解的Kalman Filter是簡化的,繞開了正統的解釋的正態分佈的知識,因此這裏的卡爾曼濾波器的參數可能沒法與上面給出的卡爾曼公式中一一對應,會產生必定的脫節,可是本質相同。(說白了就是我學的不夠透徹2333)
這裏講一下參數:
-
initial_state_mean和initial_state_covariance: 在上面的公式中,一開始的初始值,就是第一個觀測值,可是在這個方法中,初始值並非第一個觀測值,而是由一個正態分佈中隨機採樣出來的一個值,這個正態 分佈就是以initial_state_mean爲均值,以initial_state_covariance爲方差的; -
observation_covariance這個能夠至關於觀測誤差; -
transition_covariance這個就是預測誤差; -
transition_matrices就是上面公式中的大寫字母A,爲1。
運行結果
從上面的那個函數中,能夠看到transition_covariance是0.1,也就是預測誤差時0.1,因此假設觀測誤差很小,那麼能夠想象,濾波器後的結果應該與觀測值很是接近,這裏選取觀測誤差爲0.001:而後假設觀測偏差很大,那麼能夠想一想,平滑的力度會很大,結果就是:
最後看一下在某次比賽中的利用kalman濾波器來平滑數據的先後對比圖:
喜歡的話,長按下面的二維碼關注下【機器學習煉丹術】,成爲炫酷的煉丹師吧!
目前在更:天天一兩個AI面試乾貨知識點。
公衆號中回覆【下載】有免費的精選的機器學習相關的學習資料哦,持續更新哦!
歡迎你們加我好友,交流學習知識,攜手並進。
還有更多的知識點:
AI面試擴展之LightGBM = GOSS + histogram + EFB
本文分享自微信公衆號 - 機器學習煉丹術(liandanshu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。