用一句話歸納貝葉斯方法創始人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
在本章中,咱們回顧一些重要的背景材料,這些材料源自機率論、信息論和圖論中的一些關鍵知識,它們都是貝葉斯網的重要概念組成部分。
條件機率(又稱後驗機率)就是事件A在另一個事件B已經發生條件下的發生機率。條件機率表示爲P(A|B),讀做「在B條件下A的機率」,
基於條件機率公式,咱們能夠繼續推導出貝葉斯公式。關於這個話題,筆者在另外一個文章中進行了詳細的總結,這裏再也不贅述,爲了保持文章自包含性,這裏摘取部分筆者認爲關鍵的部分。
全機率公式
貝葉斯公式
將其和全機率公式進行對比。會發現如下幾點:
筆者認爲,貝葉斯公式能夠這麼理解:貝葉斯公式表達了一個思想,根據某個出現的結果B能夠反推全部可能致使該結果的子緣由Ai,而具體根據結果B逆推出每一個子緣由的條件機率比重,則取決於這個子緣由和結果B的聯合機率 ,這是從結果推緣由的逆機率計算問題。
根據條件機率的定義,咱們有:
更通常地,若是a1,....,ak是事件,那麼有以下鏈式分解式,
這個等式稱爲條件機率的鏈式法則(chain rule)。 換句話說,咱們能夠將幾個事件組合的機率表示爲關於事件之間的遞歸式依賴關係的乘積。值得注意的是,咱們能夠用事件的任意順序來擴展這個表達式而保持結果不變。
鏈式法則是一個很是有用的定理,它是貝葉斯網中的核心概念,由於貝葉斯網面對和描述的都是復瑣事件。一個復瑣事件每每是由大量子事件組成的,不一樣的子事件間既存在獨立關係,也存在關聯依賴關係。鏈式法則提供了一個理解復瑣事件的世界觀,即復瑣事件是能夠分解的。
關於獨立性,有一個很形象直觀的例子。假設一個思想實驗:若是一個社會中存在一種普遍的思潮,即重男輕女思潮,90%的家庭都認爲生男孩比生女孩好,只要生的不是男孩就是繼續生,直到生了一個女孩爲止。 以上爲背景,通過10年後,請問社會中男女比率會失衡嗎?
這個問題答案可能有些反直覺,答案是:無論通過多少年,社會中男女比例都保持50%的平衡比例。出現這個現象的緣由是,每一胎生男生女都是等機率的,不以父母的意志爲轉移。
下面咱們定義隨機變量的獨立性概念,
假如或者,則稱事件α和事件β,則稱事件α和事件β在P中獨立,記爲。
咱們須要明白的是,在大多數實際的應用中,隨機變量並非邊緣獨立的,儘管如此,這種方法的通常形式將是咱們求解的基礎。
關於條件獨立性,筆者經過一個具體的例子來直觀說明。咱們假定學生的GPA成績爲隨機變量G,被Stanford錄入爲隨機變量S,被MIT錄取爲隨機變量M。很顯然,咱們會獲得下列幾個分佈判斷:
下面咱們形式化地定義事件之間條件獨立性的概念,
假如,或者,則稱事件α在給定事件Υ時,在分佈P中條件獨立於事件β,記做。
進一步地有,P知足當且僅當。
如今咱們將概念引伸到隨機變量的範疇內,關注隨機變量間的條件獨立性。
令X,Y,Z表示隨機變量,若是P知足,則稱集合X與Y在分佈P中條件獨立,集合Z中的變量稱爲觀測(observed)變量。觀測(observation)這個詞很能引發咱們的思考,咱們看到,在不一樣的觀測下,隨機變量的條件獨立性發生了改變,這正是體現了貝葉斯思想的精髓。
特別的,若是集合Z是空集,能夠把記做,而且稱X與Y是邊緣獨立的(marginally independent)。
咱們基於貝葉斯網進行的一個常見應用是,利用多維隨機變量的聯合機率分佈來完成推理查詢。
機率查詢是最多見的查詢,查詢由兩部分組成,
機率查詢的任務是計算下式:
即,Y的值y上的後驗機率分佈取決於E=e,這個表達式也能夠看做是以e爲條件做用得到的分佈中Y上的邊緣。
第二類重要任務是對變量的一些子集找到一個高几率的聯合賦值。這類任務的最簡單變形是MAP查詢(最可能解釋MPE),其目的是找到對全部(非證據)變量最可能的賦值。
若是令,那麼在給定證據的條件下,咱們的任務是爲W中的變量找到最可能的賦值:
其中的表示使得最大的值。
把圖做爲一種數據結構來表示機率分佈在貝葉斯網的一個重要概念,咱們這節討論一些圖的基本概念。
圖是一個包含節點(node)集與邊(edge)的數據結構。
假定節點集爲,節點對 Xi 與 Xj 由一條有向邊(directed edge)Xi -> Xj 或者一條無向邊(undirected edge)Xi - Xj 鏈接。所以,邊集是成對節點的集合,圖經過二元關係來存全部邊的鏈接關係。
所以,圖按照邊集的類型,能夠分爲:
咱們用來表示 Xi 與 Xj 經由某種邊鏈接的情形,這條邊或者是有向的,或者是無向的。
下圖是部分有向圖的一個例子,
其中,
不少時候,咱們但願只考慮與節點的特定子集相關的部分圖。
令,且令,導出子圖(induced subgraph)定義爲圖,其中,表示使得的全部邊。例以下圖表示的是導出子圖,
若是X中的任意兩個節點均由一條邊鏈接,那麼X上的子圖是徹底子圖(complete subgraph)。集合X一般稱爲團(clique)。對於節點的任意超集,若是Y不是團,那麼X稱爲最大團(maximal clique)。
儘管理論上說,節點子集X能夠是任意的,但咱們通常只對可以保持圖結構的特定性質的節點集感興趣。
利用邊的基本符號,能夠在圖中對不一樣類型的長範圍鏈接進行定義。
對每個 i=1,...,k-1,若是 Xi -> Xi+1,或者 Xi - Xi+1,那麼 X1,....,Xi 在圖中造成了一條路徑(path)。若是一條路徑中至少存在一個 i,使得 Xi -> Xi+1,則稱該路徑是有向的。
對於每一個 i=1,...,k-1,若是,那麼 X1,....,Xi 在圖中造成一條跡(trail)。
跡是比路徑更弱的約束條件,跡一定是路徑,但路徑不必定成爲跡。
例以下圖中,
對於圖中的任意節點 Xi,Xj,若是 Xi 和 Xj 之間存在一條跡,那麼該圖是連通圖。
圖中的一個圈是一條有向路徑 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 這兩條跡。
一個包含有向邊和無向邊的無圈圖稱爲部分有向無圈圖,PDAG上無圈的要求意味着圖能夠被分解爲一些鏈分支(chain component)的有向圖,其中,每條鏈分支內的節點相互之間僅經過無向邊連接。
PDAG的無圈性保證咱們能夠對分支進行排序,進而使得全部的邊由數值低的分支指向數值高的分支。
令是上的PDAG,K1,....,Ki 是的知足以下條件的不相交劃分:
知足以上條件時,每個分支 Ki 稱爲一個鏈分支。同時因爲其鏈結構,PDAG也稱爲鏈圖(chain graph)。
仍是對上面的圖例子,咱們來看一下鏈分支分解結果,
上圖中共有六個鏈分支:
特別的,當PDAG是一個無向圖時,整個圖造成了一個單鏈分支。相反地,若是PDAG是一個有向圖(無圈的),那麼圖中的每個節點就是其自己的一個鏈分支。
筆者提醒:
鏈圖這個概念很是重要,它和隨機變量獨立性原理一塊兒,構成了貝葉斯網因子分解和局部獨立性原理,也是貝葉斯網可以從原始的鏈式分解公式獲得緊湊結構的理論基礎。
環是一個比圈更弱約束的結構,中的一個環是一條跡 X1,....,Xk,其中 X1 = Xk。若是一個圖不包含任何環,那麼這個圖是單連通(singly connected)。若是一個節點在單連通圖中只有一個相鄰的節點,那麼該節點是一個葉(leaf)節點。
若是有向圖的每一個節點至多隻有一個父節點,那麼這個有向圖是森林。
若是有向圖的每一個節點至多隻有一個父節點,且這個有向森林是連通的,那麼它是一棵樹。
一個單連通的有向圖也稱爲一棵多重樹(polytree)。注意,多重樹與樹很是不一樣,例以下圖是多重樹但不是樹,由於有一些節點有不止一個父節點。
多重樹例子
弦的定義在基於圖結構的推理代價估計中扮演者很是重要的角色。
令 X1 - X2 - .... - Xk - X1 是圖中的一個環。環中的一條弦(chord)是鏈接兩個不連貫節點 Xi 與 Xj 的一條邊。對 k>=4,若是任意環 X1 - X2 - .... - Xk - X1 有一條弦,那麼無向圖稱爲弦圖(chordal graph)。
值得注意的是,在一個通弦的圖中,最長的」最小環(一個沒有捷徑的環)「是一個三角形。所以,弦圖一般也稱爲三角剖分圖(triangulated graph)。
進一步的,若是圖的基礎無向圖是通弦的,則稱圖是通弦的。
Relevant Link:
《機率圖模型:原理與技術》DaphneKoller
在開始介紹貝葉斯網概念以前,咱們先來一個討論一下學者們提出貝葉斯網的學術動機,筆者將其總結爲下面幾句話:
所謂不肯定性推理,是指基於機率論對真實世界進行抽象建模以及數值分析,使用機率分佈而不是精確數值的方式進行有效預測。常規的不肯定性推理過程以下,
根據全機率公式和鏈式法則咱們知道,每一個隨機事件均可以分解爲大量的子事件緣由的累乘,且子事件緣由之間還存在大量的遞歸依賴,
這樣,假設咱們的目標是在某個隨機變量的集合上表示聯合分佈P,即便在變量爲二值(binary-valued)這樣最簡單的狀況下,n個變量的聯合分佈也須要個不一樣賦值的機率。當n較大時,這種聯合分佈的顯示錶示和樣本學習都會變得很是難處理。
可是實際上,正如咱們前面介紹舉例的,對於一個好學生來講,考上Stanford和考上MIT這兩件事之間是獨立的,條件機率和邊緣機率是相同的。所以,貝葉斯網絡基於隨機變量間獨立性原理,對去全機率公式進行了有效的化簡,獲得了一個更緊湊的高維分佈。這對咱們建模複雜性事件提供了條件,例以下圖,
學生示例的貝葉斯網圖
能夠以兩種不一樣的方式來看待這個圖:
在嚴格意義上,這兩種觀點是等價的。
注意到,貝葉斯網用邊表示直接依賴關係,若是在真實世界中A只依賴於B,則只應該存在一條從B通向A的有向邊。節點只直接依賴其父節點,是貝葉斯網語義的核心。
爲了說明這個概念,咱們繼續引用學生示例,
這個問題包含五個隨機變量:
咱們知道,貝葉斯網能夠用有向圖來表示,其節點表示隨機變量,而邊則表示一個變量對另外一個變量的直接影響(現實世界運行方法的直觀假設)。咱們能夠將這個圖當作是對一個由天然執行的生成式採樣過程進行編碼,其中,每一個變量的值指取決於其父節點的分佈天然選擇。換句話說,每一個變量是其父節點的一個隨機函數(局部條件機率性質)。
換句話來講,局部條件機率性質來源於問題域自己的:
咱們將貝葉斯網中包含的這種局部的條件機率結構稱之爲局部機率模型(local probability model),用於表示每一個變量對其父節點依賴的本質。
對於這個問題,條件機率分佈的一個可能選擇以下圖所示,這個網絡結構與條件機率分佈一塊兒組成了貝葉斯網,
帶有條件機率分佈的學生示例的貝葉斯網
具體的,考慮空間中的一些特定狀態,好比,直觀上,這個事件的機率能夠經過計算構成它的基本事件的條件機率乘積得到,即:
通常地,對於聯合機率空間中的任何狀態,能夠採用相同的過程,即:
上述本質上是一個機率查詢(推理)過程。
所謂的「推理」,顧名思義是一個根據當前得到的證據動態變化條件機率的過程。如今考慮貝葉斯網,而且觀察當證據得到時各類事情的機率如何動態地發生變化。
以某個學生George爲例,用得到的模型對George進行推理。咱們可能想要詢問George有多大可能從教授Econ101的教授那裏得到一封好的推薦信(l1)。如今咱們開始動態貝葉斯推理:
如今咱們進一步得知Econ101是一門簡單的課程(d0),此時,George從教授那裏得到一封好的推薦信的機率是。
注意到上面兩步的動態推理,都是基於咱們不知道George的成績Grade前提下,即head-to-head的關鍵節點未知,若是Grade已知,智商和課程難度就會獨立,互不影響。
這類能夠預測各類因素(如George的智商)「順流而下」影響的機率查詢,咱們稱之爲因果推理(causal reasoning)或者預測(prediction)。
如今考慮Acme諮詢公司的一個招聘官,他試圖貝葉斯網決定是否僱傭George,咱們開始動態貝葉斯推理:
如今,假定招聘官不當心丟失了George的成績單,關於George的信息只剩下來自其Econ101課程教授的推薦信,不過這封信不是一個好的推薦信,此時,George有高智商的機率依然會下降,但只降至14%,即。咱們看到,節點距離越近,信息傳遞的影響就越大,這也符合馬爾科夫過程的熵傳遞原理。
同時咱們注意到,若是招聘官既有成績單又有推薦信,George有高智商的機率與招聘官只有成績單時的機率是同樣的,。緣由是在head-to-tail結構下,若是關鍵節點已知,則head與tail之間是條件獨立的。
這類從結果推理緣由的「逆流而上」的機率查詢,咱們稱之爲證據推理(evidential reasoning)或解釋(explanation)。
咱們知道,課程難度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。
另一方面,貝葉斯網必須是有向無圈圖。其中節點表明隨機變量,節點間的邊表明變量之間的直接依賴關係。
本質上由於貝葉斯網是對真實世界複雜性事件的抽象建模,因此不容許出現圈(即循環遞歸依賴)。簡單來講就是不容許出現下列這種場景,
若是出現循環依賴,因果分解鏈式公式就會無限膨脹,也就沒法用計算機處理。
貝葉斯網絡的有向無環圖中的節點表示隨機變量,它們能夠是可觀察到的變量,或隱變量、未知參數等。
有因果關係(或非條件獨立)的變量或命題,用箭頭來鏈接。若兩個節點間以一個單箭頭鏈接在一塊兒,表示其中一個節點是「因(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,因此有下面累乘公式,
3節點對應的三角結構是貝葉斯網信息流動的最基本結構,這節咱們來介紹幾種經典的信息流動結構。
根據上圖咱們有:P(a,b,c) = P(a) * P(b) * P(c|a,b)成立,化簡後可得:
這種結構表明的意思是:
咱們能夠形象地理解爲,將abc想象成河流,兩條小河(a、b)流入一條大河(c),當c是未知時,a->c<-b之間的流動是阻斷的,那麼影響將沒法沿着「a->c<-b」流動。形如「a->c<-b」的這種結構也稱爲一個v-結構(v-structure)。
這種結構表明的意思是:
咱們能夠形象地理解爲,一條大河到某處分叉成兩條支流,在c給定的條件下,a,b是兩條獨立的支流,彼此是獨立的。
這種結構表明的意思是:
這種結構表明的意思是:
咱們知道,貝葉斯網的形式化語義是一系列獨立性斷言,另外一方面,貝葉斯網也是由一系列條件機率分佈所組成的圖,這個圖經過鏈式法則爲貝葉斯網定義了一個聯合分佈。
在本節中,咱們將討論它們兩者的等價性。分佈P知足於圖相關的局部獨立性,當且僅當P能夠由與圖相關的一系列條件機率分佈表示。
咱們從形式化基本概念開始。
首先咱們定義與分佈P相關的獨立性的集合。
令P是上的分佈,定義爲在P中成立的形如的獨立性斷言的集合。
如今能夠將陳述「P知足與相關的局部獨立性」簡寫爲。在這種狀況下,能夠稱是P的一個I-map(獨立圖)。
更通常的定義以下:
令是與獨立性集合相關聯的任意一個圖對象,若是對獨立性集合,,則稱是一個I-map。
一個貝葉斯網蘊含了一系列條件獨立性假設,這是咱們可以用緊湊因子分解表示貝葉斯網的關鍵。一個特殊的例子就是樸素貝葉斯分解公式。
考慮學生貝葉斯網的例子,
先考慮任意分佈P,咱們將對聯合分佈進行分解而且將其分解成一些局部機率模型:
這種轉換不依賴任何假設,它對任何聯合分佈P都適用。然而,由於等式右邊的因子分解中的條件機率沒有充分利用咱們已知的獨立依賴性信息,所以很是不緊湊。
如今,咱們應用由貝葉斯網導出的條件獨立性假設,假定關於分佈P是一個I-map,咱們獲得下式:
綜上,聯合分佈可化簡爲:
從上式能夠看出,聯合分佈中的任何表值均可以經過每一個變量所對應的因子的乘積來計算。每一個因子表示表示一個變量在網絡中給定父節點時的條件機率。在是I-map的條件下,這種因子分解能夠應用於任何分佈P。
用形式化的語言來表達就是:
令未定義在變量X1,...,Xn上的一個貝葉斯網,假如P能夠表示爲以下乘積:
則稱分佈P是關於圖的在同一空間上的因子分解。這個等式稱爲貝葉斯網的鏈式法則。單個因子稱爲條件機率分佈(CPD)或局部機率模型。
貝葉斯網結構所蘊含的條件獨立性假設容許咱們將是一個I-map的分佈P分解成一系列較小的條件機率分佈。
上一節咱們討論了聯合分佈的因子分解和局部獨立性的統計概念。這個小節咱們將其推廣到整個貝葉斯網中,首先咱們定義有效跡的概念。
考慮跡比較長的通常狀況。直觀上,對於從X1流動到Xn的影響,它須要流經這條跡上的單個節點。換句話說,若是每條雙邊跡都容許影響流過,那麼X1能夠影響到Xn。
對這一直觀認識形式化定義以下:
令是一個貝葉斯網結構,且是中的一條跡。令Z是觀測變量的一個子集,在給定Z的條件下,若是知足下列條件:
那麼稱跡是有效跡。
通常的,若是節點之間存在任何容許影響流過的跡,那麼一個節點能夠影響另外一個節點。基於這個直觀認識,能夠定義d-分離的概念,這個概念爲咱們提供了在有向圖的節點之間實現分離的能力。
形式化定義以下:
令X,Y,Z是圖的三個節點集,在給定Z的的條件下,加入任意節點與之間不存在有效跡,那麼X與Y在給定Z時是d-分離的,記做。與d-分離相對應的獨立性的集合用表示:
這個集合也稱爲全局馬爾科夫獨立性(global Markov independencies)集。中的獨立性剛好是那些能夠保證在的每一個分佈中都成立的獨立性。
從上一章的條件機率鏈式公式化簡過程咱們能夠看到,對於同一個獨立性集合,與其相符的結構有不少。一個好的方法是選擇可以反映真實世界的因果序列和依賴關係的結構,目的是使緣由成爲結果的父節點。
例如,在對汽車保險相關的貝葉斯網構建中,之前的事故(A)每每是好司機(G)的父節點,即「A->G」,這與保險公司對汽車保險這一問題的認知一致。同時,因爲司機很差(B)才形成了之前(以及未來的)事故,即「B->A」。
通常來講,建模時咱們可能會選擇不少比較弱的影響,但若是將它們所有考慮進去,網絡會變得很是複雜。這樣的網絡從表示的角度看是有問題的,它們難於理解、難於修正和學習。此外,因爲貝葉斯網中的推理很是強地依賴於它們的鏈接功能,所以,增長這樣的邊無疑會使網絡訓練和預測的代價變得很高。
貝葉斯網的學習過程分爲兩部分:
從數據中學習貝葉斯網絡
所謂推理,就是要根據咱們已知的信息作出預測。咱們可使用推理來解答一些問題:
尋找一個特定變量的機率分佈。好比,給定一個帶有變量 A、B、C 和 D 的圖,其中 A 取值 一、2 和 3,求 p(A=1)、p(A=2) 和 p(A=3)。
給定某些顯變量 v_E(E 表示證據(evidence)),其取值爲 e,求某些隱藏變量 v_H 的後驗分佈 p(v_H|v_E=e)。
給定某些顯變量 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
關於馬爾柯夫鏈,筆者在另外一篇文章有詳細的討論。簡單來講,馬爾柯夫鏈是一種基於「馬爾科夫假設(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
這章咱們來描述一個最簡單的例子,在這裏例子中,條件參數化與條件獨立性假設被結合在一塊兒,目的是對高維機率分佈產生很是緊湊的表示。
仍是前面公司僱傭大學畢業生的例子,如今假定公司除了智商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)便可。這個性質對於模擬真實系統很是有價值。
上個小節討論的例子被稱之爲樸素貝葉斯模型。
樸素貝葉斯模型假設全部的實例屬於若干兩兩互斥且包含全部事例狀況的類(class)中的一個。所以,存在一個在某個集合{c1,...,ck}中取值的類變量C。在這個例子中,類變量是學生的智商I,而且存在且只存在事例的兩個類(高智商和低智商)的學生。
模型還包括必定數量的、能夠觀測到其值的特徵(feature)X1,....,Xk。樸素貝葉斯假設(naive Bayes assumption)是在給定事例的類的條件下,這些特徵條件獨立。換言之,在事例的每一個類內,不一樣的性質能夠獨立地肯定,形式化的表達爲。
從網絡結構上來講,樸素貝葉斯是一種典型的tail-to-tail的貝葉斯網結構,整個貝葉斯網都是由這種結構組成,
樸素貝葉斯模型的貝葉斯網
基於這些獨立性假設,樸素貝葉斯模型的因子分解(factorization)能夠表示以下,
儘管具備很強的假設,因爲簡單而且只須要少許參數,樸素貝葉斯模型常常在實踐中做爲「分類器」得以應用,例如基於樸素貝葉斯模型的垃圾郵件分類器。
這個模型最先被應用於醫療診斷,其中,類變量的不一樣值用於表示患者可能患的不一樣疾病。證據變量用於表示不一樣症狀、化驗結果等。在簡單的疾病診斷上,樸素貝葉斯模型確實發揮了很好的做用,甚至比人類專家的診斷結果都要好。可是在更深度的應用中,醫生髮現,對於更復雜(由多種致病緣由和症狀共同表現)的疾病,模型表現的並很差。
數據科學家通過分析認爲,出現這種現象的緣由在於:模型作了集中一般並不真實的強假設,例如:
一個患者至多可能患一種疾病
在已知患者的疾病條件下,不一樣症狀的出現與否,不一樣化驗結果,之間是互相獨立的
這種模型可用於醫學診斷是由於少許可解釋的參數易於由專家得到,早期的機器輔助醫療診斷系統正式創建在這一技術之上。
可是,以後更加深刻的實踐代表,構建這種模型的強假設下降了模型診斷的準確性,尤爲是「過分計算」某些特定的證據,該模型很容易太高估計某些方面特徵的影響。
例如,「高血壓」和「肥胖症」是心臟病的兩個硬指標,可是,這兩個症狀之間相關度很高,高血壓通常就伴隨着肥胖症。在使用樸素貝葉斯公式計算的時候,因爲乘法項的緣故,關於這方面的證據因子就會被重複計算,以下式:
P(心臟病 | 高血壓,肥胖症) = P(高血壓 | 心臟病) * P(高血壓 | 肥胖症) / P(高血壓,肥胖症)
因爲「高血壓」和「肥胖症」之間存在較強相關性的緣故,咱們能夠很容易想象,分子乘積增長的比率是大於分母聯合分佈增長的比率的。所以,當分子項繼續增長的時候,最終的後驗機率就會不斷增大。可是由於新增的特徵項並無提供新的信息,後驗機率的這種增大變化反而下降了模型的預測性能。
實際上,在實踐中人們發現,樸素貝葉斯模型的診斷性能會隨着特徵的增長而下降,這種下降經常歸因於違背了強條件獨立性假設。
Relevant Link:
https://www.cnblogs.com/LittleHann/p/7199242.html#_label6
本章來自雲棲社區一篇很棒的文章。
主持人會向挑戰者展現三扇關着的門,其中一扇門以後有一輛車,其它門後則有一些無價值的東西。挑戰者並不知道哪扇門背後是車。
如今挑戰者能夠先選擇一扇門。而後,主持人會打開剩下的兩扇門中沒有車的一扇。如今,挑戰者能夠選擇是否更換選擇的門,可是問題來了,咱們應該更換嗎?
直覺上看,主持人彷佛並無透露任何信息。事實證實這種直覺並不徹底正確。讓咱們使用咱們的新工具"貝葉斯網"來分析這個問題。
咱們首先先定義一些隨機變量:
咱們創建初始狀態貝葉斯網結構(即挑戰者作出的選擇,可是主持人還未打開一扇門):
注意到:
如今,主持人選擇了門 H 並打開了它。因此如今 H 已被觀察到。
如今貝葉斯網的條件機率狀況發生了變化:
也就是說,當支持人打開了剩下的兩扇門中沒有車的一扇後,挑戰者理性的作法是改變本身最初的決策。
下面用CPD表格來形式化地分析這個遊戲過程:
如今,讓咱們假設咱們已經選擇了一扇門。也就是說如今已經觀察到 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
假設咱們有如下圖像:
如今假設這張圖像受到了隨機噪聲的污染,變成了有噪聲的圖像:
如今咱們的目標是恢復原始圖像。讓咱們看看如何使用機率圖模型來實現。
咱們將有噪聲圖像中的每一個像素都定義爲一個觀察到的隨機變量,並將基準圖像中的每一個像素都定義爲一個未被觀察到的變量,由此,觀察到的變量和未被觀察到的變量都爲 MxN 個。
咱們將觀察到的變量表示爲 X_ij,未被觀察到的變量定義爲 Y_ij。每一個變量均可取值 +1 或 -1(分別對應於黑色像素和白色像素)。
給定觀察到的變量,咱們但願找到未觀察到的變量的最有可能的值。這對應於 MAP 推理。
如今讓咱們使用一些領域知識來構建圖結構:
由此,咱們獲得圖結構:
這個圖結構的先驗知識很是重要,這是咱們後面進行機率推理的一個重要條件。
咱們的 MAP 推理問題能夠用數學的方式寫出,以下:
如今,咱們須要根據咱們的圖結構來定義咱們的聯合分佈 P(X,Y)。讓咱們假設 P(X,Y) 由兩類因子組成,ϕ(X_ij, Y_ij) 和 ϕ(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