今天是2020年2月4日星期二,全國確診人數達到了20471例,確診人數從一萬例到兩萬例,只用了三天啊,疫情比想象的嚴重的多啊。影響程度早早超過了非典,普天盛世之下的堂堂中華,也會爆出如此疫情,人類還是弱小,微生物才是地球的主宰啊。
看了一下樸素貝葉斯演算法,這次的深入學習,發現了許多之前學習忽略的地方,在這裡先簡單敘述下感想。看了很多資料講樸素貝葉斯是生成模型,那就有必要和判別模型做一下對比,通常說判別模型,它是通過“輸入特徵x”直接學習“輸出y”,也就是直接學習輸出y和特徵x之間的對映關係。比如說判斷來診人員A是否需要輸液,k近鄰演算法僅僅根據來診人員A的輸入特徵和哪幾個最近鄰節點的特徵相似,直接多數表決判斷A的類別是否需要輸液。(這裡用k近鄰演算法作為例子,有點不妥,因為k近鄰沒有顯式的學習過程,決策樹章節再分析這個問題)。
樸素貝葉斯作為生成模型的代表,需要先找到輸入特徵x與輸出y的聯合概率分佈,也就是生成一對資料(x,y)的方式。再計算y在輸入特徵x的條件下的出現概率,比較不同類別y的大小,哪個類別的y大,未知資料就屬於哪個類別。這裡首先要解決聯合概率分佈是什麼,接下來是條件分佈,最後執果索因是什麼,也就是怎樣理解結果對原因產生影響,解決了這三個問題,相信就能夠對生成模型,有一個大概的瞭解。
在正式開始吃李航老師的書本內容前,先解決一下概率知識上的盲點。這部分內容僅作參考,因為概率課是水過的…數學二也沒有考概率,只是在學習機器學習前簡單看了下概率…
我們用P(A)記為事件A發生的概率,P(A∩B)記為事件A和事件B同時發生的概率,稱為聯合概率,P(A|B)記為在事件B發生的前提下,事件A發生的條件概率。這裡的事件A和B不一定具有因果或者先後序列關係。通常我們在描述某個事件發生的概率的時候,其實總是預設了該事件所在的樣本空間,現在我們需要重新理解一下這個概念,樣本空間是一個實驗或隨機試驗所有可能結果的集合(樣本空間的任何一個子集都被稱為一個事件)。我們說P(A)是事件A發生的概率,不能離開事件A所處的樣本空間,如維恩圖中藍色框部分,事件A的概率P(A)其實是指在樣本空間Ω中,事件A部分佔樣本空間Ω的比率。
在樣本空間Ω下,事件A和事件B同時發生的聯合概率P(A∩B)也就是圖中A∩B部分佔樣本空間Ω的比率。來看一下條件概率P(A|B),也就是在事件B發生的前提下,事件A發生的概率,P(A|B)與P(A)的區別在哪裡?很明顯,是條件事件B。在維恩圖中怎麼理解呢?前文提到了樣本空間,這裡的重點就在於樣本空間的變化。在P(A)中,指的是A部分佔樣本空間Ω的比率;在P(A|B)中,有了一個前提,需要事件B先發生,也就是排除了原來樣本空間Ω中B部分以外的區域。換句話說,條件的存在意味著樣本空間的縮小,那麼P(A|B)也就是A∩B部分(事件A、B同時發生,包含了事件A發生)佔新的樣本空間B的比率。P(A)與P(A|B),除了樣本空間的變化,是否存在定量關係呢?這裡我們用公式看一下比率關係,用sizeA表示維恩圖中A所在部分。
可以得到:
哎,這就有意思了。通過公式的定量表示,我們可以看到事件A在附加了條件下,也就是樣本空間縮小的情況下,P(A)與P(A|B)存在一種定量關係。這裡大膽的把這個定量關係作為附加條件B之後的調整因子。其實這就是貝葉斯公式,只是換了一個角度進行理解,一千個讀者一千個哈姆雷特。
在貝葉斯公式中,P(A)稱為先驗概率,P(A|B)稱為後驗概率。我的理解是這樣,先驗概率P(A)是在事件B發生之前,對A事件的一個判斷,一般來說是我們對資料所在領域的歷史經驗或者常識,這個經驗或者常識對該事件發生的概率難以量化,但我們可以對它進行假設;後驗概率P(A|B),是事件B發生之後,對事件A發生概率的重新評估。後驗概率也就可以理解成:後驗概率=先驗概率×調整因子,通過調整因子,讓預估概率更接近真實概率。
寫到這裡,大概可以對聯合概率、條件概率、貝葉斯公式有個簡單的理解了,但是好像還沒有扯到生成模型什麼事,這就來扯一扯。
在我的理解裡,該演算法需要拋棄判別模型中的“對映”思路。就是說要理解素樸貝葉斯演算法,需要先丟掉“給出一個什麼樣的輸入特徵向量x,模型可以得到什麼樣的輸出結果y”這個直接判別的對映想法。說樸素貝葉斯演算法是生成模型,實際上就是在判斷新的輸入例項x具體類別時,要通過訓練資料集中(x,y1)、(x,y2)這種具體組合在資料集中出現的概率,結合條件概率再去判斷x的類別是y1,還是y2的哪種可能性大。在上邊的一堆公式中,可以看到貝葉斯公式(7)的得來,依賴於公式(3)中的事件A和事件B同時出現的聯合概率。換句話說,我們要判斷新的輸入例項x的類別,資料集中的類別分別為y1、y2,類別y有自己的分佈規律。例如服從P(y1)=0.8、P(y2)=0.2的二項分佈,簡單來說,我們看到是y1的概率這麼大,直接把x的類別判斷為y1就是了。但貝葉斯不是這麼做的,因為每個例項x是不一樣的(例項x可能的情況有自己的分佈)。我們是不是可以根據x在已經確定的情況下,再去判斷類別y的條件概率呢?這就意味著樣本空間的縮小,在有條件的情況下,再去判斷y的類別,肯定要比什麼都不知道的情況做判斷要準確。也就是我們要找到x,y各個單獨事件的組合事件(x,y1)、(x,y2)在資料集中的分佈,用來調整類別y的先驗概率,得到有條件下的後驗結果。
GitHub:https://github.com/wangzycloud/statistical-learning-method
樸素貝葉斯演算法
引入
前邊說了一大堆亂七八糟的東西,形式化來講,樸素貝葉斯演算法是基於貝葉斯定理和特徵條件假設的分類方法。對於給定的訓練資料集,首先是利用特徵條件獨立假設,學習輸入輸出的聯合概率分佈。然後基於該模型,對給定的輸入例項x,利用貝葉斯定理求出後驗概率最大的輸出類別y。本節有不少耐看的公式,第一次耐心看懂,之後就沒這麼晦澀了,接下來按照書中的順序記錄一下,包括樸素貝葉斯法的基本方法、後驗概率最大化的含義、引數估計和樸素貝葉斯演算法。
基本方法
首先是模型輸入、輸出情況的說明,輸入資料用n維特徵向量表示,這裡注意一下訓練資料集T,資料集T內的資料是由是由事件x,y同時發生的聯合概率分佈產生。
實際上,學習到了聯合概率分佈P(X,Y),也就是學習到了生成一個資料(xn+1,yn+1)的方式,這就要我們把輸入例項xn+1和相應輸出類別yn+1當成一個整體來對待。接下來看一下條件概率分佈,我們知道輸入特徵向量不是一個單獨的數值,而是一系列特徵分量構成的向量,並且每個分量有不同的取值範圍,公式(4.2)反映了這一事實,這就影響到我們對聯合概率的求解。每個分量有不同的取值,不同取值的x與類別y構成同時發生的聯合事件,各個分量的排列組合結果是一個非常大的數字,直接根據樣本出現的頻率來估計引數是一個非常困難的事情。假如樣本的n個屬性都是二值的,則樣本空間將有2的n次方種可能的取值,在現實中,這個種類數往往大於訓練樣本,一些可能的取值在訓練集中並不會出現。
這裡我們看一下條件獨立性假設,實際上就是說,我們強行認為特徵向量x的各個分量之間是獨立的,相互之間不能有影響,就算有影響,我們也不考慮進來。也就是假設每個分量屬性獨立的對分類結果產生影響,這是一個很強的假設,通過這個假設,引數求解變得可行,這也是樸素貝葉斯“樸素”的由來。其中,需要估計的引數數量大大減少:
由此,我們可以將各個分量看作生成資料的不同階段,應用乘法公式得到公式(4.3),也就是各獨立變數的聯合分佈=各獨立變數先驗概率的乘積。文中提到的條件獨立性這一假設,使得樸素貝葉斯法變得簡單,但會犧牲一定的分類準確性。
在有了聯合概率、條件概率、獨立性假設的前提下,在應用公式(4.4)-公式(4.6)後,可以得到最終的樸素貝葉斯分類器,即公式(4.7)。
後驗概率最大化
該部分從期望風險最小化的角度,闡述樸素貝葉斯的原理,也就是為什麼輸出y的分類要取後驗概率最大的類。這裡存疑,開學後搞起~已找到合適資料,到實驗室整理出來就好了。
樸素貝葉斯法的引數估計
先驗概率P(Y)表示了樣本空間中事件Y各個類別所佔的比例,根據大數定律,當訓練集包含足夠多的樣本時,P(Y)可以通過各事件出現的頻率來估計。
對於各獨立變數的條件概率引數,也是通過極大似然估計得出。
貝葉斯演算法
演算法流程圖:
貝葉斯估計
通過極大似然估計法,我們計算出了該資料集內輸入特徵x各個屬性獨立性假設下的條件概率。而如果待預測例項的某個屬性值沒有在訓練集中出現過,根據公式(4.9)計算條件概率就會出現概率值為0的情況。無論該例項的屬性如何,根據連乘公式,最終的類別概率都為0,無法做出判斷。針對這種情況怎麼避免呢?對分母分子進行修正,這就是貝葉斯估計(實際上就是分子分母同時加上一個常數,避免0的情況)。
理解貝葉斯的一個小例子
醫院裡出現了一例尚未確診的肺炎患者(疑似狀態),猜測他被感染的原因可能是:
(1) 華南海鮮市場吃過海鮮
(2) 去武漢旅行剛回來
(3) 同其它患者密切接觸過
根據其它人的確診結果,我們知道如果去海鮮市場吃過海鮮,有70%機率會確診;去武漢旅行的人有60%的機率確診;同其它患者密切接觸過的話,有50%的機率確診。現在他昏迷了,根據他體溫及肺部CT病症嚴重程度,猜測這三種原因的可能性概率分別為50%、30%、20%。那麼,如果現在核酸試劑結果為陽性,被確診了。在已知確診的條件下,考慮是哪種原因造成了感染?
由全概率公式,我們可以得到確診、疑似的概率分別是:
由貝葉斯公式,在確診的條件下,三種可能性的大小被調整為:
在已經確診的條件下,比較三者的後驗概率,可以得到該患者因吃海鮮被感染的可能性最大。執果索因,簡單講就是將結果考慮到發生原因的評估上,對前期評估進行調整。