機器學習&數據挖掘筆記_17(PGM練習一:貝葉斯網絡基本操作)


 

  前言:

  以前在coursera上選過一門PGM的課(概率圖模型),今天上去才發現4月份已經開課了,6月份就要結束了,雖然最近沒什么時間,擠一點算一點,所以得抓緊時間學下。另外因為報名這些課程的時候,開課老師是不允許將課程資料和code貼在網上的,所以作為學生還是要聽從老師的要求,所以這個系列的筆記只是簡單的寫下,完全留給自己看的,內容估計不會很完整的。

 

  筆記:

  模型的表示其來源可以由相應領域的專家給出,也可以直接從數據中學習到。如下所示:

   

  模型的准確性具有不確定性主要是因為:對現實世界的描述不全面;觀察到的數據有噪聲;模型只是體現大部分的數據,對某些特例不會考慮;模型固有的不確定性。

  PGM模型在實際使用時需要考慮以下幾個方面:

  表達階段:有圖模型還是無圖模型,時序模型還是平面模型。

  推理階段:近似推理還是確定推理,是否需要做出決定。

  學習階段:是學習網絡的參數還是連結構也需要學習,是否使用全部數據。

  一個factor其實就是一個因果表,因果表中變量組成的集合稱為scope。兩個factor是可以相乘的,稱為factor product. Factor也可以邊緣化,即把表中邊緣變量給求和積分掉。另外還可以從factor中提取出部分行,這種操作稱為factor reduction。還可以根據新獲得的evidence來更改factor的概率值。

  在PGM模型中使用factor的原因是:在高維空間的數據分布中,factor是一個基本的模塊。這些高維空間中的大數據也可以由小的factor相乘組成,並且一些基本的操作都是相通的。

 

  編程作業:

  這次實驗是熟悉下SamIam這個軟件,該軟件是專門正對PGM的實際應用開發的,具體介紹和使用參考官網:http://reasoning.cs.ucla.edu/samiam/index.php。首先第一個小題就是構造一個貝葉斯網絡圖,節點已經給出,並且父子關系已經給出了文字描述,只需連線和給出條件概率表值。網絡圖如下所示:

   

  一些matlab函數:

  [C,ia,ib]  = intersect(A,B):

  返回矩陣C為矩陣A和B中公共的元素,且ia和ib分別為其索引,比如說C=A(ia) 且 C = B(ib)。

  B = any(A):

  判斷A中是否有非零值,默認情況下是對第一維中的元素采用邏輯"AND"操作,所以當A為二維矩陣時,B為一個行向量。

  B = all(A):

  判斷A中是否所有元素值都非零。

  C = union(A,B):

  C為A和B的並集。

  [Lia,Locb] = ismember(A,B):

  判斷A中元素是否為B中的子元素,如果都不是,則Lia和Locb中元素值都為0(注意,Lia大小和A一樣,Locb大小和B一樣)。如果A中有元素是B中的,在Lia中對應返回值相應位置為1,而Locb中返回其在B中對應的位置。

  B = prod(A):

  B表示求A中對應列的元素值的乘積,所以如果A為2維矩陣,則B為行向量。

  [C,ia]  = setdiff(A,B):

  返回的C元素為在A中出現,但是沒有在B中出現,ia為其索引值,滿足C = A(ia)。

  B = cumprod(A):

  B和A的尺寸一樣。如果A是一個向量,則B中每個元素是A中元素的累積表示。如果A是一個矩陣,則是對A的每一列按照累積乘積表示。  

 

  作業中的一些函數:

  C = FactorProduct(A, B)

  其中A和B為2個factor,C為這2個factor的乘積。

  B = FactorMarginalization(A, V):

  其中A為一個factor,V為A中的某一些變量(進行邊緣化用的),B為A中關於該變量的邊緣求和(B表格尺寸變小),所以結果B中不再出現變量V中的元素了。

  F = ObserveEvidence(F, E):

  F為一個factor的容器。E為一個2列的矩陣,每1行代表1對觀察值,其中第1個元素為變量名稱v,第2個元素為該變量對應的值,假設為x。作用是在F的每個factor中,只保留變量v等於x時對應assignment的值,而變量v等於其它值的assignment值都清0。但不改變每個factor表格的大小,只是有很多0值的行而已。

  Joint = ComputeJointDistribution(F):

  F為一個factor的容器,Joint為F中各個factor的乘積。

  M = ComputeMarginal(V, F, E):

  其中V為需要進行邊緣換的變量,F為一個factor的容器,E和上面的解釋一樣,為觀察值對。M為首先通過evidence來更改F中factor的值,然后利用函數數FactorMarginalization根據V來求邊緣化的factor,最后需要將這些factor的概率值歸一化。

  C=IndexToAssignment(I, D):

  該函數是將下標I按照向量D的形式轉換成一個帶下標的矩陣A,說白了就是把I中的每個值按照D中的進位轉換。比如I為:

  I =

  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24

  D為:[2 3 4]

  則C結果為:    

  1 1 1
  2 1 1
  1 2 1
  2 2 1
  1 3 1
  2 3 1
  1 1 2
  2 1 2
  1 2 2
  2 2 2
  1 3 2
  2 3 2
  1 1 3
  2 1 3
  1 2 3
  2 2 3
  1 3 3
  2 3 3
  1 1 4
  2 1 4
  1 2 4
  2 2 4
  1 3 4
  2 3 4

  I = AssignmentToIndex(A, D):

  和上面的那個函數是相反的,這里將A中的每個進位表示按照D中的進位還原成實數。如果A中有值重復,則得到I中對應位置也重復。

 

  總結:

  不得不佩服這些公開課,弄得實在太好了,連上交作業都用程序寫好了。向這些無私奉獻的科研團隊致敬!

  1. 在用submit進行提交作業時,需要輸入郵箱和密碼,密碼為課程主頁自動生成的。這樣就會在目錄下生成一個登陸作業服務器相關的文件:228_login_data.mat.

  2. 求2個factor的乘積時,至少要保證2個factor的scope有交集。

  3. 一個factor結構分為3個部分:.var(表示這個factor所含有的變量); .card(表示每個變量所對應的進位,因為前面的var中每個元素代表數中的每一位,而每一位又對應着不同的進位制); .val(表示這個factor可取的元素值,其實只是個標號,沒有具

體的數值意義,因此一般用於集合運算,不用於數值運算)。

  4. 當已知了一個factor容器中各個factor的值,則可以算出針對這個容器的聯合概率(沒歸一化前,直接將容器中所有factor相乘)。

 

  參考資料:

      http://reasoning.cs.ucla.edu/samiam/index.php

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM