1. 貝葉斯網絡
貝葉斯網絡(Bayesian network),又稱信念網絡(Belief Network),或有向無環圖模型。它用網絡結構代表領域的基本因果知識。
貝葉斯網絡中的節點表示命題(或随機變量),認為有依賴關系(或非條件獨立)的命題用箭頭來連接配接。
令G = (I,E)表示一個有向無環圖(DAG),其中I代表圖形中所有的節點的集合,而E代表有向連接配接線段的集合,且令X = (Xi), i ∈ I為其有向無環圖中的某一節點i所代表的命題,則節點X的聯合機率可以表示成:
其中Pa(i)是i的父結點,是i的因。聯合機率可由各自的局部條件機率分布相乘得出:
p(x1,…,xk)=p(xk|x1,….,xk-1)…p(x2|x1)p(x1)
這裡順便說一下樸素貝葉斯,由于其中各個變量x互相獨立p(x2|x1)=p(x2),得出:
p(x1,…,xk)=p(xk)…p(x2)p(x1)
是以說樸素貝葉斯是貝葉斯網絡的一種特殊情況。
2. 例程
(1) 功能
eBay的Bayesian-belief-networks是一個貝葉斯網絡的python工具包,此例為使用該庫解決蒙提霍爾三門問題。
(2) 問題描述
蒙提霍爾是機率中的經典問題,出自美國的電視遊戲節目。問題的名字來自該節目的主持人蒙提•霍爾(Monty Hall)。參賽者會看見三扇關閉了的門,其中一扇的後面有一輛汽車,選中後面有車的那扇門可赢得該汽車,另外兩扇門後面則各藏有一隻山羊。當參賽者標明了一扇門,但未去開啟它的時候,節目主持人開啟剩下兩扇門的其中一扇,露出其中一隻山羊(主持人不會打開有車的那扇門)。主持人其後會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門會否增加參賽者赢得汽車的機率?答案是:不換門的話,赢得汽車的幾率是1/3。換門的話,赢得汽車的幾率是2/3。
這是為什麼呢?接着往下看。
(3) 下載下傳安裝
$ git clone https://github.com/eBay/bayesian-belief-networks
(4) 代碼
from bayesian.bbn import build_bbn
def f_prize_door(prize_door):
return 0.33333333
def f_guest_door(guest_door):
return 0.33333333
def f_monty_door(prize_door, guest_door, monty_door):
if prize_door == guest_door: # 參賽者猜對了
if prize_door == monty_door:
return 0 # Monty不會打開有車的那扇門,不可能發生
else:
return 0.5 # Monty會打開其它兩扇門,二選一
elif prize_door == monty_door:
return 0 # Monty不會打開有車的那扇門,不可能發生
elif guest_door == monty_door:
return 0 # 門已經由參賽者標明,不可能發生
else:
return 1 # Monty打開另一扇有羊的門
if __name__ == '__main__':
g = build_bbn(
f_prize_door,
f_guest_door,
f_monty_door,
domains=dict(
prize_door=['A', 'B', 'C'],
guest_door=['A', 'B', 'C'],
monty_door=['A', 'B', 'C']))
g.q()
g.q(guest_door='A')
g.q(guest_door='A', monty_door='B')
(5) 運作結果
(6) 分析
程式中建構的貝葉斯網絡如下圖所示。
先看看庫是如何使用的,首先通過三個判别函數(節點對應的是判别函數,并不對應三個門)以及它們之間的依賴關系定義了網絡g的結構,節點和連線關系是程式員根據業務邏輯定義的。而機器用來優化和計算在給定的條件下産生結果的機率。
prize_door和guest_door都是随機的,是以機率都是0.333;而主持人知道哪扇門後是獎,是以monty_door由另外兩個結點(父結點)決定的,當參賽者猜對時,Monty會打開另兩門之一,沒猜對時Monty隻能打開另一扇有羊的門。
從運作結果可以看到:先驗是随機抽取的0.333,随着限制條件依次加入,不确定性逐漸變小,最終,參賽者如果選擇換門(C)的赢率變為不換門(A)的兩倍。
技術文章定時推送
請關注公衆号:算法學習分享