概率图
第1章 概率推理
在有關21世紀的所有預測中,最不希望的一個也許是我們需要每天收集世界上任何地方、關于任何事情的海量數據。近幾年來,人們見證了關于世界、生活和技術方面難以置信的數據爆炸,這也是我們確信引發變革的源動力。雖然我們生活在信息時代,但是僅僅收集數據而不發掘價值和抽取知識是沒有任何意義的。
在20世紀開始的時候,隨著統計學的誕生,世界都在收集數據和生成統計。那個時候,唯一可靠的工具是鉛筆和紙張,當然還有觀察者的眼睛和耳朵。雖然在19世紀取得了長足的發展,但是科學觀察依然處在新生階段。
100多年后,我們有了計算機、電子感應器以及大規模數據存儲。我們不但可以持續地保存物理世界的數據,還可以通過社交網絡、因特網和移動電話保存我們的生活數據。而且,存儲技術水準的極大提高也使得以很小的容量存儲月度數據成為可能,甚至可以將其放進手掌中。
但是存儲數據不是獲取知識。存儲數據只是把數據放在某個地方以便后用。同樣,隨著存儲容量的快速演化,現代計算機的容量甚至在以難以置信的速度提升。在讀博士期間,我記得當我收到一個嶄新、耀眼的全功能PC來開展科研工作時,我在試驗室是多么的驕傲。而今天,我口袋里老舊的智能手機,還要比當時的PC快20倍。
在本書中,你會學到把數據轉化為知識的最先進的技術之一:機器學習。這項技術用在當今生活的方方面面,從搜索引擎到股市預測,從語音識別到自動駕駛。而且,機器學習還用在了人們深信不疑的領域,從產品鏈的質量保障到移動手機網絡的天線陣列優化。
機器學習是計算機科學、概率論和統計學相互融合的領域。機器學習的核心問題是推斷問題或者說是如何使用數據和例子生成知識或預測。這也給我們帶來了機器學習的兩個基礎問題:從大量數據中抽取模以及高層級知識的算法設計,和使用這些知識的算法設計——或者說得更科學一些:學習和推斷。
皮埃爾-西蒙·拉普拉斯(Pierre-Simon Laplace,1749—1827),法國數學家,也是有史以來最偉大的科學家之一,被認為是第一批理解數據收集重要性的人:他發現了數據不可靠,有不確定性,也就是今天說的有噪聲。他也是第一個研究使用概率來處理不確定性等問題,并表示事件或信息信念度的人。
在他的論文《概率的哲學》(Essai philosophique sur les probabilités,1814)中,拉普拉斯給出了最初的支持新老數據推理的數學系統,其中的用戶信念會在新數據可用的時候得到更新和改進。今天我們稱之為貝葉斯推理。事實上,托馬斯·貝葉斯確實是第一個、早在18世紀末就發現這個定理的人。如果沒有貝葉斯工作的鋪墊,皮埃爾-西蒙·拉普拉斯就需要重新發現同一個定理,并形成貝葉斯理論的現代形式。有意思的是,拉普拉斯最終發現了貝葉斯過世之后發表的文章,并承認了貝葉斯是第一個描述歸納推理系統原理的人。今天,我們會提及拉普拉斯推理,而不是貝葉斯推理,并稱之為貝葉斯-普萊斯-拉普拉斯定理(Bayes-Price-Laplace Theorem)。
一個多世紀以后,這項數學技術多虧了計算概率論的新發現而得到重生,并誕生了機器學習中一個最重要、最常用的技術:概率圖模型。
從此刻開始,我們需要記住,概率圖模型中的術語圖指的是圖論,也就是帶有邊和點的數學對象,而不是圖片或者圖畫。眾所周知,當你想給別人解釋不同對象或者實體之間的關系時,你需要拿紙畫出帶有連線或箭頭的方框。這是一種簡明易懂的方法,可以來介紹任何不同元素之間的關系。
確切地說,概率圖模型(Probabilistic Graphical Models,PGM)是指:你想描述不同變量之間的關系,但是,你又對這些變量不太確定,只有一定程度的相信或者一些不確定的知識。現在我們知道,概率是表示和處理不確定性的嚴密的數學方法。
概率圖模型是使用概率來表示關于事實和事件的信念和不確定知識的一種工具。它也是現在最先進的機器學習技術之一,并有很多行業成功的案例。
概率圖模型可以處理關于世界的不完整的知識,因為我們的知識總是有限的。我們不可能觀察到所有的事情,不可能用一臺計算機表示整個宇宙。和計算機相比,我們作為人類從根本上是受限的。有了概率圖模型,我們可以構建簡單的學習算法,或者復雜的專家系統。有了新的數據,我們可以改進這些模型,盡全力優化模型,也可以對未知的局勢和事件做出推斷或預測。
在第1章中,你會學到關于概率圖模型的基礎知識,也就是概率知識和簡單的計算規則。我們會提供一個概率圖模型的能力概覽,以及相關的R程序包。這些程序包都很成功,我們只需要探討最重要的R程序包。
我們會看到如何一步一步地開發簡單模型,就像方塊游戲一樣,以及如何把這行模型連接在一起開發出更加復雜的專家系統。我們會介紹下列概念和應用。每一部分都包含幾個可以直接用R語言上手的示例:
- 機器學習。
- 使用概率表示不確定性。
- 概率專家系統的思想。
- 使用圖來表示知識。
- 概率圖模型。
- 示例和應用。
1.1 機器學習
本書是關于機器學習領域的書籍,或者更廣義地叫作人工智能。為了完成任務,或者從數據中得出結論,計算機以及其他生物需要觀察和處理自然世界的各種信息。從長期來看,我們一直在設計和發明各種算法和系統,來非常精準地并以非凡的速度解決問題。但是所有的算法都受限于所面向的具體任務本身。另外,一般生物和人類(以及許多其他動物)展現了在通過經驗、錯誤和對世界的觀察等方式取得適應和進化方面令人不可思議的能力。
試圖理解如何從經驗中學習,并適應變化的環境一直是科學界的偉大課題。自從計算機發明之后,一個主要的目標是在機器上重復生成這些技能。
機器學習是關于從數據和觀察中學習和適應的算法研究,并實現推理和借助學到的模型和算法來執行任務。由于我們生活的世界本身就是不確定的,從這個意義上講,即便是最簡單的觀察,例如天空的顏色也不可能絕對的確定。我們需要一套理論來解決這些不確定性。最自然的方法是概率論,它也是本書的數學基礎。
但是當數據量逐漸增長為非常大的數據集時,即便是最簡單的概率問題也會變得棘手。我們需要一套框架支持面向現實世界問題復雜度的模型和算法的便捷開發。
說到現實世界的問題,我們可以設想一些人類可以完成的任務,例如理解人類語言、開車、股票交易、識別畫中的人臉或者完成醫療診斷等。
在人工智能的早期,構建這樣的模型和算法是一項非常復雜的任務。每次產生的新算法,其實現和規劃總是帶著內在的錯誤和偏差。本書給出的框架,叫作概率圖模型,旨在區分模型設計任務和算法實現任務。因為,這項技術基于概率論和圖論,因此它擁有堅實的數學基礎。但是同時,這種框架也不需要實踐者一直編寫或者重寫算法,因為算法是針對非常原生的問題而設計的,并且已經存在了。
同時,概率圖模型基于機器學習技術,它有利于實踐人員從數據中以最簡單的方式創造新的模型。
概率圖模型中的算法可以從數據中學到新的模型,并使用這些數據和模型回答相關問題,當然也可以在有新數據的時候改進模型。
在本書中,我們也會看到概率圖模型是我們熟知的許多標準和經典模型的數學泛化,并允許我們復用、混合和修改這些模型。
本章的其他部分會介紹概率論和圖論所需的概念,幫助讀者理解和使用R語言概率圖模型。
1.2 使用概率表示不確定性
概率圖模型,從數學的角度看,是一種表示幾個變量概率分布的方法,也叫作聯合概率分布。換句話說,它是一種表示幾個變量共同出現的數值信念的工具。基于這種理解,雖然概率圖模型看起來很簡單,但是概率圖模型強調的是對于許多變量概率分布的表示。在某些情況下,“許多”意味著大量,比如幾千個到幾百萬個。在這一部分里,我們會回顧概率圖模型的基本概念和R語言的基本實現。如果你對這些內容很熟悉,你可以跳過這一部分。我們首先研究為什么概率是表示人們對于事實和事件信念的優良工具,然后我們會介紹概率積分的基本概念。接著,我們會介紹貝葉斯模型的基礎構建模塊,并做一些簡單而有意思的計算。最后,我們會討論本書的主要話題:貝葉斯推斷。
我之前說過貝葉斯推斷是本書的主要話題嗎?的確,概率圖模型也是執行貝葉斯推斷,或者換句話說,是從先前信念和新數據中計算新的事實和結論的前沿技術。
更新概率模型的原理首先是由托馬斯·貝葉斯發現的,并由他的朋友普萊斯于1763年發表在著名的論文《論機會主義下的問題解決》( An Es An Essay toward solving a Problem in the Doctrine of Chances)中。
1.2.1 信念和不確定性的概率表示
{--:}Probability theory is nothing but common sense reduced to calculation
{--:}Théorie analytique des probabilités, 1821.
{--:} Pierre-Simon, marquis de Laplace
正如皮埃爾-西蒙·拉普拉斯所說,概率是一種量化常識推理和信念程度的工具。有意思的是,在機器學習的背景下,信念這一概念已經被不知不覺地擴展到機器上,也就是計算機上。借助算法,計算機會對確定的事實和事件,通過概率表示自己的信念。
讓我們舉一個眾人熟知的例子:擲硬幣游戲。硬幣正面或者反面向上的概率或機會是多少?大家都應該回答是50%的機會或者0.5的概率(記住,概率是0和1之間的數)。
這個簡單的記法有兩種理解。一種是頻率派解釋,另一種是貝葉斯派解釋。第一種頻率派的意思是如果我們投擲多次,長期來看一半次數正面向上,另一半次數反面向上。使用數字的話,硬幣有50%的機會一面朝上,或者概率為0.5。然而,頻率派的思想,正如它的名字,只在試驗可以重復非常多的次數時才有效。如果只觀察到一兩次事實,討論頻率就沒有意義了。相反,貝葉斯派的理解把因素或事件的不確定性通過指認數值(0~1或者0%~100%)來量化。如果你投擲一枚硬幣,即使在投擲之前,你也肯定會給每個面指認50%的機會。如果你觀看10匹馬的賽馬,而且對馬匹和騎手一無所知,你也肯定會給每匹馬指認0.1(或者10%)的概率。
投擲硬幣是一類可以重復多次,甚至上千次或任意次的試驗。然而,賽馬并不是可以重復多次的試驗。你最喜歡的團隊贏得下次球賽的概率是多少?這也不是可以重復多次的試驗:事實上,你只可以試驗一次,因為只有一次比賽。但是由于你非常相信你的團隊是今年最厲害的,你會指認一個概率,例如0.9,來確信你的團隊會拿下下一次比賽。
貝葉斯派思想的主要優勢是它不需要長期頻率或者同一個試驗的重復。
在機器學習中,概率是大部分系統和算法的基礎部件。你可能想知道收到的郵件是垃圾郵件的概率。你可能想知道在線網站下一個客戶購買上一個客戶同一個商品的概率(以及你的網站是否應該立刻給它打廣告的概率)。你也想知道下個月你的商鋪擁有和這個月同樣多客戶的概率。
從這些例子可以看出,完全頻率派和完全貝葉斯派之間的界限遠遠不夠清晰。好消息是不論你選擇哪一種理解,概率計算的規則是完全相同的。
1.2.2 條件概率
機器學習尤其是概率圖模型的核心是條件概率的思想。事實上,準確地說,概率圖模型都是條件概率的思想。讓我們回到賽馬的例子。我們說,如果你對騎手和馬匹一無所知,你可以給每一匹馬(假定有10匹馬)指認0.1的概率。現在,你知道這個國家最好的騎手也參加了這項賽事。你還會給這些騎手指認相同的機會嗎?當然不能!因此這個騎手獲勝的概率可能是19%,進而所有其他騎手獲勝的概率只有9%。這就是條件概率:也就是基于已知其他事件的結果,當前事件的概率。這種概率的思想可以完美地解釋改變直覺認識或者(更技術性的描述)給定新的信息來更新信念。概率圖模型就是關注這些技術,只是放在了更加復雜的場景中。
1.2.3 概率計算和隨機變量
在之前的部分,我們看到了為什么概率是表示不確定性或者信念,以及事件或事實頻率的優良工具。我們也提到了不管是貝葉斯派還是頻率派,他們使用的概率計算規則是相同的。在本部分中,我們首先回顧概率計算規則,并介紹隨機變量的概念。它是貝葉斯推理和概率圖模型的核心概念。
樣本空間,事件和概率
在這一部分中,我們會介紹本書概率論中使用的基本概念和語言。如果讀者已經知道了這些概念,可以跳過這一部分。
一個樣本空間Ω是一個試驗所有可能輸出的集合。在這個集合中,我們稱Ω中的一個點ω,為一個實現。我們稱Ω的一個子集為一個事件。
例如,如果我們投擲一枚硬幣一次,我們可以得到正面(H)或者反面(T)。我們說樣本空間是Ω={H,T}。一個事件可以是我得到了正面(H)。如果我們投擲一枚硬幣兩次,樣本空間變得更大,我們可以記錄所有的可能Ω={HH,HT,TH,TT}。一個事件可以是我們首先得到了正面。因此我的事件是E={HH,HT}。
更復雜的例子可以是某人身高的米數度量[1]
。樣本空間是所有從0.0到10.9的正數。你的朋友很有可能都沒有10.9米高,但是這并不會破壞我們的理論。
一個事件可以是所有的籃球運動員,也就是高于2米的人。其數學記法寫作,相對區間Ω=[0,10.9],E=[2,10.9]。
一個概率是指派給每一個事件E的一個實數P(E)。概率必須滿足下列3個公理。在給出它們之前,我們需要回顧為什么需要使用這些公理。如果你還記得我們之前說的,不論我們對概率做何理解(頻率派或貝葉斯派),控制概率計算的規則是一樣的:
對于任意事件E,P(E)≥0:我們說概率永遠為正。
P(Ω)=1,意味著包含所有可能事件的概率為1。因此,從公理1和2看到,任何概率都在0和1之間。
如果有獨立事件E1,E2,...,那么。
隨機變量和概率計算
在計算機程序中,變量是與計算機內存中一部分存儲空間相關聯的名稱或者標記。因此一個程序變量可以通過它的位置(和許多語言中的類型)來定義,并保存有且僅有一個取值。這個取值可以很復雜,例如數組或者數據結構。最重要的是,這個取值是已知的,并且除非有人特意改變,它保持不變。換句話說,取值只能在算法確定要改變它的時候才會發生變化。
而隨機變量有點不同:它是從樣本空間到實數的函數映射。例如,在一些試驗中,隨機變量被隱式地使用:
當投擲兩顆骰子的時候,兩個點數之和X是一個隨機變量。
當投擲一枚硬幣N次時,正面向上的次數X是一個隨機變量。
對于每一個可能的事件,我們可以關聯一個概率Pi。所有這些概率的集合是隨機變量的概率分布。
讓我們看一個例子:考慮投擲一枚硬幣3次的試驗。(樣本空間中的)樣本點是3次投擲的結果。例如,HHT,兩次正面向上和一次背面向上是一個樣本點。
因此我們可以很容易地列舉所有可能的輸出,并找出樣本空間:
{-:-}S={HHH, HHT, HTH,THH,TTH,THT,HTT,TTT}
假設Hi為第i次投擲正面向上的事件。例如:
{-:-}H1={HHH,HHT,HTH,HTT}
如果我們給每個事件指認1/8的概率,那么使用列舉的方法,我們可以看到P(H1)=P(H2)=P(H3)=1/2。
在這個概率模型中,事件H1、H2、H3是相互獨立的。要驗證這個結論,我們首先有:
我們還必須驗證每一對乘積。例如:
對于另外兩對也需要同樣的驗證。所以H1、H2、H3是相互獨立的。通常,我們把兩個獨立事件的概率寫作它們獨自概率的乘積:P(A∩B)=P(A)·P(B)。我們把兩個不相干獨立事件的概率寫作它們獨立概率的和:P(A∪B)=P(A)+P(B)。
如果我們考慮不同的結果,可以定義另外一種概率分布。例如,假設我們依然投擲3次骰子。這次隨機變量X是完成3次投擲后,正面向上的總次數。
使用列舉方法我們可以得到和之前一樣的樣本空間:
{-:-}S={HHH, HHT, HTH,THH,TTH,THT,HTT,TTT}
但是這次我們考慮正面向上的次數,隨機變量X會把樣本空間映射到表1-1所示的數值:
表1-1
| s | HHH | HHT | HTH | THH | TTH | THT | HTT | TTT |
| X(s) | 3 | 2 | 2 | 2 | 1 | 1 | 1 | 0 |
因此隨機變量X的取值范圍是{0,1,2,3}。和之前一樣,如果我們假設所有點都有相同的概率1/8,我們可以推出X取值范圍的概率函數,如表1-2所示:
表1-2
| x | 0 | 1 | 2 | 3 |
| P(X=x) | 1/8 | 3/8 | 3/8 | 1/8 |
1.2.4 聯合概率分布
讓我們回到第一個游戲,同時得到2次正面向上和一次6點,低概率的獲勝游戲。我們可以給硬幣投擲試驗關聯一個隨機變量N,它是2次投擲后獲得正面的次數。這個隨機變量可以很好地刻畫我們的試驗,N取0、1和2。因此,我們不說對兩次正面向上的事件感興趣,而等價的說我們對事件N=2感興趣。這種表述方便我們查看其他事件,例如只有1次正面(HT或TH),甚至0次正面(TT)。我們說,給N的每個取值指派概率的函數叫作概率分布。另一個隨機變量是D,表述投擲骰子之后的點數。
當我們同時考慮兩個試驗(投擲硬幣2次和投擲一個骰子)的時候,我們對同時獲得0、1或2的概率以及1、2、3、4、5或6的點數概率更感興趣。這兩個同時考慮的隨機變量的概率分布寫作P(N,D),稱作聯合概率分布。
如果一直加入越來越多的試驗和變量,我們可以寫出一個很長很復雜的聯合概率分布。例如,我們可能對明天下雨的概率,股市上漲的概率,以及明天上班路上高速堵車的概率感興趣。這是一個復雜的例子但是沒有實際意義。我們幾乎可以確定股市和天氣不會有依賴關系。然而,交通狀況和天氣狀況是密切關聯的。我可以寫出分布P(W,M,T)——天氣、股市、交通——但是它似乎有點過于復雜了。而事實并非如此,這也是本書要一直探討的話題。
一個概率圖模型就是一個聯合概率分布。除此以外,并無他物。
聯合概率分布的最后一個重要概念是邊緣化(Marginalization)。當你考察幾個隨機變量的概率分布,即聯合概率分布時,你也許想從分布中消除一些變量,得到較少變量的分布。這個操作很重要。聯合分布P(X,Y)的邊緣分布P(X)可以通過下列操作獲得:
其中我們按照y所有可能的取值匯總概率。通過這個操作,你可以從P(X,Y)消除Y。作為練習,可以考慮一下這個概率與之前看到的兩個不相干事件概率之間的關系。
對于數學見長的讀者,當Y是連續值時,邊緣化可以寫作。
這個操作非常重要,但對于概率圖模型也很難計算。幾乎所有的概率圖模型都試圖提出有效的算法,來解決這個問題。多虧了這些算法,我們可以處理現實世界里包含許多變量的復雜而有效的模型。
1.2.5 貝葉斯規則
讓我們繼續探討概率圖模型的一些基本概念。我們看到了邊緣化的概念,它很重要,因為當有一個復雜模型的時候,你可能希望從一個或者少數變量中抽取信息。此時就用上邊緣化的概念了。
但是最重要的兩個概念是條件概率和貝葉斯規則。
條件概率是指在知道其他事件發生的條件下當前事件的概率。很明顯,兩個事件必須某種程度的依賴,否則一個事件的發生不會改變另一個事件:
明天下雨的概率是多少?明天路上擁堵的概率是多少?
知道明天要下雨的話,路上擁堵的概率又是多少?它應該比沒有下雨知識的情況下要高。
這就是條件概率。更形式化的,我們可以給出下列公式:
{-:-}<img src="http://latex.codecogs.com/gif.latex?P(X|Y%29=\frac{P\left(%20X,Y%20\right%29}{P\left(%20Y%20\right%29}%20)和!P(Y|X" alt="P(X|Y)=\frac{P\left( X,Y \right)}{P\left( Y \right)} " />=\frac{P\left( X,Y \right)}{P\left( X \right)}
從這兩個等式我們可以輕松地推導出貝葉斯公式:
這個公式是最重要的公式,它可以幫助我們轉換概率關系。這也是拉普拉斯生涯的杰作,也是現代科學中最重要的公式。然而它也很簡單。
在這個公式中,我們把P(X|Y)叫作是給定Y下X的后驗分布。因此,我們也把P(X)叫作先驗分布。我們也把P(Y|X)叫做似然率,P(Y)叫做歸一化因子。
我們再解釋一下歸一化因子。回憶一下:P (X,Y )= P (Y |X) P (X )。而且我們有,即旨在消除(移出)聯合概率分布中單個變量的邊緣化。
因此基于上述理解,我們可以有。
借助簡單的代數技巧,我們可以把貝葉斯公式改寫成一般的形式,也是最方便使用的形式:
這個公式之美,以至于我們只需要給定和使用P(Y|X)和P(X),也就是先驗和似然率。雖然形式簡單,分母中的求和正如以后所見,可能是一個棘手的問題,復雜的問題也需要先進的技術。
理解貝葉斯公式
現在我們有X和Y兩個隨機變量的貝葉斯公式,讓我們改寫成另外兩個變量的形式。畢竟,用什么字母并不重要,但是它可以給出公式背后的自然理解:
這些概念背后的直覺邏輯如下:
先驗分布P(θ)是指我們在知道其他信息之前對θ的認識——我的初始信念。
給定θ值下的似然率,是指我可以生成什么樣的數據D。換句話說,對于所有的θ,D的概率是多少。
后驗概率P(θ|D),是指觀察到D之后,對θ的新信念。
這個公式也給出了更新變量θ信念的前向過程。使用貝葉斯規則可以計算θ新的分布。如果又收到了新的信息,我們可以一次又一次更新信念。
貝葉斯規則的第一個例子
在這一部分中,我們會看到第一個R語言的貝葉斯程序。我們會定義離散隨機變量,也就是隨機變量只能取預定義數量的數值。假設我們有一個制作燈泡的機器。你想知道機器是正常工作還是有問題。為了得到答案你可以測試每一個燈泡,但是燈泡的數量可能很多。使用少量樣本和貝葉斯規則,你可以估計機器是否在正常的工作。
在構建貝葉斯模型的時候,我們總是需要建立兩個部件:
- 先驗分布
- 似然率
在這個例子中,我們不需要特殊的程序包;我們只需要編寫一個簡單的函數來實現貝葉斯規則的簡單形式。
先驗分布是我們關于機器工作狀態的初始信念。我們確定了第一個刻畫機器狀態的隨機變量M。這個隨機變量有兩個狀態{working,broken}。我們相信機器是好的,是可以正常工作的,所以先驗分布如下:
{-:-}P(M= working)=0.99
{-:-}P(M= broken)=0.01
簡單地說,我們對于機器正常工作的信念度很高,即99%的正常和1%的有問題。很明顯,我們在使用概率的貝葉斯思想,因為我們并沒有很多機器,而只有一臺機器。我們也可以詢問機器供應商,得到生產正常機器的頻率信息。我們也可以使用他們提供的數字,這種情況下,概率就有了頻率派的解釋。但是,貝葉斯規則在所有理解下都適用。
第二個變量是L,是機器生產的燈泡。燈泡可能是好的,也可能是壞的。所以這個隨機變量包含兩個狀態{good,bad}。
同樣,我們需要給出燈泡變量L的先驗分布:在貝葉斯公式中,我們需要給出先驗分布和似然率分布。在這個例子中,似然率是P(L|M),而不是P(L)。
這里我們事實上需要定義兩個概率分布:一個是機器正常M=working時的概率,一個是機器損壞M=broken時的概率。我們需要回答兩遍:
當機器正常的時候,生產出好的燈泡或者壞的燈泡的可能性是多少?
當機器不正常的時候,生產出好的燈泡或者壞的燈泡的可能性是多少?
讓我們給出最可能的猜測,不管是支持貝葉斯派還是頻率派,因為我們有下列統計:
{-:-}P(L=good |M= working)=0.99
{-:-}P(L=bad |M= working)=0.01
{-:-}P(L=good |M= broken)=0.6
{-:-}P(L=bad |M= broken)=0.4
我們相信,如果機器正常,生產100個燈泡只會有一個是壞的,這比之前說的還要高些。但是在這個例子中,我們知道機器工作正常,我們期望非常高的良品率。但是,如果機器壞掉,我們認為至少40%的燈泡都是壞的。現在,我們已經完整地刻畫了模型,并可以使用它了。
使用貝葉斯模型是要在新的事實可用時計算后驗分布。在我們的例子中,我們想知道,在已知最后一個燈泡是壞的情況下機器是否可以正常工作。所以,我們想計算P(M|L)。我們只需要給出P(M)和P(L|M),最后只需用一下貝葉斯公式來轉換概率分布。
例如,假設最后生成的燈泡是壞的,即L=bad。使用貝葉斯公式我們有:
{-:-}P(M=working|L=bad)=
正如所見,機器正常工作的概率是71%。這個值比較低,但是符合機器依然正常的直觀感覺。盡管我們收到了一個壞燈泡,但也僅此一個,也許下一個就好了。
讓我們重新計算同樣的問題,其中機器正常與否的先驗概率和之前的相同:50%的機器工作正常,50%的機器工作不正常。結果變成:
機器有2.4%的概率正常工作。這就很低了。確實,給定機器質量后,正如建模成似然率,機器似乎要生產出壞燈泡。在這個例子中,我們并沒有做有關機器正常的任何假設。生產出一個壞燈泡可以看作出問題的跡象。
貝葉斯規則的第一個R語言例子
看了之前的例子,有人會問第一個有意義的問題:如果觀察多個壞燈泡我們需要怎么辦?只看到一個壞燈泡就說機器需要維修,這似乎有些不合情理。貝葉斯派的做法是使用后驗概率作為新的概率,并在序列中更新后驗分布。然后,徒手做起來會很繁重,我們會編寫第一個R語言貝葉斯程序。
下列代碼是一個函數,計算給定先驗分布、似然率和觀察數據序列后的后驗概率。這個函數有3個變量:先驗分布、似然率和數據序列。prior和data是向量,likelihood是矩陣:
prior <-c(working =0.99, broken =0.01)likelihood <-rbind(
working =c(good =0.99, bad =0.01), broken =c(good =0.6,
bad =0.4))
data <-c("bad", "bad", "bad", "bad")
復制代碼
所以我們定義了3個變量,包含工作狀態working和broken的prior,刻畫每個機器狀態(working和broken)的likelihood,燈泡變量L上的distribution。因此一共有4個值,R矩陣類似于之前定義的條件概率:
likelihoodgood bad
working 0.99 0.01
broken 0.60 0.40
復制代碼
data變量包含觀察到的,用于測試機器和計算后驗概率的燈泡序列。因此,我們可以定義如下貝葉斯更新函數:
bayes < -function(prior, likelihood, data){
posterior < -<strong>matrix</strong>(0, nrow =<strong>length</strong>(data), ncol =<strong>length</strong>(prior))
<strong>dimnames</strong>(posterior) < -<strong>list</strong>(data, <strong>names</strong>(prior))
initial_prior < -prior
for (i in 1:<strong>length</strong>(data))
{
posterior[i, ] < -
prior *likelihood[, data[i]]/
<strong>sum</strong>(prior *likelihood[,data[i]])
prior < -posterior[i, ]
}
<strong>return</strong>(<strong>rbind</strong>(initial_prior, posterior))
}
復制代碼
這個函數做了下列事情:
創建一個矩陣,存儲后驗分布的連續計算結果。
然后對于每一個數據,給定當前先驗概率計算后驗概率:和之前的一樣,你可以看到貝葉斯公式的R代碼。
最后,新的先驗概率是當前的后驗概率,而且同樣的過程可以迭代。
最終,函數返回了一個矩陣,包含初始先驗概率和所有后續后驗概率。
讓我們多運行幾次,理解一下工作原理。我們使用函數matplot繪出兩個分布的演化情況。一個是機器正常(綠色線)的后驗概率,一個是機器故障(紅色線)的后驗概率,如圖1-1所示。
<strong>matplot</strong>(<strong>bayes</strong>(prior, likelihood, data), t ='b', lty =1, pch =20,col =<strong>c</strong>(3, 2))
復制代碼
圖1-1
結果可以從圖中看到:隨著壞燈泡的增多,機器正常的概率快速下降(實線或綠色線)[2]
我們原本希望100只燈泡中只有1個壞燈泡,不要太多就好。所以這個機器現在需要維護了。紅色線或虛線表示機器有問題。
如果先驗概率不同,我們可以看到不同的演化。例如,假設我們不知道機器是否可以正常工作,我們為每一種情況指認相同的概率:
prior < -<strong>c</strong>(working =0.5, broken =0.5)復制代碼
再次運行代碼:
<strong>matplot</strong>(<strong>bayes</strong>(prior, likelihood, data), t ='b', lty =1, pch =20,col =<strong>c</strong>(3, 2))
復制代碼
我們又得到了一個快速收斂的曲線,其中機器有問題的概率很高。這對于給定一批壞燈泡的情形來說,并不意外,如圖1-2所示。
圖1-2
如果一直變換數據,我們可以看到不同的行為。例如,假設機器正常工作的概率是99%。我們觀察10個燈泡,其中第一個燈泡是壞的。我們有R代碼:
prior =c(working =0.99, broken =0.01)data =
c
("bad", "good", "good", "good", "good", "good", "good",
"good", "good", "good"
)
matplot
(
bayes
(prior, likelihood, data), t ='b', pch =20, col =
c
(3, 2)) 復制代碼
結果如圖1-3所示。
圖1-3
算法在第一個燈泡處猶豫了一下。因為這么好的機器,不大可能生產出一個壞燈泡。但是然后它又收斂到很高的概率,因為好燈泡的序列不會預示任何問題。
我們的第一個R語言貝葉斯模型就完成了。本章的其他部分,會介紹如何創建帶有多于兩個隨機變量現實世界的模型,以及如何解決兩個重要問題:
- 推斷的問題,即收到新數據時計算后驗概率的問題。
- 學習的問題,即數據集里先驗概率的確定問題。
細心的讀者也許會問:剛才看到的這個簡單的算法可以解決推斷問題嗎?它確實可以,但是只能在有兩個離散變量的時候。這有些過于簡單,而無法捕捉現實世界的復雜性。我們會介紹本書的核心內容和執行貝葉斯推理的主流工具:概率圖模型。
1.3 概率圖模型
在本章的最后一部分,我們會介紹概率圖模型,作為原生框架支持通過簡單的模塊生成復雜的概率模型。這些復雜模型通常對于要解決的復雜任務是必需的。而復雜并不意味著混亂,簡單的事情是最好、最有效的。復雜是指為了表示和解決擁有很多輸入、部件或者數據的任務,我們需要一個不完全平凡的模型,但是要滿足足夠的復雜度。
這個復雜的模型可以分解成幾個相互交互的簡單問題。最終,最簡單的構建模塊是一個變量。這個變量有一個隨機值,或者像之前部分看到的帶有不確定性的一個值。
1.3.1 概率模型
如果你還記得,我們看到使用概率分布表示復雜概念是有可能的。當我們有許多隨機變量時,我們把這個分布叫作聯合分布。有時拿到幾百個甚至上千個更多的隨機變量并非不可能。表示這么龐大的分布是非常困難的,在大多數情況下也是不可能的。
例如,在醫學診斷中,每一個變量表示一個癥狀。我們可以拿到許多這樣的變量。其他變量可以表示病人的年齡、性別、體溫、血壓等。我們可以使用許多不同的變量表示病人狀態。我們也可以加入其他信息,例如最近的天氣條件,病人的年齡和飲食狀況。
從這個復雜的系統中,我們想解決兩個問題:
- 從病人的數據庫中,我們希望評估和發現所有概率分布,以及相關參數。這當然是自動的過程。
- 我們希望把問題放入模型中,例如,“如果我們觀察到了一系列癥狀,我們病人是否還健康?”。類似的,“如果我改變病人的飲食,并開了這個藥,我的病人是否會恢復?”。
然而,還有一個重要的問題:在這個模型中,我們想利用其他重要的知識,甚至是最重要的知識之一:不同模型部件之間的交互。換句話說,不同隨機變量之間的依賴。例如,癥狀和疾病之間有明顯的依賴關系。另外,飲食和癥狀之間的依賴關系比較遙遠,或者通過其他變量例如年齡、性別有所依賴。
最終,在這個模型中完成的所有推理都天然地帶有概率的性質。從對變量X的觀察,我們想推出其他變量的后驗分布,得到它們的概率而不是簡單的是或不是的回答。有了這個概率,我們可以拿到比二元響應更豐富的回答。
1.3.2 圖和條件獨立
讓我們做一個簡單的計算。假設我們有兩個二元隨機變量,比如一個是在本章上一節看到的變量。我們把它們命名為X和Y。這兩個變量的聯合概率分布是P(X,Y)。它們是二元變量,因此我們可以為每一個取值,為簡便起見稱之為x1、x2和y1、y2。
我們需要給定多少概率值?一共有4個,即P(X= x1, Y= y1)、P(X= x1, Y= y2)、P(X= x2, Y= y1)和P(X= x2, Y= y2)。
假設我們不止有兩個二元隨機變量,而是10個。這還是一個非常簡單的模型,對吧?我們把這些變量叫作X1、X2、X3、X4、X5、X6、X7、X8、X9、X10。這種情況下,我們需要提供210=1 024個值來確定我們的聯合概率分布。如果我們還有10個變量,也就是一共20個變量該怎么辦?這還是一個非常小的模型。但是我們需要給定220=1 048 576個值。這已經超過了一百萬個值了。因此對于這么簡單的模型,建模任務已經變得幾乎不可能了!
概率圖模型正是簡潔地描述這類模型的框架,并支持有效的模型構建和使用。事實上,使用概率圖模型處理上千個變量并不罕見。當然,計算機模型并不會存儲幾十億個值,但是計算機會使用條件獨立,以便模型可以在內存中處理和表示。而且,條件獨立給模型添加了結構知識。這類知識給模型帶來了巨大的不同。
在一個概率圖模型中,變量之間的知識可以用圖表示。這里有一個醫學例子:如何診斷感冒。這只是一個示例,不代表任何醫學建議。為了簡單,這個例子做了極大的精簡。我們有如下幾個隨機變量:
- Se:年內季節。
- N:鼻子堵塞。
- H:病人頭痛。
- S:病人經常打噴嚏。
- C:病人咳嗽。
- Cold:病人感冒。
因為每一個癥狀都有不同的程度,所以我們很自然地使用隨機變量來表示這些癥狀。例如,如果病人的鼻子有點堵塞,我們會給這個變量指派,例如60%。即P(N=blocked)=0.6和P(N=notblocked)=0.4。
在這例子中,概率分布P(Se,N,H,S,C,Cold)一共需要4×25=128個值(4個季節,每一個隨機變量取2個值)。這已經很多了。坦白講,這已經很難確定諸如“鼻子不堵塞的概率”“病人頭痛和打噴嚏等的概率”。
但是,我們可以說頭痛與咳嗽或鼻子堵塞并不是直接相關,除非病人得了感冒。事實上,病人頭痛有很多其他原因。
而且,我們可以說季節對打噴嚏、鼻子阻塞有非常直接的影響,或者咳嗽對于頭痛的影響很少或沒有。在概率圖模型中,我們會用圖表示這些依賴關系。如圖1-4所示,每一個隨機變量都是圖中的節點,每一個關系都是兩個節點間的箭頭。
圖1-4
如圖1-4所示,概率圖模型中的每一個節點間都存在有向關系,即箭頭。我們可以使用這種方式來簡化聯合概率分布,以便概率可以追蹤。
使用圖作為模型來簡化復雜(或者甚至混亂)的分布有諸多好處:
- 首先,可以從上個例子中看到,通常我們建模一個問題的時候,隨機變量只與其他隨機變量的小規模子集直接交互。因此,使用圖可以使得模型更加緊湊和易于處理。
- 圖中的知識和依賴易于理解和溝通。
- 圖模型引出了聯合概率分布的緊湊表示,并且易于計算。
- 執行推斷和學習的算法可以使用圖論和相關算法,以便改進和推動所有推斷和學習:與初始的聯合概率分布相比,使用概率圖模型會以幾個級數的速度加速計算。
1.3.3 分解分布
在之前的普通感冒診斷的例子中,我們定義了一個簡單的模型,包含變量Se、N、H、S、C和R。我們看到,對于這樣一個簡單的專家系統,我們就需要128個參數!
我們還看到,我們可以基于常識或者簡單的知識做出幾個獨立假設。在以后的內容中,我們會看到如何從數據集中發現這些假設(也叫作結構學習)。
所有我們可以做出假設,重寫聯合概率分布:
{-:-}P(Se,N,H,S,C,Cold)
{-:-}=P(Se)P(S|Se,Cold)P(N|Se,Cold)P(Cold)P(C|Cold)P(H|Cold)
在這個分布中,我們進行了分解。也就是說,我們把原來的聯合概率分布表示為一些因子的乘積。在這個例子中,因子是更加簡單的概率分布,例如P(C|Cold),病人感冒的情況下咳嗽的概率。由于我們可以把所有的變量看作二元的(除了季節,它有4個取值),每一個小的因子(分布)只需要確定少量的參數:4+23+23+2+22+22=30。我們只需要30個簡單的參數,而不是128個!這是個巨大的改進。
我說過,參數非常容易確定,不管是通過手工還是根據數據。例如,我們不知道病人是否得了感冒,因此我們可以給變量Cold指派相同的概率,即P(Cold=true)=P(Cold=false)=0.5。
類似的,我們也很容易確定P(C|Cold),因為如果病人得了感冒(Cold = true),他很有可能咳嗽。如果他沒有感冒,病人咳嗽的概率很低,但是不是零不能確定,因為還有其他可能的原因。
1.3.4 有向模型
通常,有向概率圖模型可以按照如下形式分解多個隨機變量X1,X2,...,Xn上的聯合概率分布:
pa(Xi)是圖中定義的變量Xi的父變量的子集。
圖中的父變量很容易理解:當箭頭從A指向B時,A就是B的父變量。一個節點可以有很多可能的子節點,也可以有很多可能的父節點。
有向模型非常適合建模需要表示因果關系的問題。它也非常適合參數學習,因為每一個局部概率分布都很容易學習。
我們在本章中多次提到了概率圖模型可以使用簡單的模塊進行構建,并組合出更大的模型。在有向模型中,模塊指的是小的概率分布P(Xi|pa(Xi))。
而且,如果我們想給模型擴展9個新的變量以及一些關系,我們只需簡單擴展圖形。有向概率圖模型的算法適用于任何圖形,不管什么樣的規模。
盡管如此,并不是所有的概率分布都可以表示成有向概率圖模型。有時,我們也有必要放松一些假設。
同時,注意到圖必須是無環的很重要。這意味著,你不可能同時找到從A到B的箭頭和從B到A的箭頭,如圖1-5所示。
圖1-5
事實上,這個圖并不表示之前定義的分解過程。它可能意味著A是B的原因,同時B也是A的原因。這是矛盾的,也沒有等價的數學表示。
當假設或者關系不是有向的,還存在第二種概率圖模型的形式。它的邊都是無向的。它也叫作無向概率圖模型或者馬爾科夫網絡。
1.3.5 無向模型
無向概率圖模型可以按照如下形式分解多個隨機變量X1,X2,...,Xn上的聯合概率分布:
這個公式的解釋如下:
左邊的第一個項是通常的聯合概率分布。
常數Z是歸一化常數,確保右側所有項的和是1,因為這是一個概率分布。
?c是變量χc子集上的因子,以便這個子集的每一個成員是一個極大團,也就是內部所有節點都相互連接的子圖,如圖1-6所示。
圖1-6
在上圖中,我們有4個節點,并且函數?c定義在子集,也就是極大團{ABC}和{A,D}上。因此這里的概率分布并不復雜。這種類型的模型在計算機視覺、圖像處理、財經和其他變量間關系遵循一定模式的領域都有廣泛的應用。
1.3.6 示例和應用
現在來討論一下概率圖模型的應用。其實這些應用用幾百頁去講述也很難涵蓋其中的一部分。正如我們看到的,概率圖模型是一種建模復雜概率模型的很有用的框架,可以使得概率易于理解和處理。
在這部分中,我們會使用之前的兩個模型:燈泡機和感冒診斷。
回憶一下,感冒診斷模型有下列分解形式:
{-:-}P(Se,N,H,S,C,Cold)=P(Se)P(S|Se,Cold)P(N|Se, Cold)P(Cold)P(C|Cold)P(H|Cold)
而燈泡機僅僅通過兩個變量定義:L和M。分解形式也很簡單。
{-:-}P(L,M)=P(M)·P(L|M)
對應分布的圖模型也很簡單,如圖1-7所示。
圖1-7
為了表示概率圖模型,我們會使用R程序包gRain。安裝如下:
source("http://bioconductor.org/biocLite.R")biocLite
()
install.packages
("gRain")復制代碼
需要注意,這個安裝過程可能會持續幾分鐘,因為這個程序包還依賴于許多其他的程序包(尤其是我們經常用到的gRbase程序包),而且提供了對圖模型的一些基本操作函數。當程序包安裝好后,你可以加載:
library("gRbase") 復制代碼首先,我們想定義一個帶有變量A、B、C、D、E的簡單無向圖:
graph < -ug("A:B:E + C:E:D")class
(graph) 復制代碼
我們定義了帶有團A、B和E以及另一個團C、E和D的圖模型。這形成了一個蝴蝶狀的圖。它的語法很簡單:字符串的每一個團用+分開,每一個團使用冒號分隔的變量名定義。
接著我們需要安裝圖的可視化程序包。我們會使用流行的Rgraphviz。要安裝可以輸入:
install.packages("Rgraphviz")plot
(graph) 復制代碼
你可以得到第一個無向圖,如圖1-8所示。
圖1-8
接著,我們希望定義一個有向圖。假設我們依然有變量{A, B, C, D, E}:
dag < -dag("A + B:A + C:B + D:B + E:C:D")dag
plot
(dag) 復制代碼
語法依然很簡單:沒有父節點的節點單獨表示,例如A,否則父節點通過冒號分隔的節點列表刻畫。
這個程序包提供了多種定義圖模型的語法。你也可以按照節點的方式構建圖模型。我們會在本書中用到幾種表示法,以及一個非常著名的表示法:矩陣表示法。一個圖模型可以等價地表示為一個方陣,其中每一行和每一列表示一個節點。如果節點間存在邊,那么矩陣的系數是1,否則為0。如果圖是無向的,矩陣會是對稱的;否則可以是任何樣式。
最終,通過第二個例子我們可以得到圖1-9所示的圖模型。
圖1-9
現在我們想為燈泡機問題定義一個簡單的圖模型,并給出數值概率。我們再做一遍計算,看看結果是否一致。
首先,我們為每一個節點定義取值:
machine_val < -c("working", "broken")light_bulb_val < -
c
("good", "bad") 復制代碼
然后為兩個隨機變量定義百分比數值:
machine_prob < -c(99, 1)light_bulb_prob < -
c
(99, 1, 60, 40) 復制代碼
接著,使用gRain定義隨機變量:
M < -cptable(~machine, values = machine_prob, levels = machine_val)L < -
cptable
(~light_bulb |machine, values = light_bulb_prob, levels = light
_
bulb_val) 復制代碼
這里,cptable表示條件概率表:它是離散型隨機變量概率分布的內存表示。我們會在第2章精確推斷中再次討論這個表示法。
最后,我們可以構建新的概率圖模型。當我們在第2章精確推斷中研究推斷算法例如聯結樹算法(Junction Tree Algorithm)時,這種表示法更加易于理解:
plist < -compileCPT(list(M, L))plist 復制代碼
打印網絡的時候,結果如下:
CPTspec with probabilities:P
( machine )
P
( light_bulb |machine ) 復制代碼
這里,可以清楚地看到之前定義的概率分布。如果我們打印出變量的分布,我們可以再次看到之前的結果:
plist$machineplist$light_bulb
復制代碼
輸出的結果如下:
plist$machinemachine
working broken
0.99 0.01
plist$light_bulb
machine
light_bulb working broken
good 0.99 0.6
bad 0.01 0.4
復制代碼
現在我們從模型中找出后驗概率。首先,給模型輸入證據(即我們觀察到一個壞燈泡),操作如下:
net < -grain(plist)net2 < -
setEvidence
(net, evidence =
list
(light_bulb ="bad"))
querygrain
(net2, nodes =
c
("machine")) 復制代碼
程序包會借助推斷算法計算結果,并輸出下列結果:
$machinemachine
working broken
0.7122302 0.2877698
復制代碼
這個結果與之前使用貝葉斯方法得到的結果完全相同。現在我們可以創建更加強大的模型,以及針對不同的問題應用不同的算法。這就是下一章關于圖模型上精確推斷的內容。
1.4 小結
在第1章中,我們學到了概率論的基礎概念。
我們看到了如何以及為什么使用概率來表示數據和知識的不確定性,同時我們還介紹了貝葉斯公式。這是計算后驗概率的最重要的公式。也就是說,當新的數據可用時,要更新關于一個事實的信念和知識。
我們看到了什么是聯合概率分布,同時看到它會很快變得很復雜以至于難以處理。我們學到了概率圖模型的基礎知識,它是對概率模型進行易于處理、高效和簡單建模的原生框架。最后,我們介紹了概率圖模型的不同類型,并學到如何使用R程序包來編寫第一個模型。
在下一章中,我們會學到概率圖模型上執行貝葉斯推斷的一系列算法,即給模型提出問題和尋求答案。我們會介紹R程序包的新特性,同時我們會學到這些算法如何工作,以及高效的執行。
[1]
原書此處為厘米,似乎有問題。
[2] 原書中“as the bad light bulbs arrive, the probability that the machine will fail quickly falls”,應有誤。
總結
- 上一篇: mysql数据库三大引擎优缺点
- 下一篇: mysql数据库的优缺点