機率圖模型(PGM):貝葉斯網(Bayesian network)初探

1. 從貝葉斯方法(思想)提及 - 我對世界的見解隨世界變化而隨時變化

用一句話歸納貝葉斯方法創始人Thomas Bayes的觀點就是:任什麼時候候,我對世界總有一個主觀的先驗判斷,可是這個判斷會隨着世界的真實變化而隨機修正,我對世界永遠保持開放的態度html

1763年,民間科學家Thomas Bayes發表了一篇名爲《An essay towards solving a problem in the doctrine of chances》的論文,node

這篇論文發表後,在當時並未產生多少影響,可是在20世紀後,這篇論文逐漸被人們所重視。人們逐漸發現,貝葉斯方法既符合人們平常生活的思考方式,也符合人們認識天然的規律,通過不斷的發展,最終佔據統計學領域的半壁江山,與經典統計學平起平坐。python

讓咱們暫時回到Thomas Bayes所處的學術時代18世紀,來一塊兒體會下貝葉斯的思想。git

當時數理統計的主流思想是「頻率學派」。所謂頻率學派,舉個例子來講:「有一個袋子,裏面裝着若干個白球和黑球(例如3黑2白),請問從袋子中取得白球的機率θ是多少?github

頻率派把須要推斷的參數θ看作是固定的未知常數,即機率雖然是未知的,但最起碼是肯定的一個值。同時,樣本X是隨機的,因此頻率派重點研究樣本空間,大部分的機率計算都是針對樣本X的分佈。算法

這種觀點看起來確實沒有什麼問題,也很合理。可是咱們仔細深度思考一下就會發現一個重大問題。網絡

頻率學派之因此可以獲得這種肯定性,是由於研究的對象是「簡單可數事件」,例如裝有固定數量球的袋子、只有正反兩面的硬幣、只有6面的標準篩子。可是當研究的問題變得複雜以後,頻率理論就沒法處理了。數據結構

例如一個朋友創業,你如今須要估計他創業成功的概率有多大?dom

這個時候你就沒法逐一枚舉出致使他成功或者失敗的因此子緣由了(作法有方法?思路清晰?有毅力?能團結周圍的人?和其餘競爭對手相比,好多少?....),這是一個連續且不可數的事件空間。機器學習

貝葉斯學派」的觀點和頻率學派則截然相反,貝葉斯學派認爲參數是隨機變量,是未知的。而樣本X是固定的,因爲樣本是固定的,因此他們重點研究的是參數的分佈。

用貝葉斯學派的理論來回答上面創業者評估問題,假如你對這個創業者爲人比較瞭解,你會情不自禁的估計他創業成功的概率可能在80%以上,這是一個先驗的機率估計。隨着公司的運營,你發現公司被運營的很是差,業績也不行,隨即,你對這個創業者的成功估計由80%下調到40%,這是一個後驗機率估計。貝葉斯學派的這種動態的機率估計思惟,就是貝葉斯方法。

爲了可以動態地對真實世界進行機率估計,貝葉斯及貝葉斯派提出了一個思考問題的固定模式:

先驗分佈 + 樣本信息(觀測結果)  後驗分佈

上述思考模式意味着,新觀察到的樣本信息將修正人們之前對事物的認知。換言之,在獲得新的樣本信息以前,人們對的認知是先驗分佈,在獲得新的樣本信息後,人們對的認知爲後驗估計。 

筆者思考

寫到這裏的時候,筆者聯想到牛頓宏觀第必定律和愛因斯坦的相對論之間的關係,在宏觀世界,牛頓第必定律是有效的,可是進入高速微觀世界,就只能用更抽象的相對論來歸納了。牛頓第必定律只是相對論在宏觀低速世界的一個特例。

一樣,對簡單問題來講,由於事件空間有限可數,因此頻率理論是成立的,可是對於真實世界的複雜問題,事件空間是連續不可數的,就須要用到貝葉斯理論來歸納描述了

Relevant Link:     

《機率圖模型:原理與技術》DaphneKoller 
https://github.com/memect/hao/blob/master/awesome/bayesian-network-python.md

 

2. 一些背景知識

在本章中,咱們回顧一些重要的背景材料,這些材料源自機率論、信息論和圖論中的一些關鍵知識,它們都是貝葉斯網的重要概念組成部分。

0x1:條件機率公式

條件機率(又稱後驗機率)就是事件A在另一個事件B已經發生條件下的發生機率。條件機率表示爲P(A|B),讀做「在B條件下A的機率」,

  • 聯合機率:表示兩個事件共同發生的機率。A與B的聯合機率表示爲或者
  • 邊緣機率(又稱先驗機率):是某個事件發生的機率。邊緣機率是這樣獲得的:在聯合機率中,把最終結果中那些不須要的事件經過合併成它們的全機率,而消去它們(對離散隨機變量用求和得全機率,對連續隨機變量用積分得全機率),這稱爲邊緣化(marginalization),好比A的邊緣機率表示爲P(A),B的邊緣機率表示爲P(B)。 

0x2:全機率公式和貝葉斯機率公式

基於條件機率公式,咱們能夠繼續推導出貝葉斯公式。關於這個話題,筆者在另外一個文章中進行了詳細的總結,這裏再也不贅述,爲了保持文章自包含性,這裏摘取部分筆者認爲關鍵的部分。

全機率公式

貝葉斯公式

將其和全機率公式進行對比。會發現如下幾點:

  • 貝葉斯公式的分子和全機率公式的分解子項是相同的
  • 貝葉斯公式的分母等於全機率公式的累加和

筆者認爲,貝葉斯公式能夠這麼理解:貝葉斯公式表達了一個思想,根據某個出現的結果B能夠反推全部可能致使該結果的子緣由Ai,而具體根據結果B逆推出每一個子緣由的條件機率比重,則取決於這個子緣由和結果B的聯合機率 ,這是從結果推緣由的逆機率計算問題

0x3:隨機變量的鏈式法則(chain rule)

根據條件機率的定義,咱們有:

更通常地,若是a1,....,ak是事件,那麼有以下鏈式分解式,

這個等式稱爲條件機率的鏈式法則(chain rule)。 換句話說,咱們能夠將幾個事件組合的機率表示爲關於事件之間的遞歸式依賴關係的乘積。值得注意的是,咱們能夠用事件的任意順序來擴展這個表達式而保持結果不變。

鏈式法則是一個很是有用的定理,它是貝葉斯網中的核心概念,由於貝葉斯網面對和描述的都是復瑣事件。一個復瑣事件每每是由大量子事件組成的,不一樣的子事件間既存在獨立關係,也存在關聯依賴關係。鏈式法則提供了一個理解復瑣事件的世界觀,即復瑣事件是能夠分解的。

0x4:隨機變量的獨立性

關於獨立性,有一個很形象直觀的例子。假設一個思想實驗:若是一個社會中存在一種普遍的思潮,即重男輕女思潮,90%的家庭都認爲生男孩比生女孩好,只要生的不是男孩就是繼續生,直到生了一個女孩爲止。 以上爲背景,通過10年後,請問社會中男女比率會失衡嗎?

這個問題答案可能有些反直覺,答案是:無論通過多少年,社會中男女比例都保持50%的平衡比例。出現這個現象的緣由是,每一胎生男生女都是等機率的,不以父母的意志爲轉移。

下面咱們定義隨機變量的獨立性概念,

假如或者,則稱事件α和事件β,則稱事件α和事件β在P中獨立,記爲

  • 條件熵的角度解釋獨立性,事件α和事件β在P中獨立,意味着事件事件β對事件α的不肯定性不提供額外的信息。
  • 從條件機率的角度,咱們還能夠給出獨立性概念的另外一種定義,即分佈P知足,當且僅當。證實過程以下,
    • 使用鏈式法則,,因爲α和β獨立,因此,所以,,因此有,

    • 從該公式能夠看到,獨立性是一個對稱的概念,即意味着。 

咱們須要明白的是,在大多數實際的應用中,隨機變量並非邊緣獨立的,儘管如此,這種方法的通常形式將是咱們求解的基礎。

0x5:隨機變量條件獨立性

關於條件獨立性,筆者經過一個具體的例子來直觀說明。咱們假定學生的GPA成績爲隨機變量G,被Stanford錄入爲隨機變量S,被MIT錄取爲隨機變量M。很顯然,咱們會獲得下列幾個分佈判斷:

  • 零先驗下條件依賴:」被MIT錄取M「和」被Stanford錄取S「之間並不相互獨立,若是已知一個學生已經被Stanford錄取,那麼咱們對她被MIT錄取的機率的估計就會提升,由於」被Stanford錄取S「潛在說明了她是一個智商高有前途的學生。換句話說,」被Stanford錄取S「這個事實給」被MIT錄取M「輸入了額外的有效信息熵。
  • 給定額外事件下條件獨立:如今假定兩所大學僅根據學生的GPA做決定,而且已知學生的GPA是A。在這種狀況下,」被Stanford錄取S「和」被Stanford錄取S「之間就徹底獨立了。換句話說,在已知GPA的狀況下,」被Stanford錄取S「對」被Stanford錄取S「的推斷沒有提供任何有效的信息熵,這個現象在貝葉斯網中被稱做局部獨立性。用條件機率公式表述上面這句話就是,對於這種狀況,咱們說在給定Grade條件下,MIT與Stanford條件獨立。

下面咱們形式化地定義事件之間條件獨立性的概念,

假如,或者,則稱事件α在給定事件Υ時,在分佈P中條件獨立於事件β,記做

進一步地有,P知足當且僅當

如今咱們將概念引伸到隨機變量的範疇內,關注隨機變量間的條件獨立性。

令X,Y,Z表示隨機變量,若是P知足,則稱集合X與Y在分佈P中條件獨立,集合Z中的變量稱爲觀測(observed)變量。觀測(observation)這個詞很能引發咱們的思考,咱們看到,在不一樣的觀測下,隨機變量的條件獨立性發生了改變,這正是體現了貝葉斯思想的精髓。

特別的,若是集合Z是空集,能夠把記做,而且稱X與Y是邊緣獨立的(marginally independent)

0x6:查詢一個機率分佈

咱們基於貝葉斯網進行的一個常見應用是,利用多維隨機變量的聯合機率分佈來完成推理查詢。

1. 機率查詢

機率查詢是最多見的查詢,查詢由兩部分組成,

  • 證據(條件):模型中隨機變量的子集E,以及這些變量的實例e
  • 查詢變量:網絡中隨機變量的子集Y

機率查詢的任務是計算下式:

即,Y的值y上的後驗機率分佈取決於E=e,這個表達式也能夠看做是以e爲條件做用得到的分佈中Y上的邊緣。

2. 最大後驗機率(MAP)查詢

第二類重要任務是對變量的一些子集找到一個高几率的聯合賦值。這類任務的最簡單變形是MAP查詢(最可能解釋MPE),其目的是找到對全部(非證據)變量最可能的賦值。

若是令,那麼在給定證據的條件下,咱們的任務是爲W中的變量找到最可能的賦值:

其中的表示使得最大的值。

0x7:圖

把圖做爲一種數據結構來表示機率分佈在貝葉斯網的一個重要概念,咱們這節討論一些圖的基本概念。

1. 節點與邊

圖是一個包含節點(node)集與邊(edge)的數據結構。 

假定節點集爲,節點對 X與 Xj 由一條有向邊(directed edge)Xi -> Xj 或者一條無向邊(undirected edge)Xi - Xj 鏈接。所以,邊集是成對節點的集合,圖經過二元關係來存全部邊的鏈接關係。

所以,圖按照邊集的類型,能夠分爲:

  • 有向圖(directed graph):一般記做
  • 無向圖(undirected graph):一般記做,經過忽略邊的方向,有向圖能夠轉換爲無向圖。

咱們用來表示 Xi 與 Xj 經由某種邊鏈接的情形,這條邊或者是有向的,或者是無向的。

下圖是部分有向圖的一個例子,

其中,

  • A是C的惟一父節點
  • F,I 是C的子節點
  • C的惟一鄰節點是D
  • A,D,F,I 均與C相鄰

2. 子圖

不少時候,咱們但願只考慮與節點的特定子集相關的部分圖。

1)導出子圖

,且令,導出子圖(induced subgraph)定義爲圖,其中,表示使得的全部邊。例以下圖表示的是導出子圖, 

 

2)徹底子圖

若是X中的任意兩個節點均由一條邊鏈接,那麼X上的子圖是徹底子圖(complete subgraph)。集合X一般稱爲團(clique)。對於節點的任意超集,若是Y不是團,那麼X稱爲最大團(maximal clique)。

儘管理論上說,節點子集X能夠是任意的,但咱們通常只對可以保持圖結構的特定性質的節點集感興趣。

3. 路徑與跡

利用邊的基本符號,能夠在圖中對不一樣類型的長範圍鏈接進行定義。

1)路徑(path)

對每個 i=1,...,k-1,若是 Xi -> Xi+1,或者 Xi - Xi+1,那麼 X1,....,Xi 在圖中造成了一條路徑(path)。若是一條路徑中至少存在一個 i,使得 Xi -> Xi+1,則稱該路徑是有向的。

2)跡(trail)

對於每一個 i=1,...,k-1,若是,那麼 X1,....,Xi 在圖中造成一條跡(trail)。 

跡是比路徑更弱的約束條件,跡一定是路徑,但路徑不必定成爲跡。

例以下圖中,

  • A,C,D,E,I 是一條路徑,所以也是一條跡
  • A,C,F,G,D 是一條跡,但不是一條路徑

3)連通圖(connected graph)

對於圖中的任意節點 Xi,Xj,若是 X和 X之間存在一條跡,那麼該圖是連通圖。

4.  圈(cycle)

1)無圈圖

中的一個圈是一條有向路徑 X1,....,Xk,其中 X1 = Xk。若是一個圖不包含圈,那麼這個圖是無圈圖(acyclic graph)。須要注意的是,在存在有向圈的圖上定義一個一致的機率模型十分困難,所以機器學習中大部分的圖算法都是假設圖是無圈的。

有向無圈圖(directed acyclic graph,DAG)是構成貝葉斯網的基本圖表示。

下圖是一個無圈圖,

可是隻要爲圖中添加一條無向邊 A-E,就能夠得到一條從A到自身的路徑A,C,D,E,A。

注意,圈是針對路徑的概念而言的,無圈並不表明從節點到自身不會有跡,例如上圖中,包含了 C,D,E,I,C 和 C,D,G,F,C 這兩條跡。

2)部分有向無圈圖(partially directed acyclic graph,PDAG)

一個包含有向邊和無向邊的無圈圖稱爲部分有向無圈圖,PDAG上無圈的要求意味着圖能夠被分解爲一些鏈分支(chain component)的有向圖,其中,每條鏈分支內的節點相互之間僅經過無向邊連接。

PDAG的無圈性保證咱們能夠對分支進行排序,進而使得全部的邊由數值低的分支指向數值高的分支。

3)鏈分支(chain component)

上的PDAG,K1,....,Ki的知足以下條件的不相交劃分:

  • Ki 的導出子圖不包含有向邊。
  • 對 i<j,以及任意一對節點,X與Y之間的邊僅僅是有向邊 X->Y。 

知足以上條件時,每個分支 Ki 稱爲一個鏈分支。同時因爲其鏈結構,PDAG也稱爲鏈圖(chain graph)

仍是對上面的圖例子,咱們來看一下鏈分支分解結果,

上圖中共有六個鏈分支:

  • {A}
  • {B}
  • {C,D,E}
  • {F,G}
  • {H}
  • {I}

特別的,當PDAG是一個無向圖時,整個圖造成了一個單鏈分支。相反地,若是PDAG是一個有向圖(無圈的),那麼圖中的每個節點就是其自己的一個鏈分支。

筆者提醒

鏈圖這個概念很是重要,它和隨機變量獨立性原理一塊兒,構成了貝葉斯網因子分解和局部獨立性原理,也是貝葉斯網可以從原始的鏈式分解公式獲得緊湊結構的理論基礎

5. 環(loop)

環是一個比圈更弱約束的結構,中的一個環是一條跡 X1,....,Xk,其中 X1 = Xk。若是一個圖不包含任何環,那麼這個圖是單連通(singly connected)。若是一個節點在單連通圖中只有一個相鄰的節點,那麼該節點是一個葉(leaf)節點。

1)森林

若是有向圖的每一個節點至多隻有一個父節點,那麼這個有向圖是森林。

2)樹

若是有向圖的每一個節點至多隻有一個父節點,且這個有向森林是連通的,那麼它是一棵樹。

3)多重樹

一個單連通的有向圖也稱爲一棵多重樹(polytree)。注意,多重樹與樹很是不一樣,例以下圖是多重樹但不是樹,由於有一些節點有不止一個父節點。

多重樹例子

6. 弦(chord)

弦的定義在基於圖結構的推理代價估計中扮演者很是重要的角色。

令 X1 - X2 - .... - Xk - X1 是圖中的一個環。環中的一條弦(chord)是鏈接兩個不連貫節點 Xi 與 Xj 的一條邊。對 k>=4,若是任意環 X1 - X2 - .... - Xk - X1 有一條弦,那麼無向圖稱爲弦圖(chordal graph)

值得注意的是,在一個通弦的圖中,最長的」最小環(一個沒有捷徑的環)「是一個三角形。所以,弦圖一般也稱爲三角剖分圖(triangulated graph)

進一步的,若是圖的基礎無向圖是通弦的,則稱是通弦的。

Relevant Link:    

《機率圖模型:原理與技術》DaphneKoller 

 

3. 貝葉斯網原理

0x1:什麼是貝葉斯網絡

  • 貝葉斯網絡(Bayesian network),又稱信念網絡(Belief Network),或有向無環圖模型(directed acyclic graphical model),是一種機率圖模型,於1985年由Judea Pearl首先提出。是一種幫助人們將機率統計應用於複雜領域、進行不肯定性推理數值分析的工具。
  • 貝葉斯網是一種系統地描述隨機變量之間關係的語言,它模擬了人類推理過程當中因果關係的不肯定性
  • 貝葉斯網是機率論圖論結合的產物,一方面用圖論的語言直觀揭示問題的結構,另外一方面按機率論的原則對問題結構加以利用,本質上其網絡拓樸結構是一個有向無環圖(DAG)
  • 許多經典多元機率模型都是貝葉斯網的特例,例如樸素貝葉斯模型、馬爾柯夫鏈、隱馬爾科夫模型、卡爾曼濾波器、條件隨機場等

0x2:爲何須要貝葉斯網絡

在開始介紹貝葉斯網概念以前,咱們先來一個討論一下學者們提出貝葉斯網的學術動機,筆者將其總結爲下面幾句話:

  • 不肯定性推理
  • 高維稀疏表徵問題:利用條件獨立下降複雜度
  • 局部機率模型(local probability model):貝葉斯網的因子分解
  • 有限狀態轉移的動態貝葉斯過程:因果推理與證據推理

1. 不肯定性推理

所謂不肯定性推理,是指基於機率論對真實世界進行抽象建模以及數值分析,使用機率分佈而不是精確數值的方式進行有效預測。常規的不肯定性推理過程以下,

  • 把問題用一組隨機變量 X = {X1, X2, . . . , Xn} 來刻畫
  • 把關於問題的知識表示爲一個聯合機率分佈 P(X)
  • 按機率論原則進行推理計算

2. 利用條件獨立下降複雜度

根據全機率公式和鏈式法則咱們知道,每一個隨機事件均可以分解爲大量的子事件緣由的累乘,且子事件緣由之間還存在大量的遞歸依賴,

這樣,假設咱們的目標是在某個隨機變量的集合上表示聯合分佈P,即便在變量爲二值(binary-valued)這樣最簡單的狀況下,n個變量的聯合分佈也須要個不一樣賦值的機率。當n較大時,這種聯合分佈的顯示錶示和樣本學習都會變得很是難處理。

  • 從計算的角度,操做的成本很是昂貴,而且也很難在內存中存儲
  • 從機器認知的角度,咱們不可能從專家那裏得到如此多的數值。並且,這些數值很是小而且不能與人們能夠合理思考的事件一一對應
  • 從統計的角度,若是但願從數據中學習出分佈,須要有規模很是龐大的數據才能可靠地估計出這麼多的自由參數,不然會遇到欠擬合問題

可是實際上,正如咱們前面介紹舉例的,對於一個好學生來講,考上Stanford和考上MIT這兩件事之間是獨立的,條件機率和邊緣機率是相同的。所以,貝葉斯網絡基於隨機變量間獨立性原理,對去全機率公式進行了有效的化簡,獲得了一個更緊湊的高維分佈。這對咱們建模複雜性事件提供了條件,例以下圖,

學生示例的貝葉斯網圖

能夠以兩種不一樣的方式來看待這個圖:

  • 它是提供了以因子分解的方式緊湊表示聯合分佈骨架的數據結構
  • 它是關於一個分佈的一系列條件獨立性假設的緊湊表示

在嚴格意義上,這兩種觀點是等價的。

注意到,貝葉斯網用邊表示直接依賴關係,若是在真實世界中A只依賴於B,則只應該存在一條從B通向A的有向邊。節點只直接依賴其父節點,是貝葉斯網語義的核心

3. 基於局部機率模型表示成對的因果推理

爲了說明這個概念,咱們繼續引用學生示例,

這個問題包含五個隨機變量:

  • 學生的智商(I)
  • 課程的難度(D)
  • 考試的成績(G)
  • 學生的SAT成績(S)
  • 推薦信的質量(L)

咱們知道,貝葉斯網能夠用有向圖來表示,其節點表示隨機變量,而邊則表示一個變量對另外一個變量的直接影響(現實世界運行方法的直觀假設)。咱們能夠將這個圖當作是對一個由天然執行的生成式採樣過程進行編碼,其中,每一個變量的值指取決於其父節點的分佈天然選擇。換句話說,每一個變量是其父節點的一個隨機函數(局部條件機率性質)。

換句話來講,局部條件機率性質來源於問題域自己的: 

  • 學生的成績不只取決於他的智商(I),同時也取決於課程的難度(D)
  • 學生請求教授爲其學推薦信,不過教授健忘而且歷來記不住學生的名字,因此教授經過查看學生的成績,並依據這僅有的信息來爲其寫推薦信,推薦信的好壞用L表示,隨機地依賴於考試的成績
  • SAT成績僅僅取決於學生的智商,在智商(I)已知的狀況下,SAT成績(S)和課程成績(G)是獨立的

咱們將貝葉斯網中包含的這種局部的條件機率結構稱之爲局部機率模型(local probability model),用於表示每一個變量對其父節點依賴的本質。 

對於這個問題,條件機率分佈的一個可能選擇以下圖所示,這個網絡結構與條件機率分佈一塊兒組成了貝葉斯網

帶有條件機率分佈的學生示例的貝葉斯網

具體的,考慮空間中的一些特定狀態,好比,直觀上,這個事件的機率能夠經過計算構成它的基本事件的條件機率乘積得到,即:

通常地,對於聯合機率空間中的任何狀態,能夠採用相同的過程,即:

上述本質上是一個機率查詢(推理)過程。 

4. 有限狀態轉移的動態貝葉斯過程

1)因果推理

所謂的「推理」,顧名思義是一個根據當前得到的證據動態變化條件機率的過程。如今考慮貝葉斯網,而且觀察當證據得到時各類事情的機率如何動態地發生變化。

以某個學生George爲例,用得到的模型對George進行推理。咱們可能想要詢問George有多大可能從教授Econ101的教授那裏得到一封好的推薦信(l1)。如今咱們開始動態貝葉斯推理:

  • 在對George和Econ101的其餘狀況一無所知的條件下,P(l1)=50.2%。更精確地,令爲根據前述貝葉斯網(BN)定義的聯合分佈,那麼
  • 如今咱們瞭解到George不太聰明(i0),如今George從教授Econ101課程的教授那裏得到一封好的推薦信的機率下降到大約38.9%,即
  • 如今咱們進一步得知Econ101是一門簡單的課程(d0),此時,George從教授那裏得到一封好的推薦信的機率是

  • 注意到上面兩步的動態推理,都是基於咱們不知道George的成績Grade前提下,即head-to-head的關鍵節點未知,若是Grade已知,智商和課程難度就會獨立,互不影響。

這類能夠預測各類因素(如George的智商)「順流而下」影響的機率查詢,咱們稱之爲因果推理(causal reasoning)或者預測(prediction)

2)證據推理

如今考慮Acme諮詢公司的一個招聘官,他試圖貝葉斯網決定是否僱傭George,咱們開始動態貝葉斯推理:

  • 先驗知識是,招聘官相信George有30%的可能有高智商。
  • 以後,他拿到了George在Econ101上的成績記錄爲C(g3),此時,招聘官對George有高智商的機率降至7.9%,即,同時,課程困難度的機率也從40%上升到62.9%,所以咱們有理由相信是由於課程太難致使George沒有取得高分。
  • 如今,假定招聘官不當心丟失了George的成績單,關於George的信息只剩下來自其Econ101課程教授的推薦信,不過這封信不是一個好的推薦信,此時,George有高智商的機率依然會下降,但只降至14%,即。咱們看到,節點距離越近,信息傳遞的影響就越大,這也符合馬爾科夫過程的熵傳遞原理。

  •  同時咱們注意到,若是招聘官既有成績單又有推薦信,George有高智商的機率與招聘官只有成績單時的機率是同樣的,。緣由是在head-to-tail結構下,若是關鍵節點已知,則head與tail之間是條件獨立的。

  • 最後,George向招聘官提交了他的SAT成績,他的SAT成績很高,George有高智商的機率戲劇性地從7.9%又上升到了57.8%,,即。產生這個現象的緣由是,與很差的考試成績相比,SAT高分更有價值,由於低智商的學生在SAT考試中得到高分的可能性很是低,遠遠低於Econ101課程考試,也能夠通俗地說「SAT考試成績更硬」。同時,由於高智商的學生在困難的課程中更可能得到C,全部如今Econ101是一門困難的課程的機率已經從62.9%提升了76%左右。 

這類從結果推理緣由的「逆流而上」的機率查詢,咱們稱之爲證據推理(evidential reasoning)解釋(explanation)。 

3)因果間推理通常模式

咱們知道,課程難度D,課程成績G,智商I,它們之間是head-to-head的拓樸結構。

若是George在Econ101中獲得的成績是B,那麼。另外一方面,若是Econ101比較難,那麼

實際上咱們已經經過課程的難度解釋消除(explaining away)了成績低這一事件帶來的影響。解釋消除是稱爲因果間推理(intercausal reasoning)的通常推理模式的一個示例。其中相同結果的不一樣緣由之間能夠相互影響。 在這裏,由於Grade已知,因此D和I之間的信息影響流是通的,影響力能夠沿着跡傳遞。

這類推理在人類平常的推理中是很是廣泛的,例如,當發燒、咽喉痛,而且擔憂可能有單核細胞增多症時,若是告知只是得了流感,那麼得單核細胞增多症的機率就會被消解降低。由於,患有流感爲出現的針狀提供了另外一種解釋,從而很大程度上下降了患有單核細胞增多症的機率。

筆者思考

對上述這個理論能夠有一個更加形象的理解方式,即河流類比,咱們將新的證據帶來的信息熵比做河流裏的水,學生在某門課程上取得了很差的成績就是一個有效信息熵,這個信息順着G-I之間流動,使得高智商的後驗機率降低。如今加入一個新的信息源是Econ101課程比較難,這個新的信息源就至關於一個新的水源,沿着D-G-I這個河道傳播,和原來的G-I一塊兒,共同綜合決定了I的後驗機率。

一樣的,若是G是未知的,那就至關於這個河流中間是斷開的,不管D如何都沒法影響到I,I的後驗機率只取決於G

4)有限狀態轉移

另一方面,貝葉斯網必須是有向無圈圖。其中節點表明隨機變量,節點間的邊表明變量之間的直接依賴關係。

本質上由於貝葉斯網是對真實世界複雜性事件的抽象建模,因此不容許出現圈(即循環遞歸依賴)。簡單來講就是不容許出現下列這種場景,

  • A事件的發生依賴於B
  • B事件的發生依賴於C
  • C事件的發生依賴於D
  • D事件的發生依賴於A

若是出現循環依賴,因果分解鏈式公式就會無限膨脹,也就沒法用計算機處理。

0x3:貝葉斯網絡的定義

貝葉斯網絡的有向無環圖中的節點表示隨機變量,它們能夠是可觀察到的變量,或隱變量、未知參數等。

有因果關係(或非條件獨立)的變量或命題,用箭頭來鏈接。若兩個節點間以一個單箭頭鏈接在一塊兒,表示其中一個節點是「因(parents)」,另外一個是「果(children)」,兩節點就會產生一個條件機率值。

例如,假設節點E直接影響到節點H,即E->H,則用從E指向H的箭頭創建結點E到結點H的有向弧(E,H),權值(即鏈接強度)用條件機率P(H|E)來表示,以下圖所示:

通常地,貝葉斯網結構是其節點表明隨機變量X1,....,Xn的一個有向無圈圖(DAG)。令表示Xi中的父節點,表示Xi在圖中的非後代節點變量。所以表示了以下稱爲局部獨立性(local independencies)的條件獨立性假設,而且記爲

對每一個變量Xi,都有:

換句話說,局部獨立性代表,在給定父節點條件下,每一個節點Xi與其非後代節點條件獨立。貝葉斯網圖的形式化語義是一系列獨立性斷言。 

以下圖所示,即是一個簡單的貝葉斯網絡:

由於a致使b,a和b致使c,因此有下面累乘公式,

 

0x4:貝葉斯網絡的典型結構形式

3節點對應的三角結構是貝葉斯網信息流動的最基本結構,這節咱們來介紹幾種經典的信息流動結構。

1. head-to-head(共同的做用)

根據上圖咱們有:P(a,b,c) = P(a) * P(b) * P(c|a,b)成立,化簡後可得:

這種結構表明的意思是:

  • c未知時:a、b被阻斷(blocked),是獨立的,稱之爲head-to-head條件獨立。
  • c已知時(或已知c的後代):a和b不獨立,a的信息能夠沿着c流向b

咱們能夠形象地理解爲,將abc想象成河流,兩條小河(a、b)流入一條大河(c),當c是未知時,a->c<-b之間的流動是阻斷的,那麼影響將沒法沿着「a->c<-b」流動。形如「a->c<-b」的這種結構也稱爲一個v-結構(v-structure)

2. tail-to-tail(共同的緣由)

這種結構表明的意思是:

  • c未知時:有:P(a,b,c)=P(c) * P(a|c) * P(b|c),此時,無法得出P(a,b) = P(a)P(b),即c未知時,a、b不獨立,a能夠經過c來影響b
  • c已知時:有:P(a,b|c)=P(a,b,c) / P(c),而後將P(a,b,c)=P(c) * P(a|c) * P(b|c)帶入式子中,獲得:P(a,b|c)=P(a,b,c)/P(c) = P(c)*P(a|c)*P(b|c) / P(c) = P(a|c)*P(b|c),即c已知時,a,b被阻斷(blocked),a、b是獨立的,稱之爲tail-to-tail條件獨立

咱們能夠形象地理解爲,一條大河到某處分叉成兩條支流,在c給定的條件下,a,b是兩條獨立的支流,彼此是獨立的。

3. head-to-tail(因果跡)

這種結構表明的意思是:

  • c未知時:有:P(a,b,c)=P(a)*P(c|a)*P(b|c),但沒法推出P(a,b) = P(a)P(b),即c未知時,a、b不獨立
  • c已知時:有:P(a,b|c)=P(a,b,c)/P(c),且根據P(a,c) = P(a)*P(c|a) = P(c)*P(a|c),可化簡獲得:P(a,b|c) = P(a,b,c)/P(c) = P(a)*P(c|a)*P(b|c)/P(c) = P(a,c) * P(b|c) / P(c) = P(a|c) * P(b|c),即在c給定的條件下,a,b被阻斷(blocked),是獨立的,稱之爲head-to-tail條件獨立。 

4. tail-to-head(證據跡)

這種結構表明的意思是: 

  • c未知時:影響能夠通過c從a流向b,a能夠做爲證據影響b的後驗機率
  • c已知時:在c給定的條件下,a,b被阻斷,是獨立的。

0x5:條件機率鏈式法則與局部獨立性的統一

咱們知道,貝葉斯網的形式化語義是一系列獨立性斷言,另外一方面,貝葉斯網也是由一系列條件機率分佈所組成的圖,這個圖經過鏈式法則爲貝葉斯網定義了一個聯合分佈。

在本節中,咱們將討論它們兩者的等價性。分佈P知足於圖相關的局部獨立性,當且僅當P能夠由與圖相關的一系列條件機率分佈表示。

咱們從形式化基本概念開始。

1. I-Map

首先咱們定義與分佈P相關的獨立性的集合。

令P是上的分佈,定義爲在P中成立的形如的獨立性斷言的集合。

如今能夠將陳述「P知足與相關的局部獨立性」簡寫爲。在這種狀況下,能夠稱P的一個I-map(獨立圖)

更通常的定義以下:

是與獨立性集合相關聯的任意一個圖對象,若是對獨立性集合,則稱是一個I-map。 

2. I-map到因子分解

一個貝葉斯網蘊含了一系列條件獨立性假設,這是咱們可以用緊湊因子分解表示貝葉斯網的關鍵。一個特殊的例子就是樸素貝葉斯分解公式。

考慮學生貝葉斯網的例子,

先考慮任意分佈P,咱們將對聯合分佈進行分解而且將其分解成一些局部機率模型:

 

這種轉換不依賴任何假設,它對任何聯合分佈P都適用。然而,由於等式右邊的因子分解中的條件機率沒有充分利用咱們已知的獨立依賴性信息,所以很是不緊湊。

如今,咱們應用由貝葉斯網導出的條件獨立性假設,假定關於分佈P是一個I-map,咱們獲得下式:

  • 由於,因此有

綜上,聯合分佈可化簡爲:

從上式能夠看出,聯合分佈中的任何表值均可以經過每一個變量所對應的因子的乘積來計算。每一個因子表示表示一個變量在網絡中給定父節點時的條件機率。在是I-map的條件下,這種因子分解能夠應用於任何分佈P。

用形式化的語言來表達就是:

未定義在變量X1,...,Xn上的一個貝葉斯網,假如P能夠表示爲以下乘積:

則稱分佈P是關於圖的在同一空間上的因子分解。這個等式稱爲貝葉斯網的鏈式法則。單個因子稱爲條件機率分佈(CPD)局部機率模型

貝葉斯網結構所蘊含的條件獨立性假設容許咱們將是一個I-map的分佈P分解成一系列較小的條件機率分佈。

0x6:d-分離概念

上一節咱們討論了聯合分佈的因子分解和局部獨立性的統計概念。這個小節咱們將其推廣到整個貝葉斯網中,首先咱們定義有效跡的概念。

1. 有效跡

考慮跡比較長的通常狀況。直觀上,對於從X1流動到Xn的影響,它須要流經這條跡上的單個節點。換句話說,若是每條雙邊跡都容許影響流過,那麼X1能夠影響到Xn

對這一直觀認識形式化定義以下:

是一個貝葉斯網結構,且中的一條跡。令Z是觀測變量的一個子集,在給定Z的條件下,若是知足下列條件:

  • 一旦有一個v-結構,則Xi或其一個後代在Z中
  • 跡上的其餘節點都不在Z中

那麼稱跡有效跡

2. d-分離(d-separation)

通常的,若是節點之間存在任何容許影響流過的跡,那麼一個節點能夠影響另外一個節點。基於這個直觀認識,能夠定義d-分離的概念,這個概念爲咱們提供了在有向圖的節點之間實現分離的能力。

形式化定義以下:

令X,Y,Z是圖的三個節點集,在給定Z的的條件下,加入任意節點之間不存在有效跡,那麼X與Y在給定Z時是d-分離的,記做。與d-分離相對應的獨立性的集合用表示:

這個集合也稱爲全局馬爾科夫獨立性(global Markov independencies)集中的獨立性剛好是那些能夠保證在的每一個分佈中都成立的獨立性。 

0x7:構建貝葉斯網結構的通常化方法

從上一章的條件機率鏈式公式化簡過程咱們能夠看到,對於同一個獨立性集合,與其相符的結構有不少。一個好的方法是選擇可以反映真實世界的因果序列依賴關係的結構,目的是使緣由成爲結果的父節點。

例如,在對汽車保險相關的貝葉斯網構建中,之前的事故(A)每每是好司機(G)的父節點,即「A->G」,這與保險公司對汽車保險這一問題的認知一致。同時,因爲司機很差(B)才形成了之前(以及未來的)事故,即「B->A」。

 

通常來講,建模時咱們可能會選擇不少比較弱的影響,但若是將它們所有考慮進去,網絡會變得很是複雜。這樣的網絡從表示的角度看是有問題的,它們難於理解、難於修正和學習。此外,因爲貝葉斯網中的推理很是強地依賴於它們的鏈接功能,所以,增長這樣的邊無疑會使網絡訓練和預測的代價變得很高。

0x8:貝葉斯網學習(結構構件和參數估計)

貝葉斯網的學習過程分爲兩部分:

  • 結構學習:發現變量之間的圖關係,構建貝葉斯網結構的一個通常方法是後向構建過程,該過程從咱們感興趣的一個變量開始,好比肺癌。而後嘗試找到這個變量的先驗因素,並將其添加爲這個變量的父節點,這個過程稱爲對話擴展。例如,咱們能夠用這個過程來得出以下結論:
    • 肺癌應該把吸菸做爲其父節點
    • 吸菸(可能,但不明顯)應該把性別和年齡做爲其父節點
  • 參數學習:決定變量之間互相關聯的量化關係,即估計貝葉斯網絡的 CPD(條件機率分佈) 表格中的數值。操做方法很簡單,就是計算訓練數據中事件發生的次數。例如要估計 p(SAT=s1|Intelligence=i1),咱們只須要計算 SAT=s1 且 Intelligence = i1 的數據點在 Intelligence = i1 的數據點總量中所佔的比例。

從數據中學習貝葉斯網絡 

0x9:貝葉斯網推理

所謂推理,就是要根據咱們已知的信息作出預測。咱們可使用推理來解答一些問題:

1. 邊際推理(marginal inference)

尋找一個特定變量的機率分佈。好比,給定一個帶有變量 A、B、C 和 D 的圖,其中 A 取值 一、2 和 3,求 p(A=1)、p(A=2) 和 p(A=3)。

2. 後驗推理(posterior inference)

給定某些顯變量 v_E(E 表示證據(evidence)),其取值爲 e,求某些隱藏變量 v_H 的後驗分佈 p(v_H|v_E=e)。

3. 最大後驗(MAP)推理(maximum-a-posteriori inference)

給定某些顯變量 v_E,其取值爲 e,求使其它變量 v_H 有最高几率的配置。

Relevant Link:    

《機率圖模型:原理與技術》DaphneKoller 
http://staff.ustc.edu.cn/~jianmin/lecture/ai/bnet_slides.pdf
https://zhuanlan.zhihu.com/p/30139208
https://www.zhihu.com/question/28006799
https://blog.csdn.net/v_JULY_v/article/details/40984699
http://staff.ustc.edu.cn/~jianmin/lecture/ai/bnet_slides.pdf

 

4. 貝葉斯網的一個特殊特例 - 馬爾柯夫鏈

關於馬爾柯夫鏈,筆者在另外一篇文章有詳細的討論。簡單來講,馬爾柯夫鏈是一種基於「馬爾科夫假設(marko assumption)」的動態貝葉斯網。

從網絡結構的角度來講,馬爾柯夫鏈是一個head-to-tail鏈式網絡,以下圖所示:

咱們已經知道,在xi給定的條件下,xi+1的分佈和x1,x2…xi-1條件獨立。這意味着:xi+1的分佈狀態只和xi有關,和其餘變量條件獨立。

通俗地說,當前狀態只跟上一狀態有關,跟上上或上上以前的狀態無關。這種順次演變的隨機過程,就叫作馬爾科夫鏈(Markov chain)。且有:

能夠看到,馬爾柯夫鏈是一個特殊的貝葉斯網結構。

Relevant Link:    

https://www.cnblogs.com/LittleHann/p/7609060.html#_lab2_2_1

 

5. 貝葉斯網的一個特殊特例 - 樸素貝葉斯模型

這章咱們來描述一個最簡單的例子,在這裏例子中,條件參數化與條件獨立性假設被結合在一塊兒,目的是對高維機率分佈產生很是緊湊的表示。

0x1:場景描述

仍是前面公司僱傭大學畢業生的例子,如今假定公司除了智商I和SAT成績S以外,同時還知道學生某些課程的成績G,在這種狀況下,機率空間是定義在三個相關隨機變量 I、S、G 上的聯合分佈。假定 I 與 S 如前所述,而且G可能取三個值g1,g2,g3,分別表明成績A,B和C,那麼聯合分佈有12個表值。

可是在這個例子中,咱們發現了潛在的冗餘結構,分佈P知足條件獨立性執行,即若是咱們知道一個學生是高智商的,那麼他在SAT考試中得到的高分並不能爲咱們帶來任何有關他課程成績的信息,形式化的表達爲:

更通常的狀況下,能夠表達爲:

 

注意到,這種獨立性聲明只有當假定學生的智商是其課程與SAT得分的惟一緣由時才成立(tail-to-tail結構)。

基於條件獨立性假設,咱們能夠獲得一種更加緊湊的因果推理表達方式,

  

這樣,聯合分佈P(I,S,G)能夠分解爲三個條件機率分佈(CPD)的乘積。

做爲一個總體,這3個條件機率分佈詳細說明了聯合分佈在條件獨立性假設下的因果表示,例如:

咱們注意到,除了更緊湊的表達方式以外,基於條件獨立性的因果表達方法的另外一個好處是,模塊性。當增長一個新的變量G時,聯合分佈在總體上會發生變化。而在因子表示中,咱們能夠重複使用變量I和S的局部機率模型,而且只需增長對新變量的條件機率P(G|I)便可。這個性質對於模擬真實系統很是有價值。

0x2:樸素貝葉斯模型(naive Bayes) 

上個小節討論的例子被稱之爲樸素貝葉斯模型。

樸素貝葉斯模型假設全部的實例屬於若干兩兩互斥且包含全部事例狀況的類(class)中的一個。所以,存在一個在某個集合{c1,...,ck}中取值的類變量C。在這個例子中,類變量是學生的智商I,而且存在且只存在事例的兩個類(高智商和低智商)的學生。

模型還包括必定數量的、能夠觀測到其值的特徵(feature)X1,....,Xk。樸素貝葉斯假設(naive Bayes assumption)是在給定事例的類的條件下,這些特徵條件獨立。換言之,在事例的每一個類內,不一樣的性質能夠獨立地肯定,形式化的表達爲

從網絡結構上來講,樸素貝葉斯是一種典型的tail-to-tail的貝葉斯網結構,整個貝葉斯網都是由這種結構組成,

樸素貝葉斯模型的貝葉斯網

基於這些獨立性假設,樸素貝葉斯模型的因子分解(factorization)能夠表示以下,

0x3:樸素貝葉斯模型應用之困

儘管具備很強的假設,因爲簡單而且只須要少許參數,樸素貝葉斯模型常常在實踐中做爲「分類器」得以應用,例如基於樸素貝葉斯模型的垃圾郵件分類器

這個模型最先被應用於醫療診斷,其中,類變量的不一樣值用於表示患者可能患的不一樣疾病。證據變量用於表示不一樣症狀、化驗結果等。在簡單的疾病診斷上,樸素貝葉斯模型確實發揮了很好的做用,甚至比人類專家的診斷結果都要好。可是在更深度的應用中,醫生髮現,對於更復雜(由多種致病緣由和症狀共同表現)的疾病,模型表現的並很差。

數據科學家通過分析認爲,出現這種現象的緣由在於:模型作了集中一般並不真實的強假設,例如:

一個患者至多可能患一種疾病

在已知患者的疾病條件下,不一樣症狀的出現與否,不一樣化驗結果,之間是互相獨立的

這種模型可用於醫學診斷是由於少許可解釋的參數易於由專家得到,早期的機器輔助醫療診斷系統正式創建在這一技術之上。

可是,以後更加深刻的實踐代表,構建這種模型的強假設下降了模型診斷的準確性,尤爲是「過分計算」某些特定的證據,該模型很容易太高估計某些方面特徵的影響

例如,「高血壓」和「肥胖症」是心臟病的兩個硬指標,可是,這兩個症狀之間相關度很高,高血壓通常就伴隨着肥胖症。在使用樸素貝葉斯公式計算的時候,因爲乘法項的緣故,關於這方面的證據因子就會被重複計算,以下式:

P(心臟病 | 高血壓,肥胖症) = P(高血壓 | 心臟病) * P(高血壓 | 肥胖症) / P(高血壓,肥胖症)

因爲「高血壓」和「肥胖症」之間存在較強相關性的緣故,咱們能夠很容易想象,分子乘積增長的比率是大於分母聯合分佈增長的比率的。所以,當分子項繼續增長的時候,最終的後驗機率就會不斷增大。可是由於新增的特徵項並無提供新的信息,後驗機率的這種增大變化反而下降了模型的預測性能。

實際上,在實踐中人們發現,樸素貝葉斯模型的診斷性能會隨着特徵的增長而下降,這種下降經常歸因於違背了強條件獨立性假設

Relevant Link:     

https://www.cnblogs.com/LittleHann/p/7199242.html#_label6

 

6. 基於貝葉斯網解決三門問題(蒙提霍爾問題)

本章來自雲棲社區一篇很棒的文章。

主持人會向挑戰者展現三扇關着的門,其中一扇門以後有一輛車,其它門後則有一些無價值的東西。挑戰者並不知道哪扇門背後是車。

如今挑戰者能夠先選擇一扇門。而後,主持人會打開剩下的兩扇門中沒有車的一扇。如今,挑戰者能夠選擇是否更換選擇的門,可是問題來了,咱們應該更換嗎?

直覺上看,主持人彷佛並無透露任何信息。事實證實這種直覺並不徹底正確。讓咱們使用咱們的新工具"貝葉斯網"來分析這個問題。

咱們首先先定義一些隨機變量:

  • D:背後有車的門:可取值爲 一、2 或 3;D是未被觀察到的隨機變量。
  • F:你的第一個選擇:可取值爲 一、2 或 3;D是已被觀察到的隨機變量。
  • H:主持人打開的門:可取值爲 一、2 或 3;主持人打開其中一扇門以前,H 都是未被觀察到的。
  • I:F 是不是 D?:可取值爲 0、1;I是未被觀察到的隨機變量。

咱們創建初始狀態貝葉斯網結構(即挑戰者作出的選擇,可是主持人還未打開一扇門):

注意到:

  • D 和 F 是相互獨立的,由於此時I和H都是未知的(參考文章前面談到的head-to-head獨立結構)
  • I 依賴於 D 和 F
  • 主持人選擇的門 H 也取決於 D 和 F
  • 目前咱們對 D 還一無所知,由於F是和D是獨立的,所以知道F並不能對D有任何信息影響(這與學生網絡的結構相似,即知道學生的智力水平不能讓你得到有關課程難度的任何信息。) 

如今,主持人選擇了門 H 並打開了它。因此如今 H 已被觀察到。 

如今貝葉斯網的條件機率狀況發生了變化:

  • I<-D->H是一種tail-to-tail結構,D是未知的,因此 H 的信息影響力能夠經過D傳遞到 I,所以已知 H 提供了對 I 的一些信息

也就是說,當支持人打開了剩下的兩扇門中沒有車的一扇後,挑戰者理性的作法是改變本身最初的決策。

下面用CPD表格來形式化地分析這個遊戲過程:

  • D 和 F 都是先驗機率,背後有車的門多是這些門中的任何一扇且機率相等,咱們選擇其中一扇的機率是同樣的。
  • I 依賴於 D 和 F 的先驗:
    • 當 D,F 同樣時,I=1
    • 當 D,F 不同時,I=0
  • H 依賴於 D 和 F 的先驗:
    • D,F 同樣時,那麼主持人從另外兩扇門選擇一扇門的機率同樣
    • 若是 D 和 F 不同,那麼主持人就選擇第三扇門

如今,讓咱們假設咱們已經選擇了一扇門。也就是說如今已經觀察到 F,假設 F=1。那麼給定 F 時,I 和 D 的條件機率是多少?

基於上面CPD表格計算邊緣機率得:

到目前爲止,咱們選對了門的機率都是三分之一,汽車仍然有可能在任何一扇門以後且機率相等。

如今,主持人打開了 F 以外的另外一扇門,因此咱們觀察到了 H。假設 H=2。讓咱們再計算給定了 F 和 H 時 I 和 D 的條件機率。

機率計算結果以下:

能夠看到,咱們第一個選擇正確的機率仍然是三分之一,咱們的直覺也是如此。可是,如今車在第 3 扇門後的機率再也不是三分之一,而是三分之二了。

因此若是咱們更換選擇,那麼咱們獲得車的機率是三分之二;若是咱們不換,咱們獲得車的機率是三分之一。 

示例代碼以下:

import math
from pomegranate import *

# We'll create the discrete distribution for our friend first.
friend = DiscreteDistribution( { True: 0.5, False: 0.5 } )

# The emissions for our guest are completely random.
guest = ConditionalProbabilityTable(
    [
        [True, 'A', 0.50],
        [True, 'B', 0.25],
        [True, 'C', 0.25],
        [False, 'A', 0.0],
        [False, 'B', 0.7],
        [False, 'C', 0.3]
    ],
    [friend]
)

# Then the distribution for the remaining cars.
remaining = DiscreteDistribution({0: 0.1, 1: 0.7, 2: 0.2, })

# The probability of whether the prize is randomized is dependent on the number of remaining cars.
randomize = ConditionalProbabilityTable(
    [
        [0, True, 0.05],
        [0, False, 0.95],
        [1, True, 0.8],
        [1, False, 0.2],
        [2, True, 0.5],
        [2, False, 0.5]
    ],
    [remaining]
)

# Now the conditional probability table for the prize. This is dependent on the guest's friend and whether or not it is randomized.
prize = ConditionalProbabilityTable(
    [
        [True, True, 'A', 0.3],
        [True, True, 'B', 0.4],
        [True, True, 'C', 0.3],
        [True, False, 'A', 0.2],
        [True, False, 'B', 0.4],
        [True, False, 'C', 0.4],
        [False, True, 'A', 0.1],
        [False, True, 'B', 0.9],
        [False, True, 'C', 0.0],
        [False, False, 'A', 0.0],
        [False, False, 'B', 0.4],
        [False, False, 'C', 0.6]
    ],
    [randomize, friend]
)

# Finally we can create the conditional probability table for our Monty. This is dependent on the guest and the prize.
monty = ConditionalProbabilityTable(
    [
        ['A', 'A', 'A', 0.0],
        ['A', 'A', 'B', 0.5],
        ['A', 'A', 'C', 0.5],
        ['A', 'B', 'A', 0.0],
        ['A', 'B', 'B', 0.0],
        ['A', 'B', 'C', 1.0],
        ['A', 'C', 'A', 0.0],
        ['A', 'C', 'B', 1.0],
        ['A', 'C', 'C', 0.0],
        ['B', 'A', 'A', 0.0],
        ['B', 'A', 'B', 0.0],
        ['B', 'A', 'C', 1.0],
        ['B', 'B', 'A', 0.5],
        ['B', 'B', 'B', 0.0],
        ['B', 'B', 'C', 0.5],
        ['B', 'C', 'A', 1.0],
        ['B', 'C', 'B', 0.0],
        ['B', 'C', 'C', 0.0],
        ['C', 'A', 'A', 0.0],
        ['C', 'A', 'B', 1.0],
        ['C', 'A', 'C', 0.0],
        ['C', 'B', 'A', 1.0],
        ['C', 'B', 'B', 0.0],
        ['C', 'B', 'C', 0.0],
        ['C', 'C', 'A', 0.5],
        ['C', 'C', 'B', 0.5],
        ['C', 'C', 'C', 0.0]
    ],
    [guest, prize]
)

# Now we can create the states for our bayesian network.
s0 = State(friend, name="friend")
s1 = State(guest, name="guest")
s2 = State(prize, name="prize")
s3 = State(monty, name="monty")
s4 = State(remaining, name="remaining")
s5 = State(randomize, name="randomize")

# Now we'll create our bayesian network with an instance of BayesianNetwork, then add the possible states.
network = BayesianNetwork("test")
network.add_states(s0, s1, s2, s3, s4, s5)

# Then the possible transitions.
network.add_transition(s0, s1)
network.add_transition(s1, s3)
network.add_transition(s2, s3)
network.add_transition(s4, s5)
network.add_transition(s5, s2)
network.add_transition(s0, s2)

# With a "bake" to finalize the structure of our network.
network.bake()

# Now let's create our network from the following data.
data = [
    [True,  'A', 'A', 'C', 1, True],
    [True,  'A', 'A', 'C', 0, True],
    [False, 'A', 'A', 'B', 1, False],
    [False, 'A', 'A', 'A', 2, False],
    [False, 'A', 'A', 'C', 1, False],
    [False, 'B', 'B', 'B', 2, False],
    [False, 'B', 'B', 'C', 0, False],
    [True,  'C', 'C', 'A', 2, True],
    [True,  'C', 'C', 'C', 1, False],
    [True,  'C', 'C', 'C', 0, False],
    [True,  'C', 'C', 'C', 2, True],
    [True,  'C', 'B', 'A', 1, False]
]

network.fit(data)

# We can see the results below. Lets look at the distribution for our Friend first.
print friend

# Then our Guest.
print guest

# Now the remaining cars.
print remaining

# And the probability the prize is randomized.
print randomize

# Now the distribution of the Prize.
print prize

# And finally our Monty.
print monty

這裏介紹一個pomegranate庫,它抽象了機率圖模型的底層細節,咱們能夠方便地基於API進行上層應用建模。

# -*- coding: utf-8 -*-

from pomegranate import *


if __name__ == '__main__':
    guest = DiscreteDistribution({'A': 1./3, 'B': 1./3, 'C': 1./3})
    prize = DiscreteDistribution({'A': 1./3, 'B': 1./3, 'C': 1./3})
    monty = ConditionalProbabilityTable(
            [['A', 'A', 'A', 0.0],
             ['A', 'A', 'B', 0.5],
             ['A', 'A', 'C', 0.5],
             ['A', 'B', 'A', 0.0],
             ['A', 'B', 'B', 0.0],
             ['A', 'B', 'C', 1.0],
             ['A', 'C', 'A', 0.0],
             ['A', 'C', 'B', 1.0],
             ['A', 'C', 'C', 0.0],
             ['B', 'A', 'A', 0.0],
             ['B', 'A', 'B', 0.0],
             ['B', 'A', 'C', 1.0],
             ['B', 'B', 'A', 0.5],
             ['B', 'B', 'B', 0.0],
             ['B', 'B', 'C', 0.5],
             ['B', 'C', 'A', 1.0],
             ['B', 'C', 'B', 0.0],
             ['B', 'C', 'C', 0.0],
             ['C', 'A', 'A', 0.0],
             ['C', 'A', 'B', 1.0],
             ['C', 'A', 'C', 0.0],
             ['C', 'B', 'A', 1.0],
             ['C', 'B', 'B', 0.0],
             ['C', 'B', 'C', 0.0],
             ['C', 'C', 'A', 0.5],
             ['C', 'C', 'B', 0.5],
             ['C', 'C', 'C', 0.0]], [guest, prize])

    s1 = Node(guest, name="guest")
    s2 = Node(prize, name="prize")
    s3 = Node(monty, name="monty")

    model = BayesianNetwork("Monty Hall Problem")
    model.add_states(s1, s2, s3)
    model.add_edge(s1, s3)
    model.add_edge(s2, s3)
    model.bake()

    print model.probability([['A', 'A', 'A'],
                             ['A', 'A', 'B'],
                             ['C', 'C', 'B']])

    print model.predict([['A', 'B', None],
                         ['A', 'C', None],
                         ['C', 'B', None]])

    print model.predict([['A', 'B', None],
                         ['A', None, 'C'],
                         [None, 'B', 'A']])

 

Relevant Link:  

https://yq.aliyun.com/articles/280788

  

7. 基於貝葉斯網進行圖像降噪

假設咱們有如下圖像:

 

如今假設這張圖像受到了隨機噪聲的污染,變成了有噪聲的圖像:

如今咱們的目標是恢復原始圖像。讓咱們看看如何使用機率圖模型來實現。

0x1:問題分析

咱們將有噪聲圖像中的每一個像素都定義爲一個觀察到的隨機變量,並將基準圖像中的每一個像素都定義爲一個未被觀察到的變量,由此,觀察到的變量和未被觀察到的變量都爲 MxN 個。

咱們將觀察到的變量表示爲 X_ij未被觀察到的變量定義爲 Y_ij。每一個變量均可取值 +1 或 -1(分別對應於黑色像素和白色像素)。

給定觀察到的變量,咱們但願找到未觀察到的變量的最有可能的值。這對應於 MAP 推理。

0x2:圖結構構建

如今讓咱們使用一些領域知識來構建圖結構:

  • 在有噪聲圖像中的 (i,j) 位置觀察到的變量取決於在基準圖像中的 (i,j) 位置未觀察到的變量。緣由是大多數時候它們是相等的,即 X_ij 和 Y_ij 的初始先驗是相等的。
  • 對於基準圖像,
    • 在每一個單一顏色的區域內,鄰近的像素一般有同樣的值,所以,若是 Y_ij 和 Y_kl 是鄰近像素,那麼咱們將它們鏈接起來。
    • 在顏色變化的邊界沒有這個性質。

由此,咱們獲得圖結構:

  • 白色節點表示未被觀察到的變量 Y_ij
  • 灰色節點表示觀察到的變量 X_ij
  • 每一個 X_ij 都鏈接到對應的 Y_ij
  • 每一個 Y_ij 都鏈接到它的相鄰節點

這個圖結構的先驗知識很是重要,這是咱們後面進行機率推理的一個重要條件。

0x3:圖推理過程

咱們的 MAP 推理問題能夠用數學的方式寫出,以下: 

如今,咱們須要根據咱們的圖結構來定義咱們的聯合分佈 P(X,Y)。讓咱們假設 P(X,Y) 由兩類因子組成,ϕ(X_ij, Y_ij) 和 ϕ(Y_ij,Y_kl),對應於圖中的兩類邊。

接下來,咱們按以下方式定義這些因子:

  • ϕ(X_ij, Y_ij) = exp(w_e X_ij Y_ij),其中 w_e 是一個大於 0 的參數。當 X_ij 和 Y_ij 相等時,這個因子取較大的值,當 X_ij 和 Y_ij 不一樣時就取較小的值。
  • ϕ(Y_ij, Y_kl) = exp(w_s Y_ij Y_kl),其中 w_s 也是一個大於 0 的參數。當 Y_ij 和 Y_kl 取值相等時,這個因子較大。

所以,咱們的聯合分佈可由下式給出:

將其插入到咱們的 MAP 推理式中,可得:

有了這些參數後,咱們須要求解上述 MAP 推理問題。咱們可使用迭代條件模式(ICM/iterated conditional mode)。其基本思想是:在每一個步驟選擇一個節點 Y_ij,而後檢查 Y_ij=-1 和 Y_ij=1 時 MAP 推理表達式的值,而後選擇值更高的那個。重複這個過程必定的迭代次數或直到收斂,一般就能獲得至關好的結果。

下面代碼中展現了這個過程,須要特別體會的是,這是一個動態的機率調整過程,每次像素的猜想的同時都至關於向網絡中輸入了新的信息,網絡中的條件機率也所以發生了改變。

# -*- coding: utf-8 -*-

import numpy as np
from PIL import Image
import sys


# look up the value of Y for the given indices
# if the indices are out of bounds, return 0
def compute_log_prob_helper(Y, i, j):
    try:
        return Y[i][j]
    except IndexError:
        return 0


def compute_log_prob(X, Y, i, j, w_e, w_s, y_val):
    result = w_e * X[i][j] * y_val

    # 在每一個單一顏色的區域內,鄰近的像素一般有同樣的值,所以,若是 Y_ij 和 Y_kl 是鄰近像素,那麼咱們將它們鏈接起來
    result += w_s * y_val * compute_log_prob_helper(Y, i-1, j)
    result += w_s * y_val * compute_log_prob_helper(Y, i+1, j)
    result += w_s * y_val * compute_log_prob_helper(Y, i, j-1)
    result += w_s * y_val * compute_log_prob_helper(Y, i, j+1)
    return result


def denoise_image(X, w_e, w_s):
    m, n = np.shape(X)
    # initialize Y same as X
    # 在有噪聲圖像中的 (i,j) 位置觀察到的變量取決於在基準圖像中的 (i,j) 位置未觀察到的變量。緣由是大多數時候它們是相等的,即 X_ij 和 Y_ij 的初始先驗是相等的
    Y = np.copy(X)
    # optimization
    max_iter = 10 * m * n
    for iter in range(max_iter):
        # randomly pick a location
        i = np.random.randint(m)
        j = np.random.randint(n)
        # compute the log probabilities of both values of Y_ij
        log_p_neg = compute_log_prob(X, Y, i, j, w_e, w_s, -1)
        log_p_pos = compute_log_prob(X, Y, i, j, w_e, w_s, 1)
        # assign Y_ij to the value with higher log probability
        if log_p_neg > log_p_pos:
            Y[i][j] = -1
        else:
            Y[i][j] = 1
        if iter % 100000 == 0:
          print ('Completed', iter, 'iterations out of', max_iter)
    return Y


# preprocessing step
def read_image_and_binarize(image_file):
    im = Image.open(image_file).convert("L")
    A = np.asarray(im).astype(int)
    A.flags.writeable = True

    A[A<128] = -1
    A[A>=128] = 1
    return A


def add_noise(orig):
    A = np.copy(orig)
    for i in range(np.size(A, 0)):
        for j in range(np.size(A, 1)):
            r = np.random.rand()
            if r < 0.1:
                A[i][j] = -A[i][j]
    return A


def convert_from_matrix_and_save(M, filename, display=False):
    M[M==-1] = 0
    M[M==1] = 255
    im = Image.fromarray(np.uint8(M))
    if display:
        im.show()
    im.save(filename)


def get_mismatched_percentage(orig_image, denoised_image):
    diff = abs(orig_image - denoised_image) / 2
    return (100.0 * np.sum(diff)) / np.size(orig_image)


def main():
    # read input and arguments
    orig_image = read_image_and_binarize("input.png")

    w_e = 8
    w_s = 10

    # add noise
    noisy_image = add_noise(orig_image)

    # use ICM for denoising
    denoised_image = denoise_image(noisy_image, w_e, w_s)

    # print the percentage of mismatched pixels
    print ('Percentage of mismatched pixels: ', get_mismatched_percentage(orig_image, denoised_image))

    convert_from_matrix_and_save(orig_image, 'orig_image.png', display=False)
    convert_from_matrix_and_save(noisy_image, 'noisy_image.png', display=False)
    convert_from_matrix_and_save(denoised_image, 'denoised_image.png', display=False)


if __name__ == '__main__':
    main()

 

降噪後的圖像

能夠看到,算法得到了70%的降噪效果。

Relevant Link:   

https://www.coursera.org/learn/probabilistic-graphical-models?authMode=signup
https://www.cnblogs.com/tornadomeet/p/3480694.html 
https://yq.aliyun.com/articles/280788  
https://github.com/prasoongoyal/image-denoising-mrf/blob/master/denoise.py 
相關文章
相關標籤/搜索