機器學習&數據挖掘筆記_24(PGM練習八:結構學習)

 

 

  前言:html

  本次實驗包含了2部分:貝葉斯模型參數的學習以及貝葉斯模型結構的學習,在前面的博文PGM練習七:CRF中參數的學習 中咱們已經知道怎樣學習馬爾科夫模型(CRF)的參數,那個實驗採用的是優化方法,而這裏貝葉斯模型參數的學習是先假定樣本符合某種分佈,而後使用統計的方法去學習這些分佈的參數,來達到學習模型參數的目的。實驗內容請參考 coursera課程:Probabilistic Graphical Models 中的assignmnet 8,實驗code可參考網友的:codegit

  實驗中所用到的body pose表現形式以下:github

   

  共有10個節點,每一個節點由2個座標變量和1個方向變量構成。關節名稱和座標系可直接參考上圖。算法

 

  matlab知識:ubuntu

  cov(x): 求的是X無誤差的協方差,即分母除的是n-1.網絡

  cov(X,1):求的是X的最大似然估計協方差,即分母除的是n.dom

 

  實驗中一些函數簡單說明:wordpress

  [mu sigma] = FitGaussianParameters(X):函數

  實驗1內容。輸入X是一個向量,該函數是計算X的均值和標準差,直接按照均值方程公式計算就OK了。tornado

  [Beta sigma] = FitLinearGaussianParameters(X, U):

  實驗2內容。X: 大小爲(M x 1),表示輸入的樣本向量X含有M個樣本,是樹結構中的子節點。U: 大小爲(M x N), 表示有N個父節點,每一個父節點也對應M個樣本。該函數主要是計算N+1個beta係數和一個sigma係數,其計算方法可參考前面的公式。給出本節點的數據和其全部父節點的數據,就能夠計算出在父節點下的條件機率參數。本實驗中,若是某個節點只含有一個父節點,在使用公式計算時也至關於有3個父節點,這是由於每一個節點由3個維度構成,需4個參數。

  關於CLG(conditional linear Gaussian)模型有:

  若是節點X有n個父節點U1..Un,則條件機率爲:

   

  求出樣本的log似然表達式,而後分別這些表達式中的n+1個參數求導,令導數爲0,化簡後可獲得n+1個方程,其中與X直接相關的爲:

   

  其它X分別與n個父節點相關的方程爲:

    

  利用上面n+1個方程就能夠求出Beta的n+1個參數了,最後將log似然函數對sigda求導,並化簡有下面式子(怎麼我推導出來不一樣呢):

    

  這樣的話,CLG模型中全部的參數均可以從數據樣本中學到了。

  VisualizeDataset(Dataset):

  DataSet大小爲n*10*3,即有n個樣本,每一個樣本包含了骨架中的10個節點信息。該函數是將這n個樣本對應的骨架圖一張張顯示出來,有動畫感,你們能夠跑一下, 有點意思。

  val = lognormpdf(x, mu, sigma):

  求高斯分佈在x處的log值,高斯分佈的參數爲mu和sigma,能夠是多維的高斯分佈。

  loglikelihood = ComputeLogLikelihood(P, G, dataset):

  實驗3的內容。P爲模型參數的結構體,P.c爲長度爲2的向量,其值分別表明human和alien的先驗機率。P.clg爲CLG模型中的參數,包含有mu_x, mu_y, mu_angle, sigma_x, sigma_y, sigma_angle, 以及theta(theta長度爲12,由於每一個節點有3個座標信息,而每一個座標在其父節點狀況下需4個參數表示). 固然P.clg中應該同時包含human和alien的這些參數。參數G爲父節點的描述,具體表示細節可參考實驗教材。dataset爲訓練樣本,大小爲N x 10 x 3. 輸出參數loglikelihood爲整個dataset在模型下的log似然值。似然函數值表示模型對數據的擬合程度,可做爲後續樣本分類的依據。loglikeihood的值按下列公式計算:

   

  其中的聯合機率能夠按類別的全機率公式分解計算,以下:

    

  [P loglikelihood] = LearnCPDsGivenGraph(dataset, G, labels):

  實驗4的內容。在實驗3中,咱們是已知了每一個節點的CLG參數,而後求在這些參數下數據的似然值的。那麼這些參數到底怎樣獲得呢?本函數就是完成該功能的。對每一個節點的3個座標而言,每次計算一個座標對應的CLG參數,使用的樣本爲:該數據對應的樣本以及其父節點對應樣本(包含所有3個座標),而後調用FitLinearGaussianParameters()來計算模型參數,結果都保存在P中,另外輸出的loglikelihood是直接調用ComputeLogLikelihood()來函數實現。

  accuracy = ClassifyDataset(dataset, labels, P, G):

  實驗5的內容。給定樣本dataset和標籤labels,給定模型結構G,給定模型參數P,求對應樣本分類的正確率。實現時需記住:有多少個類別,至關於計算了多少個模型,計算哪一個模型下產生該樣本的機率大,就將該樣本分類爲對應的類別。

  I = GaussianMutualInformation(X, Y):

  輸入的矩陣X大小爲N*D1,表示N個樣本,每一個樣本D1維;矩陣Y大小爲N*D2,一樣表示N個樣本,每一個樣本D2維。這兩個矩陣X和Y的每一維樣本都服從高斯分佈。該函數是計算兩個多維高斯分佈樣本的互信息(互信息是個標量,若是2個矩陣相同,則互信息爲0),計算公式以下:

    

  adj = MaxSpanningTree (weights):

  weights爲N*N大小的對稱矩陣,weights(I,j)的值表示節點i和節點j之間的權重。返回的adj也是一個N*N大小的矩陣,但不是對稱矩陣。adj(I,j)=1表示有從節點i指向節點j的邊。該函數的功能就是從權值矩陣中學出tree的結構,並輸出。

  [A W] = LearnGraphStructure(dataset):

  實驗6的內容。該函數是從樣本矩陣dataset(沒有使用標籤信息)中學習模型的權值矩陣W和模型的樹形結構矩陣A.其中每條邊的權值計算公式以下:

  

  該公式第一個等號的推導過程可參考Daphne Koller,Probabilistic Graphical Models Principles and Techniques書籍第18章的18.4小節。它的物理意義是:在i和j之間加入邊先後得分score的變化量,若是爲正,則表示加入該邊後score增長,且說明該結構有利,score增長越大,結構就越有利。第二個等號的推導可參考coursera課程:Probabilistic Graphical Models 在structure learning課件中的第7頁,等號成立是在likelihood score前提下。

  G = ConvertAtoG(A):

  該函數是將max spanning tree A轉換爲圖的結構矩陣G,G的含義與前面的同樣。

  [P G loglikelihood] = LearnGraphAndCPDs(dataset, labels):

  實驗7的內容。該函數實現的是使用dataset學習模型的結構,而後結合labels來學習模型的參數,最後利用該參數來計算樣本的log似然。

 

  相關理論知識點:

  這部分可參考Corsera中的課件以及網友demonstrate的blog:PGM 讀書筆記節選(十五)

  Structure learning的好處有:可發現數據中的相關信息;當專業領域的知識不完善而創建不起徹底正確的graph model時可採用。structure learning常見的有2種:constraint-based structure learning和score-based structure learning,BNs結構學習中通常採用後面那種比較多,即在預設的幾個結構中找出得分最高的那個(經過        搜索)。

  Likelihood Score:指的是給定模型結構G和數據D,求出最優的參數,而後求出在G和該參數下對數據D的log似然值。其表達式以下:

    

  式中第一個求和表示子節點與父節點之間的互信息,第2個求和爲節點的熵,關於互信息計算公式以下:

   

  互信息的值>=0,且當變量x和y相互獨立時互信息爲0,但一般狀況下即便x和y是從相互獨立中的分佈採用得來的,其互信息也大於0。

  Likelihood score容易overfitting,爲了減小overfitting可採用BIC score(BIC:Bayesian Information Criterion),公式爲:

    

  該score對模型中相互獨立參數的個數進行了限制,可以平衡模型對數據的擬合度和模型的複雜度。BIC score具備漸進一致性(consistency),由於隨着樣本的增多,它可以收斂到與true graph的I-equivalent網絡上,而且score也愈來愈大。

  Bayesian score是利用全部參數的加權平均,其表達式以下:

   

  第一項叫Marginal Likelihood,包含了參數的先驗知識在裏面,要求是可以分解。第二項叫結構先驗,它對邊的數目,參數的個數進行懲罰,即對模型的複雜度進行了懲罰。在Bayesian score 中,有惟一一個致使 consistency 的參數先驗BDe prior,因此通常狀況下選擇BDe prior. BIC score是Bayeisan score的一種近似。

  在擁有score函數以及一些候選網絡結構後,須要用搜索算法來尋找最優網絡結構。通常可採用候選網絡結構爲tree(由tree構成forest), 由於tree可以很好的被優化,且擁有稀疏參數,泛化能力較強。另外tree中每一個節點頂多有1個父節點,因此咱們能夠對它進行分解來計算score值:先將有父節點和無父節點的節點分開,而後根據邊的權值公式在網絡加入邊直到score再也不增長,或者出現環時中止。最後採用max-weight spanning trees(MST)搜索算法找出權值大的那些邊。

  對於Likelihood score來講,邊的權值非負,對於BIC score和Bayesian score來講,邊的權值能夠爲負數(由於score函數對邊數有懲罰,至關於邊權值爲負)。

  實際中不少網絡並非tree結構,也就是說能夠有多個父節點,更復雜。有理論證實,若是父節點個數>1,則搜索得分最高的網絡的過程是NP-hard的。此時通常採用啓發式搜索,以greedy登山法爲例:給定一個初始的網絡結構(能夠是空的,隨機的,或是學習出來的tree,亦或是先驗設計的),在該網絡基礎上採用添加、刪除、反向等操做逐步選擇得分最高的那個操做,依次迭代直到score再也不變。雖然邊的反向操做能夠由刪除和添加2個步驟構成,可是因爲在局部最優勢附近採用greedy的方法時,刪除邊會致使score下降(意味着不會採用該操做),這樣就實現不了邊的反向了,所以須要引入Edge Reversal操做。

  Naive Computational Analysis: 每一步edge的添加、刪除、反向的時間複雜度爲O(n^2);若是網絡中有n個component,且計算每一個component的充分統計量需O(M)時間;另外環檢測(Acyclicity check)時間和邊數m成正比,爲O(m); 則結構搜索中的每一步代價爲O(n^2*(Mn+m)).

 

  錯誤提示:

  matlab2013b+ubuntu13.10下矩陣運算出現以下錯誤:

  BLAS loading error: dlopen: cannot load any more object matlab.

  網上查了下有很多人遇見過,我這裏是重啓下matlab解決的。

 

  參考資料:

       網友實驗code.

  coursera課程:Probabilistic Graphical Models 

  PGM練習七:CRF中參數的學習

  網友demonstrate的blog:PGM 讀書筆記節選(十五)

    Daphne Koller,Probabilistic Graphical Models Principles and Techniques書籍第18章

相關文章
相關標籤/搜索