從0開始的機器學習(二)--初探MAP估計

這次對應的內容是《神經網路與機器學習》的第二章。

MAP(Maximum A Posteriori Estimation)中文名叫最大後驗估計,是貝葉斯估計的一種應用形式。其核心的思想是通過改變感知器的權值的方法來最大化後驗估計分布函數,進而得到能夠最恰當描述系統的一系列權值。

相對於傳統學派的頻率估計來說,貝葉斯估計理解起來會比較艱難,但可以總結為:對系統的後驗估計(修正模型)與系統的先驗估計(原模型)和在此估計狀態下出現對應結果的乘積成正比。換句話說,你對系統的估計模型將會根據觀測的結果進行修正。用公式表示即是:

pi(	heta|x)=frac{h(x,	heta)}{m(x)}=frac{f(x|	heta)pi(	heta)}{int_{Theta}^{}f(x|	heta)pi(	heta){
m d}	heta}

對貝葉斯估計的更詳細的描述可以在任何其他書目當中找到。我對此也並不是十分了解,因此這裡就僅僅用上結論來做下一步的推導。感興趣的可以參考《極大似然估計與貝葉斯估計》這篇博文,可以從中略知一二。

下面我們構建對待測系統的模型,如圖所示:

其中,(a)是真實待測的環境,(b) 為我們構建的線性回歸模型。針對所構建的物理模型產生的訓練集,我們做三點假設:(1)訓練集之間是統計隨機的,滿足獨立同分布關係(2)其分布關係滿足高斯分布(3)系統是穩定的,也就是說系統是一個時不變系統。

在此三點假設上,就可以得到下面幾個對系統的描述:

  1. 對權值的先驗描述:假設每個權值滿足0均值,方差為 sigma^{2}_{	extbf{w}} 的正態分布(h),那麼先驗可以表述為

pi(	extbf{w})=prod_{k=1}^{M}pi(
m{w}_{k})=frac{1}{(sqrt{2pi}sigma_{
m{w}})^{M}}
m{exp}(-frac{sum_{i=1}^{M}w_{emph{k}}^2}{2sigma^{2}_{w}})=frac{1}{(sqrt{2pi}sigma_{
m{w}})^{M}}
m{exp}(-frac{||	extbf{w}||^2}{2sigma^{2}_{w}})

2. 在給定權值與輸入參數,每次得到觀測值 d_i 後,對系統誤差概率的描述:

l(	extbf{w}|d_i,	extbf{x}_i)=frac{1}{(sqrt{2pi}sigma)^2}
m{exp}(-frac{1}{2sigma^2}(emph{d}_emph{i}-	extbf{w}^	extbf{T}	extbf{x}_emph{i}))

3.對系統的後驗估計:

pi(	extbf{w}|d,	extbf{x})proptoprod_{i}^{}l(	extbf{w},d_i|	extbf{x}_i))pi(	extbf{w}) 也即是: pi(	extbf{w}|d,	extbf{x})propto
m{exp}[-frac{1}{2sigma^2}sum_{i=1}^{emph{N}}(emph{d}_emph{i}-	extbf{w}^T	extbf{x}_emph{i})^2-frac{1}{2sigma^2_	extbf{w}}||	extbf{w}||^2]

現在,要想調節參數使得系統的後驗估計最大,則等同於求出參數w,使得二次函數 xi(	extbf{w})=frac{1}{2}sum^{N}_{i=1}(d_i-	extbf{w}^T	extbf{x}_i)^2+frac{lambda}{2}||	extbf{w}||^2 最小。其中, lambda=frac{sigma^2}{sigma^2_	extbf{w}}

從公式中可以看出,這是一個帶正則化的最小二乘問題,其解為:

hat{	extbf{w}}_{MAP}(N)=[	extbf{R}_{	extbf{xx}}(N)+lambda	extbf{I}]^{-1}	extbf{r}_{dx}(N)

其中

hat{	extbf{R}}_{	extbf{xx}}(N)=-sum_{i=1}^{N}sum_{j=1}^{N}	extbf{x}_i	extbf{x}_j , hat{	extbf{r}}_{dx}(N)=-sum_{i=1}^{N}	extbf{x}_id_i


OK 繁瑣的公式部分結束,簡單來說,就是可以通過給定的集合,結合最大後驗估計的方法,一步到位算出對應的權值大小。下面仍然以上一章的雙月集產生程序作為示例,演示此種估計方法。代碼如下:

% 產生帶標籤的數據集合data = DoubleMoonDataGenerator(2000,10,1,6,true);% 期望輸出d = data(:,3);%輸入矩陣為[x,y,1]的多列形式XYD_array = data;XYD_array(:,3) = abs(XYD_array(:,3));%構建最小二乘問題,帶正則項,這裡設為0.02Rxx = -XYD_array*XYD_array;rdx = -[data(:,1)*d;data(:,2)*d;sum(d)];w = (Rxx+0.02*eye(3))rdx;%繪製邊界X = -30:0.1:30;Y = (-w(1)*X-w(3))/w(2);plot(data(:,1),data(:,2),.);hold onplot(X,Y);grid on

其運行結果如圖:

對此部分內容我也不是太過於明白,有理解錯誤地方還請指正。


推薦閱讀:
相关文章