This is a toy example Markov Random Field
In this example. we are modeling a voting preferences among persons A, B, C, D. Let's say that (A,B), (B,C), (C,D)
and (D,A) are friends and friedns tend to have similar voting preferences.
左邊這張圖表示了我剛剛描述出的關(guān)系,這個(gè)呢就是一個(gè)馬爾科夫概率圖。那么我們現(xiàn)在想分析什么呢?我們想得到A,B,C,D的聯(lián)合概率分布。有了聯(lián)合概率分布就有了一切。
根據(jù)馬爾科夫概率圖的定理,我們知道馬爾科夫聯(lián)合概率可以表示成最大團(tuán)上勢函數(shù)的乘積,然后再除以一個(gè)總數(shù)來把這個(gè)數(shù)值變成一個(gè)概率。我們觀察右邊圖,可以看出來最大團(tuán)有4個(gè),即:
這個(gè)時(shí)候呢,最麻煩的部分來了,就是這個(gè)勢函數(shù),我們也把它叫做因子(factor),這個(gè)東西呢是我們根據(jù)實(shí)際情況自己定義的正函數(shù)。在我們這個(gè)例子里,我們前面提到了A和B是朋友,投票可能會(huì)互相影響,于是我們定義這樣一個(gè)勢函數(shù):
注意啊,這個(gè)是我定義在AB之間的勢函數(shù),我們能看出來這個(gè)勢函數(shù)定義的還是有一定原則的,因?yàn)槲覀冋J(rèn)為朋友會(huì)有類似的投票,所以兩個(gè)人相同時(shí)得分高,兩個(gè)人不同時(shí)得分低,同時(shí)我們還認(rèn)為兩個(gè)同時(shí)投比同時(shí)不投得分高。講道理其他的團(tuán)也得有自己的勢函數(shù),這些勢函數(shù)可以不一樣,比如說我們定義如下的三個(gè)勢函數(shù):
有了這個(gè)勢函數(shù)我們就可以得到聯(lián)合概率分布啦,我們的目標(biāo)是為了得到一張聯(lián)合概率分布表
A | B | C | D | p |
---|---|---|---|---|
0 | 0 | 0 | 0 | |
0 | 0 | 0 | 1 | |
0 | 0 | 1 | 0 | |
0 | 0 | 1 | 1 | |
0 | 1 | 0 | 0 | |
0 | 1 | 0 | 1 | |
0 | 1 | 1 | 0 | |
0 | 1 | 1 | 1 | |
1 | 0 | 0 | 0 | |
1 | 0 | 0 | 1 | |
1 | 0 | 1 | 0 | |
1 | 0 | 1 | 1 | |
1 | 1 | 0 | 0 | |
1 | 1 | 0 | 1 | |
1 | 1 | 1 | 0 | |
1 | 1 | 1 | 1 |
好了,現(xiàn)在我們把他寫成程序,看看這張表怎么算出來
# 我們首先定義四個(gè)勢函數(shù)
def potential_ab(x,y):
if x==y==1:
return 10
if x==y==0:
return 5
else:
return 1
def potential_bc(x,y):
if x==y==1:
return 20
if x==y==0:
return 15
else:
return 10
def potential_cd(x,y):
if x==y==1:
return 20
if x==y==0:
return 3
else:
return 1
def potential_da(x,y):
if x==y==40:
return 10
if x==y==25:
return 5
else:
return 11
# 然后我們計(jì)算分母,分母其實(shí)就是表格中的所有組合都來一遍然后求和
all=[
[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],
[1,0,0,0],[1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,0],[1,1,0,1],[1,1,1,0],[1,1,1,1]
]
s=0
for a,b,c,d in all:
s+=potential_ab(a,b)*potential_bc(b,c)*potential_cd(c,d)*potential_da(d,a)
print("總和z=",s)
總和z= 73480
# 下面我們以第一行為例,求概率,a=0,b=0,c=0,d=0
a=0
b=0
c=0
d=0
p_hat=potential_ab(a,b)*potential_bc(b,c)*potential_cd(c,d)*potential_da(d,a)
p=p_hat/s
print("(A,B,C,D)=(0,0,0,0)的概率p=",p)
(A,B,C,D)=(0,0,0,0)的概率p= 0.033682634730538924
# 下面我們以第二行為例,求概率,a=0,b=0,c=0,d=1
a=0
b=0
c=0
d=1
p_hat=potential_ab(a,b)*potential_bc(b,c)*potential_cd(c,d)*potential_da(d,a)
p=p_hat/s
print("(A,B,C,D)=(0,0,0,1)的概率p=",p)
(A,B,C,D)=(0,0,0,1)的概率p= 0.01122754491017964
# 下面我們以第三行為例,求概率,a=0,b=0,c=1,d=0
a=0
b=0
c=1
d=0
p_hat=potential_ab(a,b)*potential_bc(b,c)*potential_cd(c,d)*potential_da(d,a)
p=p_hat/s
print("(A,B,C,D)=(0,0,1,0)的概率p=",p)
(A,B,C,D)=(0,0,1,0)的概率p= 0.0074850299401197605
# 下面我們以第三行為例,求概率,a=0,b=0,c=1,d=1
a=0
b=0
c=1
d=1
p_hat=potential_ab(a,b)*potential_bc(b,c)*potential_cd(c,d)*potential_da(d,a)
p=p_hat/s
print("(A,B,C,D)=(0,0,1,1)的概率p=",p)
(A,B,C,D)=(0,0,1,1)的概率p= 0.1497005988023952
好了好了,寫三行差不多了,我們來看看哈。首先我們得到的結(jié)果都是概率,其次我們這個(gè)概率是符合我們的預(yù)期的,就是是朋友的就大概率一起投,小概率一起不投,非常非常小的概率一個(gè)投一個(gè)不投