前言:
以前在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