卡爾曼

斷斷續續,大概弄了將近一個月的時間,今天總算是把卡爾曼濾波器用於流量矩陣估計的問題給解決了。實驗結果很理想,和作者的實驗結果差不多。

      回顧整個過程:

      1,覺得卡爾曼有現成的預測和更新公式,只要確定參數C、Q、R就可以使用,很簡單,便用最小二乘從直接測量的一天的數據算出C,再根據樣本方差確定Q,由於Y是直接通過恆定的Y計算得來,所以假設R=0。但是,通過這些參數,使用卡爾曼進行估計時,發現估計的值是發散的,相對誤差幾乎成指數增長,令人費解。

      2,反省,覺得還是由於對卡爾曼理解不夠,所以導致不知道問題出在哪。於是開始着手對卡爾曼濾波的兩個方程的理解,包括公式的推導。主要是其中的增益矩陣K的推導,soul的那篇論文裏並沒有給出推導公式,我又看了其參考文獻的關於卡爾曼的介紹,也沒有給出推導,後來反而是在網上瞎找時,偶然在維基百科上找到了關於卡爾曼濾波的完整介紹,包括各個公式所依據的理論和推導過程,知道原來卡爾曼的理論基礎原來是馬爾可夫過程和貝葉斯統計。通過這上面的介紹也消除了我以前在看卡爾曼的一個疑問,就是關於更新公式中的估計方差的公式不一致的問題,有的論文(流量估計方面的論文中關於卡爾曼濾波)提出Pe = (I-KA)Pp(I - KA)'   (1)而有的論文(專門單獨介紹卡爾曼濾波的論文)爲Pe = (I-KA)Pp   (2)。其實兩種寫法都對,當K取最優增益時(使估計誤差最小),(1)可以通過一系列推導簡寫爲(2) ,當然在實際應用時,K都是取的最優增益,所以便取(2)。

       3,通過2對卡爾曼濾波的理解,我覺得可能是由於參數的確定出了問題,因爲soul提出用最大似然估計的EM算法確定C和Q,而我用的是最小二乘,而我們知道卡爾曼濾波在使用時是假設X(t)=CX(t-1)+W(t),即X爲馬爾可夫鏈式的高斯分佈,所以明顯地用最大似然估計得到的參數更適用於卡爾曼估計。今天的實驗結論也證明了這一點。但是問題又來了,soul本人的論文中關於怎麼樣求參數這一問題卻寫的相當簡略而且有點自相矛盾,而實際上,卡爾曼濾波的參數確定需要根據實際的問題來決定,這也是卡爾曼濾波應用的難點和關鍵點。soul的混亂與矛盾在於,論文的第一段說通過24小時直接測量到的X 算出C,第二段又筆鋒一轉:只測量X0,根據觀測數據Y,通過EM算法確定參數C、Q的最大似然估計。這二段文字我讀了很多遍,聯繫上下文揣摩了很多遍,覺得還是矛盾,後來我又在其參考文獻裏專門琢磨其EM算法,由於引入了SWITCH,導致公式符號複雜化,看起來很吃力,後來終於搞定。爲了弄清楚EM算法,我又專門看了些專門介紹EM算法的論文,茹正亮的《EM算法在不完全參數估計中的應用》寫的比較好,至少容易看懂,至此我明白了EM算法的原理,知道了soul論文中的矛盾不矛盾的唯一可能性:如果EM算法的的輸入數據包括24小時直接測量到的X和Y,那麼這個矛盾就不矛盾了。但我知道這是不可能的,因爲EM算法在E步和M步遞推時,必須要藉助於隱藏數據X的概率密度,這樣才能從上一下的參數確定出下一步的參數。

      4,在這一矛盾下,我選擇了後者(只測量到X的一個初始態和24小時的Y,假設其餘的X爲未知的馬爾可夫高斯分佈),因爲作者對於後者的介紹的多一些,於是我用代碼直接編寫的參數估計的EM最大似然估計算法,其具體的EM公式實在是很難看懂,運行後發現結果很不理想,因爲中間根據上一步參數求出下一步參數時,需要用到卡爾曼平滑器(根據24小時的Y對X和P進行平滑處理),這樣首先又需要應用卡爾曼濾波求出預測的估計的所有X,算法代碼在運行時往往會發散。我昨天去圖書館借了幾本關於卡爾曼的書,瞭解到原來是當P在小型機上計算時中間有一個矩陣減法,這樣容易導致其不正定,進而導致迭代計算時會發散。由於初始參數的選取我是採用了過程1中提到的最小二乘算出的C和Q,所以便出現了1中出現的發散現象。總之EM算法對參數的初始值很敏感,這樣,初值的選定成了問題。這一部分現在我還沒有搞清楚。

      5,我決定走自己的路,選擇矛盾的前者,即通過直接測量的24小時的X,通過最大似然估計求出C才Q(假設R=0,即Y的測量無誤差),這一條路其實中間我嘗試過,似然函數爲矩陣C和Q的函數,由於無法用EM算法求解,所以只好直接求偏導算極值,但是遇到了函數矩陣的問題,即把C和Q這樣的矩陣看作變量,如何求導?查閱矩陣分析的書,都是介紹矩陣函數的(矩陣的元素爲函數),昨天在圖書館看到一本特殊矩陣的書,裏面纔有提到函數矩陣的概念,和一些性質(這時候我才知道這個叫函數矩陣)。至此我已經覺得徹底無路可走了,因爲函數矩陣的問題我是無法搞定了。

      6,轉念一想,既然寫成矩陣無法求解,那我就再將矩陣的各個元素分別列出來,獨立求解,昨天晚上推導了一會,發現了可行性,便編寫了代碼驗證,由於算法比較粗糙,用MATLAB運行了1個多小時,未出結果,因爲矩陣過大,MATLAB存不下。今天上午重新對算法改進,一行一行的求解C,這樣終出求了出來。根據C再求出Q,將C和Q代入之前的卡爾曼,經過對一些錯誤的修正,終於取了滿意的實驗結果。

  整個過程中,一方面碰到矛盾、問題時好多次都絕望了,想過放棄,改做別的方法,中間我還做了一些實驗,關於相關係數平穩性的實驗,發現任何週期的相關係數都極不穩定,沒有任何規律可言,而OD流的週期性通過我採用的一種獨特的平滑技術才表現出天的週期性。這讓我覺得卡爾曼在用於TM估計時是無力的,因爲24小時估計出來的時空關係C(爲常數)是粗糙的。我還據此產生的新的想法,略去卡爾曼的傳輸過程,直接通過Y求X,運用平滑技術的週期性,但廣義逆的問題不好解決,這樣做出來的東西是個什麼東西,沒有理論支持,就暫且擱下了。

  今天的實驗結果讓我看到了卡爾曼的強大,它的優秀自適應調整能力。到目前爲止,我還是很驚異於它居然有這麼好的實驗結果。我的關於卡爾曼的改進還有沒有可提升的空間?這一問題變得更容易被否定。目前周靜靜提出了一種UD分解的平方根卡爾曼濾波,對我的研究衝擊很大。我也是因此而昨天去的圖書館,找到了卡爾曼發散的原因呵。

  先寫到這裏。路還很長,而且分岔口很多。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/vert_/archive/2009/11/08/4785179.aspx

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章