1. 程式人生 > >樸素貝葉斯分類演算法

樸素貝葉斯分類演算法

概率論只不過是把常識用數學公式表達了出來。

——拉普拉斯

記得讀本科的時候,最喜歡到城裡的計算機書店裡面去閒逛,一逛就是好幾個小時;有一次,在書店看到一本書,名叫貝葉斯方法。當時數學系的課程還沒有學到概率統計。我心想,一個方法能夠專門寫出一本書來,肯定很牛逼。後來,我發現當初的那個樸素歸納推理成立了——這果然是個牛逼的方法。

——題記

目錄

0. 前言
1. 歷史
1.1 一個例子:自然語言的二義性
1.2 貝葉斯公式
2. 拼寫糾正
3. 模型比較與貝葉斯奧卡姆剃刀
3.1 再訪拼寫糾正
3.2 模型比較理論(Model Comparasion)與貝葉斯奧卡姆剃刀(Bayesian Occam’s Razor)
3.3 最小描述長度原則
3.4 最優貝葉斯推理
4. 無處不在的貝葉斯
4.1 中文分詞
4.2 統計機器翻譯
4.3 貝葉斯影象識別,Analysis by Synthesis
4.4 EM 演算法與基於模型的聚類
4.5 最大似然與最小二乘
5. 樸素貝葉斯方法(又名“愚蠢者的貝葉斯(idiot’s bayes)”)
5.1 垃圾郵件過濾器
5.2 為什麼樸素貝葉斯方法令人詫異地好——一個理論解釋
6. 層級貝葉斯模型
6.1 隱馬可夫模型(HMM)
7. 貝葉斯網路

0. 前言

這是一篇關於貝葉斯方法的科普文,我會盡量少用公式,多用平白的語言敘述,多舉實際例子。更嚴格的公式和計算我會在相應的地方註明參考資料。貝葉斯方法被證明是非常 general 且強大的推理框架,文中你會看到很多有趣的應用。

1. 歷史

托馬斯·貝葉斯(Thomas Bayes)同學的詳細生平在這裡。以下摘一段 wikipedia 上的簡介:

所謂的貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇文章之前,人們已經能夠計算“正向概率”,如“假設袋子裡面有N個白球,M個黑球,你伸手進去摸一把,摸出黑球的概率是多大”。而一個自然而然的問題是反過來:“如果我們事先並不知道袋子裡面黑白球的比例,而是閉著眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顏色之後,那麼我們可以就此對袋子裡面的黑白球的比例作出什麼樣的推測”。這個問題,就是所謂的逆概問題。

實際上,貝葉斯當時的論文只是對這個問題的一個直接的求解嘗試,並不清楚他當時是不是已經意識到這裡麵包含著的深刻的思想。然而後來,貝葉斯方法席捲了概率論,並將應用延伸到各個問題領域,所有需要作出概率預測的地方都可以見到貝葉斯方法的影子,特別地,貝葉斯是機器學習的核心方法之一。這背後的深刻原因在於,現實世界本身就是不確定的,人類的觀察能力是有侷限性的(否則有很大一部分科學就沒有必要做了——設想我們能夠直接觀察到電子的執行,還需要對原子模型爭吵不休嗎?),我們日常所觀察到的只是事物表面上的結果,沿用剛才那個袋子裡面取球的比方,我們往往只能知道從裡面取出來的球是什麼顏色,而並不能直接看到袋子裡面實際的情況。這個時候,我們就需要提供一個猜測(hypothesis,更為嚴格的說法是“假設”,這裡用“猜測”更通俗易懂一點),所謂猜測,當然就是不確定的(很可能有好多種乃至無數種猜測都能滿足目前的觀測),但也絕對不是兩眼一抹黑瞎蒙——具體地說,我們需要做兩件事情:1. 算出各種不同猜測的可能性大小。2. 算出最靠譜的猜測是什麼。第一個就是計算特定猜測的後驗概率,對於連續的猜測空間則是計算猜測的概率密度函式。第二個則是所謂的模型比較,模型比較如果不考慮先驗概率的話就是最大似然方法。

1.1 一個例子:自然語言的二義性

下面舉一個自然語言的不確定性的例子。當你看到這句話:

The girl saw the boy with a telescope.

你對這句話的含義有什麼猜測?平常人肯定會說:那個女孩拿望遠鏡看見了那個男孩(即你對這個句子背後的實際語法結構的猜測是:The girl saw-with-a-telescope the boy )。然而,仔細一想,你會發現這個句子完全可以解釋成:那個女孩看見了那個拿著望遠鏡的男孩(即:The girl saw the-boy-with-a-telescope )。那為什麼平常生活中我們每個人都能夠迅速地對這種二義性進行消解呢?這背後到底隱藏著什麼樣的思維法則?我們留到後面解釋。

1.2 貝葉斯公式

貝葉斯公式是怎麼來的?

我們還是使用 wikipedia 上的一個例子:

一所學校裡面有 60% 的男生,40% 的女生。男生總是穿長褲,女生則一半穿長褲一半穿裙子。有了這些資訊之後我們可以容易地計算“隨機選取一個學生,他(她)穿長褲的概率和穿裙子的概率是多大”,這個就是前面說的“正向概率”的計算。然而,假設你走在校園中,迎面走來一個穿長褲的學生(很不幸的是你高度近似,你只看得見他(她)穿的是否長褲,而無法確定他(她)的性別),你能夠推斷出他(她)是男生的概率是多大嗎?

一些認知科學的研究表明(《決策與判斷》以及《Rationality for Mortals》第12章:小孩也可以解決貝葉斯問題),我們對形式化的貝葉斯問題不擅長,但對於以頻率形式呈現的等價問題卻很擅長。在這裡,我們不妨把問題重新敘述成:你在校園裡面隨機遊走,遇到了 N 個穿長褲的人(仍然假設你無法直接觀察到他們的性別),問這 N 個人裡面有多少個女生多少個男生。

你說,這還不簡單:算出學校裡面有多少穿長褲的,然後在這些人裡面再算出有多少女生,不就行了?

我們來算一算:假設學校裡面人的總數是 U 個。60% 的男生都穿長褲,於是我們得到了 U * P(Boy) * P(Pants|Boy) 個穿長褲的(男生)(其中 P(Boy) 是男生的概率 = 60%,這裡可以簡單的理解為男生的比例;P(Pants|Boy) 是條件概率,即在 Boy 這個條件下穿長褲的概率是多大,這裡是 100% ,因為所有男生都穿長褲)。40% 的女生裡面又有一半(50%)是穿長褲的,於是我們又得到了 U * P(Girl) * P(Pants|Girl) 個穿長褲的(女生)。加起來一共是 U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 個穿長褲的,其中有 U * P(Girl) * P(Pants|Girl) 個女生。兩者一比就是你要求的答案。

下面我們把這個答案形式化一下:我們要求的是 P(Girl|Pants) (穿長褲的人裡面有多少女生),我們計算的結果是 U * P(Girl) * P(Pants|Girl) / [U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl)] 。容易發現這裡校園內人的總數是無關的,可以消去。於是得到

P(Girl|Pants) = P(Girl) * P(Pants|Girl) / [P(Boy) * P(Pants|Boy) + P(Girl) * P(Pants|Girl)]

注意,如果把上式收縮起來,分母其實就是 P(Pants) ,分子其實就是 P(Pants, Girl) 。而這個比例很自然地就讀作:在穿長褲的人( P(Pants) )裡面有多少(穿長褲)的女孩( P(Pants, Girl) )。

上式中的 Pants 和 Boy/Girl 可以指代一切東西,所以其一般形式就是:

P(B|A) = P(A|B) * P(B) / [P(A|B) * P(B) + P(A|~B) * P(~B) ]

收縮起來就是:

P(B|A) = P(AB) / P(A)

其實這個就等於:

P(B|A) * P(A) = P(AB)

難怪拉普拉斯說概率論只是把常識用數學公式表達了出來

然而,後面我們會逐漸發現,看似這麼平凡的貝葉斯公式,背後卻隱含著非常深刻的原理。

2. 拼寫糾正

經典著作《人工智慧:現代方法》的作者之一 Peter Norvig 曾經寫過一篇介紹如何寫一個拼寫檢查/糾正器的文章(原文在這裡,徐宥的翻譯版在這裡,這篇文章很深入淺出,強烈建議讀一讀),裡面用到的就是貝葉斯方法,這裡我們不打算複述他寫的文章,而是簡要地將其核心思想介紹一下。

首先,我們需要詢問的是:“問題是什麼?

問題是我們看到使用者輸入了一個不在字典中的單詞,我們需要去猜測:“這個傢伙到底真正想輸入的單詞是什麼呢?”用剛才我們形式化的語言來敘述就是,我們需要求:

P(我們猜測他想輸入的單詞 | 他實際輸入的單詞)

這個概率。並找出那個使得這個概率最大的猜測單詞。顯然,我們的猜測未必是唯一的,就像前面舉的那個自然語言的歧義性的例子一樣;這裡,比如使用者輸入: thew ,那麼他到底是想輸入 the ,還是想輸入 thaw ?到底哪個猜測可能性更大呢?幸運的是我們可以用貝葉斯公式來直接出它們各自的概率,我們不妨將我們的多個猜測記為 h1 h2 .. ( h 代表 hypothesis),它們都屬於一個有限且離散的猜測空間 H (單詞總共就那麼多而已),將使用者實際輸入的單詞記為 D ( D 代表 Data ,即觀測資料),於是

P(我們的猜測1 | 他實際輸入的單詞)

可以抽象地記為:

P(h1 | D)

類似地,對於我們的猜測2,則是 P(h2 | D)。不妨統一記為:

P(h | D)

運用一次貝葉斯公式,我們得到:

P(h | D) = P(h) * P(D | h) / P(D)

對於不同的具體猜測 h1 h2 h3 .. ,P(D) 都是一樣的,所以在比較 P(h1 | D) 和 P(h2 | D) 的時候我們可以忽略這個常數。即我們只需要知道:

P(h | D) ∝ P(h) * P(D | h) (注:那個符號的意思是“正比例於”,不是無窮大,注意符號右端是有一個小缺口的。)

這個式子的抽象含義是:對於給定觀測資料,一個猜測是好是壞,取決於“這個猜測本身獨立的可能性大小(先驗概率,Prior )”和“這個猜測生成我們觀測到的資料的可能性大小”(似然,Likelihood )的乘積。具體到我們的那個 thew 例子上,含義就是,使用者實際是想輸入 the 的可能性大小取決於 the 本身在詞彙表中被使用的可能性(頻繁程度)大小(先驗概率)和 想打 the 卻打成 thew 的可能性大小(似然)的乘積。

下面的事情就很簡單了,對於我們猜測為可能的每個單詞計算一下 P(h) * P(D | h) 這個值,然後取最大的,得到的就是最靠譜的猜測。

一點註記:Norvig 的拼寫糾正器裡面只提取了編輯距離為 2 以內的所有已知單詞。這是為了避免去遍歷字典中每個單詞計算它們的 P(h) * P(D | h) ,但這種做法為了節省時間帶來了一些誤差。但話說回來難道我們人類真的回去遍歷每個可能的單詞來計算他們的後驗概率嗎?不可能。實際上,根據認知神經科學的觀點,我們首先根據錯誤的單詞做一個 bottom-up 的關聯提取,提取出有可能是實際單詞的那些候選單詞,這個提取過程就是所謂的基於內容的提取,可以根據錯誤單詞的一些模式片段提取出有限的一組候選,非常快地縮小的搜尋空間(比如我輸入 explaination ,單詞裡面就有充分的資訊使得我們的大腦在常數時間內把可能性 narrow down 到 explanation 這個單詞上,至於具體是根據哪些線索——如音節——來提取,又是如何在生物神經網路中實現這個提取機制的,目前還是一個沒有弄清的領域)。然後,我們對這有限的幾個猜測做一個 top-down 的預測,看看到底哪個對於觀測資料(即錯誤單詞)的預測效力最好,而如何衡量預測效率則就是用貝葉斯公式裡面的那個 P(h) * P(D | h) 了——雖然我們很可能使用了一些啟發法來簡化計算。後面我們還會提到這樣的 bottom-up 的關聯提取。

3. 模型比較與奧卡姆剃刀

3.1 再訪拼寫糾正

介紹了貝葉斯拼寫糾正之後,接下來的一個自然而然的問題就來了:“為什麼?”為什麼要用貝葉斯公式?為什麼貝葉斯公式在這裡可以用?我們可以很容易地領會為什麼貝葉斯公式用在前面介紹的那個男生女生長褲裙子的問題裡是正確的。但為什麼這裡?

為了回答這個問題,一個常見的思路就是想想:非得這樣嗎?因為如果你想到了另一種做法並且證明了它也是靠譜的,那麼將它與現在這個一比較,也許就能得出很有價值的資訊。那麼對於拼寫糾錯問題你能想到其他方案嗎?

不管怎樣,一個最常見的替代方案就是,選擇離 thew 的編輯距離最近的。然而 the 和 thaw 離 thew 的編輯距離都是 1 。這可咋辦捏?你說,不慌,那還是好辦。我們就看到底哪個更可能被錯打為 thew 就是了。我們注意到字母 e 和字母 w 在鍵盤上離得很緊,無名指一抽筋就不小心多打出一個 w 來,the 就變成 thew 了。而另一方面 thaw 被錯打成 thew 的可能性就相對小一點,因為 e 和 a 離得較遠而且使用的指頭相差一個指頭(一個是中指一個是小指,不像 e 和 w 使用的指頭靠在一塊——神經科學的證據表明緊鄰的身體設施之間容易串位)。OK,很好,因為你現在已經是在用最大似然方法了,或者直白一點,你就是在計算那個使得 P(D | h) 最大的 h 。

而貝葉斯方法計算的是什麼?是 P(h) * P(D | h) 。多出來了一個 P(h) 。我們剛才說了,這個多出來的 P(h) 是特定猜測的先驗概率。為什麼要摻和進一個先驗概率?剛才說的那個最大似然不是挺好麼?很雄辯地指出了 the 是更靠譜的猜測。有什麼問題呢?既然這樣,我們就從給最大似然找茬開始吧——我們假設兩者的似然程度是一樣或非常相近,這樣不就難以區分哪個猜測更靠譜了嗎?比如使用者輸入tlp ,那到底是 top 還是 tip ?(這個例子不怎麼好,因為 top 和 tip 的詞頻可能仍然是接近的,但一時想不到好的英文單詞的例子,我們不妨就假設 top 比 tip 常見許多吧,這個假設並不影響問題的本質。)這個時候,當最大似然不能作出決定性的判斷時,先驗概率就可以插手進來給出指示——“既然你無法決定,那麼我告訴你,一般來說 top 出現的程度要高許多,所以更可能他想打的是 top ”)。

以上只是最大似然的一個問題,即並不能提供決策的全部資訊。

最大似然還有另一個問題:即便一個猜測與資料非常符合,也並不代表這個猜測就是更好的猜測,因為這個猜測本身的可能性也許就非常低。比如 MacKay 在《Information Theory : Inference and Learning Algorithms》裡面就舉了一個很好的例子:-1 3 7 11 你說是等差數列更有可能呢?還是 -X^3 / 11 + 9/11*X^2 + 23/11 每項把前項作為 X 帶入後計算得到的數列?此外曲線擬合也是,平面上 N 個點總是可以用 N-1 階多項式來完全擬合,當 N 個點近似但不精確共線的時候,用 N-1 階多項式來擬合能夠精確通過每一個點,然而用直線來做擬合/線性迴歸的時候卻會使得某些點不能位於直線上。你說到底哪個好呢?多項式?還是直線?一般地說肯定是越低階的多項式越靠譜(當然前提是也不能忽視“似然”P(D | h) ,明擺著一個多項式分佈您愣是去拿直線擬合也是不靠譜的,這就是為什麼要把它們兩者乘起來考慮。),原因之一就是低階多項式更常見,先驗概率( P(h) )較大(原因之二則隱藏在 P(D | h) 裡面),這就是為什麼我們要用樣條來插值,而不是直接搞一個 N-1 階多項式來通過任意 N 個點的原因。

以上分析當中隱含的哲學是,觀測資料總是會有各種各樣的誤差,比如觀測誤差(比如你觀測的時候一個 MM 經過你一不留神,手一抖就是一個誤差出現了),所以如果過分去尋求能夠完美解釋觀測資料的模型,就會落入所謂的資料過配(overfitting)的境地,一個過配的模型試圖連誤差(噪音)都去解釋(而實際上噪音又是不需要解釋的),顯然就過猶不及了。所以 P(D | h) 大不代表你的 h (猜測)就是更好的 h。還要看 P(h) 是怎樣的。所謂奧卡姆剃刀精神就是說:如果兩個理論具有相似的解釋力度,那麼優先選擇那個更簡單的(往往也正是更平凡的,更少繁複的,更常見的)。

過分匹配的另一個原因在於當觀測的結果並不是因為誤差而顯得“不精確”而是因為真實世界中對資料的結果產生貢獻的因素太多太多,跟噪音不同,這些偏差是一些另外的因素集體貢獻的結果,不是你的模型所能解釋的——噪音那是不需要解釋——一個現實的模型往往只提取出幾個與結果相關度很高,很重要的因素(cause)。這個時候觀察資料會傾向於圍繞你的有限模型的預測結果呈正態分佈,於是你實際觀察到的結果就是這個正態分佈的隨機取樣,這個取樣很可能受到其餘因素的影響偏離你的模型所預測的中心,這個時候便不能貪心不足地試圖通過改變模型來“完美”匹配資料,因為那些使結果偏離你的預測的貢獻因素不是你這個有限模型裡面含有的因素所能概括的,硬要打腫臉充胖子只能導致不實際的模型,舉個教科書例子:身高和體重的實際關係近似於一個二階多項式的關係,但大家都知道並不是只有身高才會對體重產生影響,物理世界影響體重的因素太多太多了,有人身材高大卻瘦得跟稻草,有人卻是橫長豎不長。但不可否認的是總體上來說,那些特殊情況越是特殊就越是稀少,呈圍繞最普遍情況(胖瘦適中)的正態分佈,這個分佈就保證了我們的身高——體重相關模型能夠在大多數情況下做出靠譜的預測。但是——剛才說了,特例是存在的,就算不是特例,人有胖瘦,密度也有大小,所以完美符合身高——體重的某個假想的二階多項式關係的人是不存在的,我們又不是歐幾里德幾何世界當中的理想多面體,所以,當我們對人群隨機抽取了 N 個樣本(資料點)試圖對這 N 個數據點擬合出一個多項式的話就得注意,它肯定得是二階多項式,我們要做的只是去根據資料點計算出多項式各項的引數(一個典型的方法就是最小二乘);它肯定不是直線(我們又不是稻草),也不是三階多項式四階多項式.. 如果硬要完美擬合 N 個點,你可能會整出一個 N-1 階多項式來——設想身高和體重的關係是 5 階多項式看看?

3.2 模型比較理論(Model Comparasion)與貝葉斯奧卡姆剃刀(Bayesian Occam’s Razor)

實際上,模型比較就是去比較哪個模型(猜測)更可能隱藏在觀察資料的背後。其基本思想前面已經用拼寫糾正的例子來說明了。我們對使用者實際想輸入的單詞的猜測就是模型,使用者輸錯的單詞就是觀測資料。我們通過:

P(h | D) ∝ P(h) * P(D | h)

來比較哪個模型最為靠譜。前面提到,光靠 P(D | h) (即“似然”)是不夠的,有時候還需要引入 P(h) 這個先驗概率。奧卡姆剃刀就是說 P(h) 較大的模型有較大的優勢,而最大似然則是說最符合觀測資料的(即 P(D | h) 最大的)最有優勢。整個模型比較就是這兩方力量的拉鋸。我們不妨再舉一個簡單的例子來說明這一精神:你隨便找枚硬幣,擲一下,觀察一下結果。好,你觀察到的結果要麼是“正”,要麼是“反”(不,不是少林足球那枚硬幣:P ),不妨假設你觀察到的是“正”。現在你要去根據這個觀測資料推斷這枚硬幣擲出“正”的概率是多大。根據最大似然估計的精神,我們應該猜測這枚硬幣擲出“正”的概率是 1 ,因為這個才是能最大化 P(D | h) 的那個猜測。然而每個人都會大搖其頭——很顯然,你隨機摸出一枚硬幣這枚硬幣居然沒有反面的概率是“不存在的”,我們對一枚隨機硬幣是否一枚有偏硬幣,偏了多少,是有著一個先驗的認識的,這個認識就是絕大多數硬幣都是基本公平的,偏得越多的硬幣越少見(可以用一個 beta 分佈來表達這一先驗概率)。將這個先驗正態分佈 p(θ) (其中 θ 表示硬幣擲出正面的比例,小寫的 p 代表這是概率密度函式)結合到我們的問題中,我們便不是去最大化 P(D | h) ,而是去最大化 P(D | θ) * p(θ) ,顯然 θ = 1 是不行的,因為 P(θ=1) 為 0 ,導致整個乘積也為 0 。實際上,只要對這個式子求一個導數就可以得到最值點。

以上說的是當我們知道先驗概率 P(h) 的時候,光用最大似然是不靠譜的,因為最大似然的猜測可能先驗概率非常小。然而,有些時候,我們對於先驗概率一無所知,只能假設每種猜測的先驗概率是均等的,這個時候就只有用最大似然了。實際上,統計學家和貝葉斯學家有一個有趣的爭論,統計學家說:我們讓資料自己說話。言下之意就是要摒棄先驗概率。而貝葉斯支持者則說:資料會有各種各樣的偏差,而一個靠譜的先驗概率則可以對這些隨機噪音做到健壯。事實證明貝葉斯派勝利了,勝利的關鍵在於所謂先驗概率其實也是經驗統計的結果,譬如為什麼我們會認為絕大多數硬幣是基本公平的?為什麼我們認為大多數人的肥胖適中?為什麼我們認為膚色是種族相關的,而體重則與種族無關?先驗概率裡面的“先驗”並不是指先於一切經驗,而是僅指先於我們“當前”給出的觀測資料而已,在硬幣的例子中先驗指的只是先於我們知道投擲的結果這個經驗,而並非“先天”。

然而,話說回來,有時候我們必須得承認,就算是基於以往的經驗,我們手頭的“先驗”概率還是均勻分佈,這個時候就必須依賴用最大似然,我們用前面留下的一個自然語言二義性問題來說明這一點:

The girl saw the boy with a telescope.

到底是 The girl saw-with-a-telescope the boy 這一語法結構,還是 The girl saw the-boy-with-a-telescope 呢?兩種語法結構的常見程度都差不多(你可能會覺得後一種語法結構的常見程度較低,這是事後偏見,你只需想想 The girl saw the boy with a book 就知道了。當然,實際上從大規模語料統計結果來看後一種語法結構的確稍稍不常見一丁點,但是絕對不足以解釋我們對第一種結構的強烈傾向)。那麼到底為什麼呢?

我們不妨先來看看 MacKay 在書中舉的一個漂亮的例子:

i1

圖中有多少個箱子?特別地,那棵書後面是一個箱子?還是兩個箱子?還是三個箱子?還是.. 你可能會覺得樹後面肯定是一個箱子,但為什麼不是兩個呢?如下圖:

i2

很簡單,你會說:要是真的有兩個箱子那才怪了,怎麼就那麼巧這兩個箱子剛剛好顏色相同,高度相同呢?

用概率論的語言來說,你剛才的話就翻譯為:猜測 h 不成立,因為 P(D | h) 太小(太巧合)了。我們的直覺是:巧合(小概率)事件不會發生。所以當一個猜測(假設)使得我們的觀測結果成為小概率事件的時候,我們就說“才怪呢,哪能那麼巧捏?!”

現在我們可以回到那個自然語言二義性的例子,並給出一個完美的解釋了:如果語法結構是 The girl saw the-boy-with-a-telecope 的話,怎麼那個男孩偏偏手裡拿的就是望遠鏡——一個可以被用來 saw-with 的東東捏?這也忒小概率了吧。他咋就不會拿本書呢?拿什麼都好。怎麼偏偏就拿瞭望遠鏡?所以唯一的解釋是,這個“巧合”背後肯定有它的必然性,這個必然性就是,如果我們將語法結構解釋為 The girl saw-with-a-telescope the boy 的話,就跟資料完美吻合了——既然那個女孩是用某個東西去看這個男孩的,那麼這個東西是一個望遠鏡就完全可以解釋了(不再是小概率事件了)。

自然語言二義性很常見,譬如上文中的一句話:

就有二義性:到底是參見這兩本書的第 12 章,還是僅僅是第二本書的第 12 章呢?如果是這兩本書的第 12 章那就是咄咄怪事了,怎麼恰好兩本書都有第 12 章,都是講同一個問題,更詭異的是,標題還相同呢?

注意,以上做的是似然估計(即只看 P(D | h) 的大小),不含先驗概率。通過這兩個例子,尤其是那個樹後面的箱子的例子我們可以看到,似然估計裡面也蘊含著奧卡姆剃刀:樹後面的箱子數目越多,這個模型就越複雜。單個箱子的模型是最簡單的。似然估計選擇了更簡單的模型。

這個就是所謂的貝葉斯奧卡姆剃刀(Bayesian Occam’s Razor),因為這個剃刀工作在貝葉斯公式的似然(P(D | h) )上,而不是模型本身( P(h) )的先驗概率上,後者是傳統的奧卡姆剃刀。關於貝葉斯奧卡姆剃刀我們再來看一個前面說到的曲線擬合的例子:如果平面上有 N 個點,近似構成一條直線,但絕不精確地位於一條直線上。這時我們既可以用直線來擬合(模型1),也可以用二階多項式(模型2)擬合,也可以用三階多項式(模型3),.. ,特別地,用 N-1 階多項式便能夠保證肯定能完美通過 N 個數據點。那麼,這些可能的模型之中到底哪個是最靠譜的呢?前面提到,一個衡量的依據是奧卡姆剃刀:越是高階的多項式越是繁複和不常見。然而,我們其實並不需要依賴於這個先驗的奧卡姆剃刀,因為有人可能會爭辯說:你怎麼就能說越高階的多項式越不常見呢?我偏偏覺得所有階多項式都是等可能的。好吧,既然如此那我們不妨就扔掉 P(h) 項,看看 P(D | h) 能告訴我們什麼。我們注意到越是高階的多項式,它的軌跡彎曲程度越是大,到了八九階簡直就是直上直下,於是我們不僅要問:一個比如說八階多項式在平面上隨機生成的一堆 N 個點偏偏恰好近似構成一條直線的概率(即 P(D | h) )有多大?太小太小了。反之,如果背後的模型是一條直線,那麼根據該模型生成一堆近似構成直線的點的概率就大得多了。這就是貝葉斯奧卡姆剃刀。

這裡只是提供一個關於貝葉斯奧卡姆剃刀的科普,強調直觀解釋,更多理論公式請參考 MacKay 的著作 《Information Theory : Inference and Learning Algorithms》第 28 章。

3.3 最小描述長度原則

貝葉斯模型比較理論與資訊理論有一個有趣的關聯:

P(h | D) ∝ P(h) * P(D | h)

兩邊求對數,將右式的乘積變成相加:

ln P(h | D) ∝ ln P(h) + ln P(D | h)

顯然,最大化 P(h | D) 也就是最大化 ln P(h | D)。而 ln P(h) + ln P(D | h) 則可以解釋為模型(或者稱“假設”、“猜測”)h 的編碼長度加上在該模型下資料 D 的編碼長度。使這個和最小的模型就是最佳模型。

而究竟如何定義一個模型的編碼長度,以及資料在模型下的編碼長度則是一個問題。更多可參考 Mitchell 的 《Machine Learning》的 6.6 節,或 Mackay 的 28.3 節)

3.4 最優貝葉斯推理

所謂的推理,分為兩個過程,第一步是對觀測資料建立一個模型。第二步則是使用這個模型來推測未知現象發生的概率。我們前面都是講的對於觀測資料給出最靠譜的那個模型。然而很多時候,雖然某個模型是所有模型裡面最靠譜的,但是別的模型也並不是一點機會都沒有。譬如第一個模型在觀測資料下的概率是 0.5 。第二個模型是 0.4 ,第三個是 0.1 。如果我們只想知道對於觀測資料哪個模型最可能,那麼只要取第一個就行了,故事到此結束。然而很多時候我們建立模型是為了推測未知的事情的發生概率,這個時候,三個模型對未知的事情發生的概率都會有自己的預測,僅僅因為某一個模型概率稍大一點就只聽他一個人的就太不民主了。所謂的最優貝葉斯推理就是將三個模型對於未知資料的預測結論加權平均起來(權值就是模型相應的概率)。顯然,這個推理是理論上的制高點,無法再優了,因為它已經把所有可能性都考慮進去了。

只不過實際上我們是基本不會使用這個框架的,因為計算模型可能非常費時間,二來模型空間可能是連續的,即有無窮多個模型(這個時候需要計算模型的概率分佈)。結果還是非常費時間。所以這個被看作是一個理論基準。

4. 無處不在的貝葉斯

以下我們再舉一些實際例子來說明貝葉斯方法被運用的普遍性,這裡主要集中在機器學習方面,因為我不是學經濟的,否則還可以找到一堆經濟學的例子。

4.1 中文分詞

貝葉斯是機器學習的核心方法之一。比如中文分詞領域就用到了貝葉斯。Google 研究員吳軍在《數學之美》系列中就有一篇是介紹中文分詞的,這裡只介紹一下核心的思想,不做贅述,詳細請參考吳軍的文章(這裡)。

分詞問題的描述為:給定一個句子(字串),如:

南京市長江大橋

如何對這個句子進行分詞(詞串)才是最靠譜的。例如:

1. 南京市/長江大橋

2. 南京/市長/江大橋

這兩個分詞,到底哪個更靠譜呢?

我們用貝葉斯公式來形式化地描述這個問題,令 X 為字串(句子),Y 為詞串(一種特定的分詞假設)。我們就是需要尋找使得 P(Y|X) 最大的 Y ,使用一次貝葉斯可得:

P(Y|X) ∝ P(Y)*P(X|Y)

用自然語言來說就是 這種分詞方式(詞串)的可能性 乘以 這個詞串生成我們的句子的可能性。我們進一步容易看到:可以近似地將 P(X|Y) 看作是恆等於 1 的,因為任意假想的一種分詞方式之下生成我們的句子總是精準地生成的(只需把分詞之間的分界符號扔掉即可)。於是,我們就變成了去最大化 P(Y) ,也就是尋找一種分詞使得這個詞串(句子)的概率最大化。而如何計算一個詞串:

W1, W2, W3, W4 ..

的可能性呢?我們知道,根據聯合概率的公式展開:P(W1, W2, W3, W4 ..) = P(W1) * P(W2|W1) * P(W3|W2, W1) * P(W4|W1,W2,W3) * .. 於是我們可以通過一系列的條件概率(右式)的乘積來求整個聯合概率。然而不幸的是隨著條件數目的增加(P(Wn|Wn-1,Wn-2,..,W1) 的條件有 n-1 個),資料稀疏問題也會越來越嚴重,即便語料庫再大也無法統計出一個靠譜的 P(Wn|Wn-1,Wn-2,..,W1) 來。為了緩解這個問題,電腦科學家們一如既往地使用了“天真”假設:我們假設句子中一個詞的出現概率只依賴於它前面的有限的 k 個詞(k 一般不超過 3,如果只依賴於前面的一個詞,就是2元語言模型(2-gram),同理有 3-gram 、 4-gram 等),這個就是所謂的“有限地平線”假設。雖然這個假設很傻很天真,但結果卻表明它的結果往往是很好很強大的,後面要提到的樸素貝葉斯方法使用的假設跟這個精神上是完全一致的,我們會解釋為什麼像這樣一個天真的假設能夠得到強大的結果。目前我們只要知道,有了這個假設,剛才那個乘積就可以改寫成: P(W1) * P(W2|W1) * P(W3|W2) * P(W4|W3) .. (假設每個詞只依賴於它前面的一個詞)。而統計 P(W2|W1) 就不再受到資料稀疏問題的困擾了。對於我們上面提到的例子“南京市長江大橋”,如果按照自左到右的貪婪方法分詞的話,結果就成了“南京市長/江大橋”。但如果按照貝葉斯分詞的話(假設使用 3-gram),由於“南京市長”和“江大橋”在語料庫中一起出現的頻率為 0 ,這個整句的概率便會被判定為 0 。 從而使得“南京市/長江大橋”這一分詞方式勝出。

一點註記:有人可能會疑惑,難道我們人類也是基於這些天真的假設來進行推理的?不是的。事實上,統計機器學習方法所統計的東西往往處於相當表層(shallow)的層面,在這個層面機器學習只能看到一些非常表面的現象,有一點科學研究的理念的人都知道:越是往表層去,世界就越是繁複多變。從機器學習的角度來說,特徵(feature)就越多,成百上千維度都是可能的。特徵一多,好了,高維詛咒就產生了,資料就稀疏得要命,不夠用了。而我們人類的觀察水平顯然比機器學習的觀察水平要更深入一些,為了避免資料稀疏我們不斷地發明各種裝置(最典型就是顯微鏡),來幫助我們直接深入到更深層的事物層面去觀察更本質的聯絡,而不是在淺層對錶面現象作統計歸納。舉一個簡單的例子,通過對大規模語料庫的統計,機器學習可能會發現這樣一個規律:所有的“他”都是不會穿 bra 的,所有的“她”則都是穿的。然而,作為一個男人,卻完全無需進行任何統計學習,因為深層的規律就決定了我們根本不會去穿 bra 。至於機器學習能不能完成後者(像人類那樣的)這個推理,則是人工智慧領域的經典問題。至少在那之前,聲稱統計學習方法能夠終結科學研究原文)的說法是純粹外行人說的話

4.2 統計機器翻譯

統計機器翻譯因為其簡單,自動(無需手動新增規則),迅速成為了機器翻譯的事實標準。而統計機器翻譯的核心演算法也是使用的貝葉斯方法。

問題是什麼?統計機器翻譯的問題可以描述為:給定一個句子 e ,它的可能的外文翻譯 f 中哪個是最靠譜的。即我們需要計算:P(f|e) 。一旦出現條件概率貝葉斯總是挺身而出:

P(f|e) ∝ P(f) * P(e|f)

這個式子的右端很容易解釋:那些先驗概率較高,並且更可能生成句子 e 的外文句子 f 將會勝出。我們只需簡單統計(結合上面提到的 N-Gram 語言模型)就可以統計任意一個外文句子 f 的出現概率。然而 P(e|f) 卻不是那麼好求的,給定一個候選的外文局子 f ,它生成(或對應)句子 e 的概率是多大呢?我們需要定義什麼叫 “對應”,這裡需要用到一個分詞對齊的平行語料庫,有興趣的可以參考 《Foundations of Statistical Natural Language Processing》第 13 章,這裡摘選其中的一個例子:假設 e 為:John loves Mary 。我們需要考察的首選 f 是:Jean aime Marie (法文)。我們需要求出 P(e|f) 是多大,為此我們考慮 e 和 f 有多少種對齊的可能性,如:

John (Jean) loves (aime) Marie (Mary)

就是其中的一種(最靠譜的)對齊,為什麼要對齊,是因為一旦對齊了之後,就可以容易地計算在這個對齊之下的 P(e|f) 是多大,只需計算:

P(John|Jean) * P(loves|aime) * P(Marie|Mary)

即可。

然後我們遍歷所有的對齊方式,並將每種對齊方式之下的翻譯概率 ∑ 求和。便可以獲得整個的 P(e|f) 是多大。

一點註記:還是那個問題:難道我們人類真的是用這種方式進行翻譯的?highly unlikely 。這種計算複雜性非常高的東西連三位數乘法都搞不定的我們才不會笨到去使用呢。根據認知神經科學的認識,很可能我們是先從句子到語義(一個逐層往上(bottom-up)抽象的 folding 過程),然後從語義根據另一門語言的語法展開為另一門語言(一個逐層往下(top-down)的具體化 unfolding 過程)。如何可計算地實現這個過程,目前仍然是個難題。(我們看到很多地方都有 bottom-up/top-down 這樣一個對稱的過程,實際上有人猜測這正是生物神經網路原則上的運作方式,對視覺神經系統的研究尤其證明了這一點,Hawkins 在 《On Intelligence》 裡面提出了一種 HTM (Hierarchical Temporal Memory)模型正是使用了這個原則。)

4.3 貝葉斯影象識別,Analysis by Synthesis

貝葉斯方法是一個非常 general 的推理框架。其核心理念可以描述成:Analysis by Synthesis (通過合成來分析)。06 年的認知科學新進展上有一篇 paper 就是講用貝葉斯推理來解釋視覺識別的,一圖勝千言,下圖就是摘自這篇 paper :

i3

首先是視覺系統提取圖形的邊角特徵,然後使用這些特徵自底向上地啟用高層的抽象概念(比如是 E 還是 F 還是等號),然後使用一個自頂向下的驗證來比較到底哪個概念最佳地解釋了觀察到的影象。

4.4  EM 演算法與基於模型的聚類

聚類是一種無指導的機器學習問題,問題描述:給你一堆資料點,讓你將它們最靠譜地分成一堆一堆的。聚類演算法很多,不同的演算法適應於不同的問題,這裡僅介紹一個基於模型的聚類,該聚類演算法對資料點的假設是,這些資料點分別是圍繞 K 個核心的 K 個正態分佈源所隨機生成的,使用 Han JiaWei 的《Data Ming: Concepts and Techniques》中的圖:

i4

圖中有兩個正態分佈核心,生成了大致兩堆點。我們的聚類演算法就是需要根據給出來的那些點,算出這兩個正態分佈的核心在什麼位置,以及分佈的引數是多少。這很明顯又是一個貝葉斯問題,但這次不同的是,答案是連續的且有無窮多種可能性,更糟的是,只有當我們知道了哪些點屬於同一個正態分佈圈的時候才能夠對這個分佈的引數作出靠譜的預測,現在兩堆點混在一塊我們又不知道哪些點屬於第一個正態分佈,哪些屬於第二個。反過來,只有當我們對分佈的引數作出了靠譜的預測時候,才能知道到底哪些點屬於第一個分佈,那些點屬於第二個分佈。這就成了一個先有雞還是先有蛋的問題了。為了解決這個迴圈依賴,總有一方要先打破僵局,說,不管了,我先隨便整一個值出來,看你怎麼變,然後我再根據你的變化調整我的變化,然後如此迭代著不斷互相推導,最終收斂到一個解。這就是 EM 演算法。

EM 的意思是“Expectation-Maximazation”,在這個聚類問題裡面,我們是先隨便猜一下這兩個正態分佈的引數:如核心在什麼地方,方差是多少。然後計算出每個資料點更可能屬於第一個還是第二個正態分佈圈,這個是屬於 Expectation 一步。有了每個資料點的歸屬,我們就可以根據屬於第一個分佈的資料點來重新評估第一個分佈的引數(從蛋再回到雞),這個是 Maximazation 。如此往復,直到引數基本不再發生變化為止。這個迭代收斂過程中的貝葉斯方法在第二步,根據資料點求分佈的引數上面。

4.5 最大似然與最小二乘

i5

學過線性代數的大概都知道經典的最小二乘方法來做線性迴歸。問題描述是:給定平面上 N 個點,(這裡不妨假設我們想用一條直線來擬合這些點——迴歸可以看作是擬合的特例,即允許誤差的擬合),找出一條最佳描述了這些點的直線。

一個接踵而來的問題就是,我們如何定義最佳?我們設每個點的座標為 (Xi, Yi) 。如果直線為 y = f(x) 。那麼 (Xi, Yi) 跟直線對這個點的“預測”:(Xi, f(Xi)) 就相差了一個 ΔYi = |Yi – f(Xi)| 。最小二乘就是說尋找直線使得 (ΔY1)^2 + (ΔY2)^2 + .. (即誤差的平方和)最小,至於為什麼是誤差的平方和而不是誤差的絕對值和,統計學上也沒有什麼好的解釋。然而貝葉斯方法卻能對此提供一個完美的解釋。

我們假設直線對於座標 Xi 給出的預測 f(Xi) 是最靠譜的預測,所有縱座標偏離 f(Xi) 的那些資料點都含有噪音,是噪音使得它們偏離了完美的一條直線,一個合理的假設就是偏離路線越遠的概率越小,具體小多少,可以用一個正態分佈曲線來模擬,這個分佈曲線以直線對 Xi 給出的預測 f(Xi) 為中心,實際縱座標為 Yi 的點 (Xi, Yi) 發生的概率就正比於 EXP[-(ΔYi)^2]。(EXP(..) 代表以常數 e 為底的多少次方)。

相關推薦

樸素分類演算法簡單理解

樸素貝葉斯分類演算法簡單理解 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。這篇文章我儘可能用直白的話語總結一下我們學習會上講到的樸素貝葉斯分類演算法,希望有利於他人理解。 1

分類與監督學習,樸素分類演算法

1.理解分類與監督學習、聚類與無監督學習。 簡述分類與聚類的聯絡與區別。 簡述什麼是監督學習與無監督學習。 區別:分類:我們是知道這個資料集是有多少種類的,然後對它們分類歸納。比如對一個學校的在校大學生進行性別分類,我們會下意識很清楚知道分為“男”,“女”。 聚類:對資料集操作時,我們是不

機器學習--樸素分類演算法學習筆記

一、基於貝葉斯決策理論的分類方法 優點:在資料較少的情況下仍然有效,可以處理多類別問題。 缺點:對於輸入資料的準備方式較為敏感。 適用資料型別:標稱型資料。 現在假設有一個數據集,它由兩類資料構

基於樸素分類演算法實現垃圾郵箱分類

貝葉斯決策理論 在機器學習中,樸素貝葉斯是基於貝葉斯決策 的一種簡單形式,下面給出貝葉斯的基本公式,也是最重要的公式: 其中X是一個m*n的矩陣,m為他的樣本數,n為特徵的個數,即我們要求的是:在已知的樣本情況下的條件概率。 )表示

樸素分類演算法python實現

1 #==================================== 2 # 輸入: 3 # 空 4 # 輸出: 5 # postingList: 文件列表 6 # classVec: 分類標籤列表 7 #===

樸素分類演算法

概率論只不過是把常識用數學公式表達了出來。 ——拉普拉斯 記得讀本科的時候,最喜歡到城裡的計算機書店裡面去閒逛,一逛就是好幾個小時;有一次,在書店看到一本書,名叫貝葉斯方法。當時數學系的課程還沒有學到概率統計。我心想,一個方法能夠專門寫出一本書來,肯定很牛逼。

樸素分類演算法原理

目錄 概述 原理 要點 1、概述 樸素貝葉斯分類演算法是貝葉斯分類演算法中最簡單的一種,貝葉斯分類演算法以樣本可能屬於某類的概率來作為分類依據。貝葉斯分類演算法是一大類分類演算法的總稱。 2、原理 如果一個事物在一些屬性條件發生的情況下,事物屬於A的概率大於

公式和樸素分類演算法

先上問題吧,我們統計了14天的氣象資料(指標包括outlook,temperature,humidity,windy),並已知這些天氣是否打球(play)。如果給出新一天的氣象指標資料:sunny,cool,high,TRUE,判斷一下會不會去打球。 table 1 outlook temperat

《機器學習實戰》基於樸素分類演算法構建文字分類器的Python實現

Python程式碼實現:#encoding:utf-8 from numpy import * #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my','dog','has','flea','problems','help','please'],

樸素分類演算法Python程式碼

貝葉斯分類器就是求P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn) 最大值,由於 P(F1F2...Fn) 對於所有的類別都是相同的,可以省略,問題就變成了求 P(F1F2...Fn|C)P(C) 的最大值。 樸素貝葉斯分類

樸素分類演算法的R語言實現

貝葉斯分類常用來預測隸屬關係,計算一個給定元組屬於某一類的概率 首先我們來看下貝葉斯基本公式: P(B|A)的意思是在A事件的情況下,發生B事件的概率,可以理解為概率論中的條件概率,而貝葉斯公式的巨大作用就是對因果關係進行了交換,通過上面的公式就可以計算P(A|B

樸素分類演算法理解及文字分類器實現

貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本文作為分類演算法的第一篇,將首先介紹分類問題,對分類問題進行一個正式的定義。然後,介紹貝葉斯分類演算法的基礎——貝葉斯定理。最後,通過例項討論貝葉斯分類中最簡單的一種:樸素貝葉斯分類。

樸素分類演算法的Python實現

貝葉斯分類演算法以貝葉斯定理為基礎,通過先驗概率計算後驗概率,再由最大厚顏概率決定分類(同學們還是當沒看到過這句話吧)。 數學學得不咋地,就多說了,實驗報告怎麼寫也是頭疼,就直接貼程式碼了。 # 訓

帶你搞懂樸素分類演算法

帶你搞懂樸素貝葉斯分類算 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。這篇文章我儘可能用直白的話語總結一下我們學習會上講到的樸素貝葉斯分類演算法,希望有利於他人理解。 1  分類問題綜述

《機器學習實戰》學習筆記:樸素分類演算法

貝葉斯決策理論 選擇高概率對應的類別是貝葉斯決策理論的核心思想,即選擇具有最高概率的決策。 樸素貝葉斯 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法  。最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Nai

樸素分類演算法做中文文字分類

一. 樸素貝葉斯分類演算法的原理 樸素貝葉斯分類器基於屬性條件獨立假設:對於已知類別,假設所有屬性相互獨立,也就是說,假設每個屬性獨立地對分類結果產生影響。 設待分類的樣本屬性集為TT,其中包含nn個屬性,分別為t1,t2,t3...tnt1,t2,t3..

【JAVA實現】樸素分類演算法

       之前部落格提到的KNN演算法以及決策樹演算法都是要求分類器給出“該資料例項屬於哪一類”這類問題的明確答案,正因為如此,才出現了使用決策樹分類時,有時無法判定某一測試例項屬於哪一類別。使用樸素貝葉斯演算法則可以避免這個問題,它給出了這個例項屬於某一類別的概率值,

第五篇:樸素分類演算法原理分析與程式碼實現

1 #==================================== 2 # 輸入: 3 # 空 4 # 輸出: 5 # postingList: 文件列表 6 # classVec: 分類標籤列表 7 #=

樸素分類演算法-----java

classvalue的概率:     unacc         acc         good    vgood 0.73333335    0.23037037    0.017037038    0.01925926     -------------------------------------

詳解樸素分類演算法

帶你搞懂樸素貝葉斯分類演算法 帶你搞懂樸素貝葉斯分類算 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。這篇文章我儘可能用直白的話語總結一下我們學習會上講到的樸