標籤:

高斯過程回歸的matlab代碼調試,不知道怎麼設置參數,沒有出現預期效果?

用高斯過程回歸做預測,不會調matlab代碼,一直找不來原因


首先不知道你具體用的是那個代碼包,我用過的主要是GMPL和GPstuff,都挺不錯的內容也挺全的,但是在具體的方面各有千秋吧,下面有鏈接。

gpml: Documentation for GPML Matlab Code

GPstuff:GPstuff

不過,代碼包其實不是重點,重點是實現的途徑。總的來說,Gaussian Process Regression (GPR) 的整體流程是:

  1. 假設聯合高斯分布,確定含參數的mean function and covariance function (kernel),然後確定模型noisy or not,當然這些一般情況下沒有什麼疑問,大多數關於GPR的文章和書都有的。
  2. 利用training set中對應的inputs, outputs去訓練整個模型。這裡就有很大的差別了,雖然說gp本來就是noparamatric的,也就是說不用估計參數,直接根據先驗去算後驗的積分,比如Neal用的MCMC的方法,http://arxiv.org/abs/physics/9701026。 但是,但是MCMC畢竟是一個非常耗費時間的方法,所以一般情況下,我們仍然會選擇去估計參數,也就是那些在mean function 和 kernel 裡面的未知參數。這裡具體利用的還是maximum likelihood。但是問題又來了,由於likelihood function的形式不同,不總是convex的,所以這個優化問題會存在一定的問題。具體的說最後找到的或許只是局部最優解而不是全局最優解,當然事實上我們需要的就是global 。也正是因為這個原因,所以這個問題的就會變成一個初值敏感的問題,也就是說你最後GPR 做的好壞也直接取決於你的這個初值選取的好壞。
  3. 3. 有具體的參數或者先驗,自然根據模型非常容易去做下一步的問題了哈。

    -----------------------------------------------分割線-------------------------------------------------------------

    之前是理論的概括,下面是個人的經驗。

  4. 初值敏感程度取決於kernel的選取, 個人結果是只要是Kernel不帶periodic項的,幾乎不太敏感。比如SE, RQ, Matern等等,但是只要是帶有periodic項的都非常敏感,效果就是千差萬別。所以你需要選取合適的kernel.
  5. 儘可能的克服敏感性的問題的主流解決方法就是在具體參數合理的取值範圍內隨機多次生成一些初始值, 然後進行演算法,然後比較最後的likelihood,最後選取最好的。當然這裡什麼是合理的取值範圍就需要結合具體問題具體分析了。
  6. 不知道你對於kernel 有什麼深入理解么,比較推薦的一個核是wilson他的SM核。Pattern Discovery with Gaussian processes。 具體的內容他的網頁里有提供具體的code,另外他還為他的SM核寫一個比較合適的初值生成方法,而且實際的來說,SM核是一個非常強大的複合核,所以非常推薦。


個人認為GPML是在3個最常用的Matlab的GP toolbox(GPML,GP-LVM, GPStuff里)最簡單易上手的,所以建議調參從GPML開始~

簡單舉例來說:

covfunc = {@covMaterniso, 3}; ell = 1; sf = 2; hyp.cov = log([ell; sf]);

likfunc = @likGauss; sn = 0.1; hyp.lik = log(sn);

hyp_updated = minimize(hyp, @gp, -100, @infGaussLik, [], covfunc, likfunc, xtr, ytr);

Step 1: 使用zero-mean function。優點:廣泛使用、無需訓練mean函數參數、結果準確

Step 2: 選定你喜愛的Covariance function(最常用的就是SE,這裡推薦Matern,不會那麼平滑),然後設置參數。通常isotropic covariance 函數有2個參數,第一個是length-scale, 簡單來說就是the distance at which correlation幾乎為0;第二個是variance;可以理解為這2個參數一個控制分布的延展/平滑、另一個控制振幅~

如果各個輸入維度對輸出的「貢獻」不同,那就需要對每個輸入維度都分別設置不同的length-scale值~

Step 3: 設置好likelihood函數,一般來說就是gaussian模型,參數就是那個variance

Step 4: 設置inference method,數據不太大就用exact inference

P.S. 更複雜的(譬如 如何設置參數prior distribution,如果選擇哪一種covariance, likelihood, inference),還需要具體問題具體對待~,歡迎繼續提出更加具體的問題~


請教您個問題,對於多維輸入,對應一維輸出的該怎麼編程呢?GMPL我看著說的是一維的輸入,麻煩您給講解一下,謝謝啦


推薦閱讀:

如何有效率地閱讀源碼以及修改源碼的技巧?
讀源碼要注意哪些方面?有哪些值得推薦的經典源碼?
閱讀django源代碼?
HashMap的doubleCapacity()方法這樣寫妙在哪?
你對APM飛控的源碼做過哪些有意思的改動?

TAG:源代碼 |