馬爾科夫隨機(jī)場 Markov Random Field 一個(gè)簡單的例子

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.

mrf.png

左邊這張圖表示了我剛剛描述出的關(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è),即:
p(A,B,C,D)=\frac{\phi(A,B)\phi(B,C)\phi(C,D)\phi(D,A)}{Z}

這個(gè)時(shí)候呢,最麻煩的部分來了,就是這個(gè)勢函數(shù),我們也把它叫做因子(factor),這個(gè)東西呢是我們根據(jù)實(shí)際情況自己定義的正函數(shù)。在我們這個(gè)例子里,我們前面提到了A和B是朋友,投票可能會(huì)互相影響,于是我們定義這樣一個(gè)勢函數(shù):
\phi(A,B)=\begin{cases} \begin{aligned} &10 \quad &\text{if } A=B=1\\ &5 \quad &\text{if } A=B=0\\ &1 \quad &\text{otherwise}\\ \end{aligned} \end{cases}

注意啊,這個(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ù):
\phi(B,C)=\begin{cases} \begin{aligned} &20 \quad &\text{if } B=C=1\\ &15 \quad &\text{if } B=C=0\\ &10 \quad &\text{otherwise}\\ \end{aligned} \end{cases}

\phi(C,D)=\begin{cases} \begin{aligned} &20 \quad &\text{if } C=D=1\\ &3 \quad &\text{if } C=D=0\\ &1 \quad &\text{otherwise}\\ \end{aligned} \end{cases}

\phi(D,A)=\begin{cases} \begin{aligned} &40 \quad &\text{if } D=A=1\\ &25 \quad &\text{if } D=A=0\\ &11 \quad &\text{otherwise}\\ \end{aligned} \end{cases}

有了這個(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è)不投


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容