高斯過程是什麼?

本文譯自: Duane Rich 的文章Which is your favorite Machine Learning algorithm?

幾乎所有的有監督機器學習算法都專注於找到一個函數f()f(),這個函數是從特徵xix_i到標籤yiy_i的映射的一個近似。通常情況下一個函數的參數決定了一個函數。根據數據,我們通過確定這些參數的(後驗)分佈來確定可能的函數。

高斯過程允許我們根據一組任意有限的輸入和輸出來引用函數。我們通過一個分佈來指定函數:
f(x)=GP(m(x),k(x,x)) f(x)=GP(m(x),k(x,x'))
其中m(x)m(x)k(x,x)k(x,x')是給定的函數,分別叫做mean函數和kernel函數。爲了理解這一點,你可以想象你能從這個GP中採樣出大量的函數,不妨稱它們爲f1(),f2(),...,fN()f_1(),f_2(),...,f_N()。如果你能在一個特定的xx^*中評估這N個函數,你會發現者N個函數的輸出的平均值是m(x)m(x^*)。同樣的,如果你在兩個輸入x1,x2x_1,x_2中評估這些函數,這些輸出的協方差是k(x1,x2)k(x_1,x_2)

正如你可以從一個隨機變量的分佈中採樣出一些值一樣,你也可以從高斯過程中採樣出函數。舉個例子,如果你指定m(x)=0,k(x,x)MaternKernelm(x)=0,以及k(x,x')爲Matern Kernel。你採樣出來的函數可能長這樣:

在這裏插入圖片描述

(source - scikit learn)

因此,一個高斯過程包括一個指定的先驗分佈,GPpriorGP_{prior}。然後以我們數據爲條件,確定出一個函數的後驗分佈GPpostGP_{post}

在實際應用中,我們會使用一個向量對kernel進行參數化,然後選擇一個可以最大化我們的數據和GPpostGP_{post}的特定向量。這個技術的真正藝術之處在於選擇合適的Kernel function。

最後,我們將使用一個優化好的GPpostGP_{post},它可以由於評估任何給定的輸入,我們不需要得到一個輸出值,而是得到一個關於輸出的分佈。

好了,讓我們現在來使用高斯過程吧!

下面是我6個月的體重:
在這裏插入圖片描述
你能看出什麼規律麼?其實我也看不出來。但是:

  1. 這些時刻很接近
  2. 這些時刻在一些週期的同一部分(一週或者一個月中的同一天等)

所以,讓我們來構造出我們的kernel metric吧。

考慮到,這些時間特徵並不是影響體重唯一的因素,應該還有其他特徵來影響體重,所以我們應該在我們的kernel中加入一些噪音。

最後,我的體重應該有一些長期趨勢,比如我可能在兩週裏吃了太多的披薩。或者我在某些日子生病了導致身體日漸消瘦。考慮到這些因素,我們將使用Matern Kernel。

好,現在讓我們測試一下。我們將隱藏25%的數據用於預測。我將根據測試結果畫出一個和兩個標準偏差的置信區間。因此我們得到了:

在這裏插入圖片描述

從圖中可以看出規律已經比較清晰了。我的體重大約有個時長一週的週期,並且會在幾周內趨於正常。 樣本不足,我們得到了不錯的預測,因爲它依賴於週期性並且不會從虛假的趨勢中推斷出來。分佈的輸出似乎對數據進行了很好的校準。

總之,高斯過程很靈活,你可以將你的一些直覺插入模型中,用於解決一些小問題。但是這不是一個通用的模型,他的拓展性不太好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章