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)系晨川,這個呢就是一個馬爾科夫概率圖败京。那么我們現(xiàn)在想分析什么呢?我們想得到A,B,C,D的聯(lián)合概率分布伏尼。有了聯(lián)合概率分布就有了一切脖旱。
根據(jù)馬爾科夫概率圖的定理堪遂,我們知道馬爾科夫聯(lián)合概率可以表示成最大團(tuán)上勢函數(shù)的乘積介蛉,然后再除以一個總數(shù)來把這個數(shù)值變成一個概率。我們觀察右邊圖溶褪,可以看出來最大團(tuán)有4個币旧,即:
這個時候呢,最麻煩的部分來了猿妈,就是這個勢函數(shù)吹菱,我們也把它叫做因子(factor),這個東西呢是我們根據(jù)實(shí)際情況自己定義的正函數(shù)彭则。在我們這個例子里毁葱,我們前面提到了A和B是朋友,投票可能會互相影響贰剥,于是我們定義這樣一個勢函數(shù):
注意啊,這個是我定義在AB之間的勢函數(shù)筷频,我們能看出來這個勢函數(shù)定義的還是有一定原則的蚌成,因?yàn)槲覀冋J(rèn)為朋友會有類似的投票,所以兩個人相同時得分高凛捏,兩個人不同時得分低担忧,同時我們還認(rèn)為兩個同時投比同時不投得分高。講道理其他的團(tuán)也得有自己的勢函數(shù)坯癣,這些勢函數(shù)可以不一樣瓶盛,比如說我們定義如下的三個勢函數(shù):
有了這個勢函數(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)在我們把他寫成程序惩猫,看看這張表怎么算出來
# 我們首先定義四個勢函數(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é)果都是概率,其次我們這個概率是符合我們的預(yù)期的悠反,就是是朋友的就大概率一起投残黑,小概率一起不投馍佑,非常非常小的概率一個投一個不投