樸素貝葉斯分類器

2022-09-15 08:51:14 字數 3116 閱讀 9311

樸素貝葉斯分類器是用來做分類的乙個簡便方法。在貝葉斯公式的基礎上,引人條件獨立的假設,使得貝葉斯分類器具有簡單易行的優點和假設時常與實際不符的缺點。下面簡單介紹一下樸素貝葉斯分類器。

首先規定一下資料格式:輸入的每乙個樣本為$^},^}$,其中:$i$為樣本編號,$x$為樣本的特徵,是乙個$n$維向量,$^}=^,x_^,\cdots ,x_^]}^}$(先假設$x_^(j=1,\cdots ,n)$是離散型變數);$c$為樣本類別,$^}\in \$表示共有$k$個類別。

分類問題需要對輸入的樣本$x$給出乙個樣本類別$c$。樸素貝葉斯方法採用「軟指定」的方式,對於樣本$x$給出其屬於每乙個類別的概率,採用概率最大的類別作為**類別。也就是說,對於樣本$x$,需要分別計算$p(c=1|x),p(c=2|x),\cdots ,p(c=k|x)$,找到取值最大的即可。

作為乙個「生成式」模型,樸素貝葉斯方法並不是對$p(c|x)$直接建模的,而是對$p(x|c)$和$p(c)$建模。根據貝葉斯公式:

$$p(c|x)=\frac$$

顯然,$p(c|x)$取值最大,只需要$p(x|c)p(c)$最大即可,現在看看$p(x|c)$和$p(c)$怎麼計算。

$p(c)$很好辦,就是樣本類別的先驗概率,可以事先指定,也可以和容易的根據樣本估計出來。問題是$p(x|c)$,因為$x$是乙個$n$維向量,所以$p(x|c)$就是乙個$n$個變數的聯合分布,這就很不好計算,假設每一維都有$l$個可能取值(假設每一維是離散變數),那麼光$p(x|c)$就有$k*^}$個取值($c$有$k$個,$x$有$^}$個),也就是說要估計這麼多個引數,當資料維度比較大,也就是$n$比較大時,引數個數就太多了,沒法估計。

為了解決這個問題,樸素貝葉斯方法做了乙個很強的假設,即樣本$x$的各個維度之間在類別條件下是相互獨立的:

$$p(x|c)=p(_}|c)*p(_}|c)*\cdots *p(_}|c)$$

原來的聯合概率現在變成了多個獨立分布的乘積,這就簡化了問題。現在不需要直接估計$p(x|c)$,而分布估計$p(_}|c),\cdots ,p(_}|c)$,引數的個數變為$k*l*n$比原來少了許多,估計引數也比較可行。

當然,實際中,這個假設好多時候是不成立的,這是樸素貝葉斯方法的弊端,比如根據身高和體重估計乙個人的性別,用樸素貝葉斯方法就不合適了,因為身高和體重顯然不是獨立的,但如果根據頭髮長短和體重作為特徵,樸素貝葉斯方法就大概就可以用了,體重和頭髮長短沒有關係吧~當然你可以根據某人體重6.5斤推出他是嬰兒進一步推出他頭髮很短。。。呵呵,好冷~

接下來就是具體估計這些引數,寫出似然函式最大化求解即可。推導過程不寫了,直接給出結果。

引數估計的結果和直覺很符合,以上面根據身高和頭髮長短判斷性別為例,假設頭髮長短離散化為長、中、短三個取值,而身高是連續變數,用$\text$表示。需要估計的引數有先驗概率 $p(boy),p(girl)$,類條件概率$p(hair=long|boy)$ ,$p(hair=mid|boy)$,$p(hair=short|boy)$,$p(hari=long|girl)$,$p(hari=mid|girl)$$p(hari=short|girl)$以及$p(height=h|boy)$,$p(height=h|girl)$。

先驗概率$p(c)$的估計結果就是每個類別在樣本中佔的比例,100個人裡有54個男,46個女,那麼$p(boy)=0.54$,$p(girl)=0.46$。類條件概率$p(_}|c)$ 的估計結果也很直接,就是特徵的不同取值在給定類別的樣本中的比例,比如54個男人中有6個長髮,13個中發,35個短髮,那麼$p(hair=long|boy)\text/\;$,$p(hair=mid|boy)\text/\;$,$p(hair=short|boy)\text/\;$,其他引數也是類似的結果,這些結果跟直覺很符合,簡單易記憶。

對身高,由於是連續變數,所以一般將其建模為正態分佈變數(也可以根據需要弄成別的分布),根據樣本估計出各個類別下的身高均值和方差就可以了,然後套用正太分布的概率密度公式計算$p(h|boy)$和$p(h|girl)$。

引數計算完成後,樸素貝葉斯分類器的模型就完整了。接下來,對於乙個新的輸入$x=165,hair=long]}^}}$,就可以計算出$p(boy|x\text\propto p(165|boy)p(long|boy)p(boy)$和$p(girl|x\text\propto p(165|girl)p(long|girl)p(girl)$,哪個結果大,就判別為屬於哪一類了。

另外,實際應用中,為避免0概率,需要做平滑處理,常用拉普拉斯平滑。如果54個男生中沒有長髮的,那麼直接計算就回導致引數的估計值$p(hair=long|boy)\text$,這將導致$p(x|boy)\textp(height|boy)p(hair|boy)\text0$,那麼$p(boy|x)\text\frac\text0$ 也就是說,如果樣本中沒有長髮男生,那麼看到乙個長髮的人時,就一口咬定「他」不是男的,毫不留情,這當然是比較「暴力武斷」的。

而$\begin p(boy|x)&=\frac \\ & =\fracp(x|girl)p(girl)} \\\end$

因為同樣的理由,值為0的引數估計也會導致$p(x|girl)p(girl)\text$,那麼上式計算過程中就會出現$\frac}$的尷尬情況。所以無論是從計算角度還是實際意義來講,引數值為0的估計都是很討厭的。

拉普拉斯平滑是一種簡單的處理類概率的方法,思想很簡單,對每個對應類別的資料加一後重新估計概率。比如要估計$p(hair=long|boy)$,這時候就要對原來男生中長髮人數加1表示男生中長髮人數,公平起見也要對男生中中發和短髮的人數加1。假設男生中有$p$個長髮的,那麼$p(hair=long|boy)\text\frac1}1\text1\text1}$,這樣,即使真的沒有長髮男生,也不會搞出引數為0的估計結果。另外,拉普拉斯修正不會破壞概率和為1的性質,即$p(hari=long|boy)+p(hair=mid|boy)+p(hair=short|boy)\text$,簡單又挺合理。當然也有其他的平滑處理方法,比如吳軍的《數學之美》中提到古德—圖靈方法,有興趣的可以翻閱。

附:r中樸素貝葉斯方法

可以看出,樸素貝葉斯方法的實現沒多大難度,即使這樣,r包中還是提供了一些實現。

e1071包中的*****bayes()提供了乙個實現,klar包在e1071的基礎上提供了另乙個實現,提供了更多選項。

參考資料

[2]《數學之美》,吳軍,人民郵電出版社,2012.6

[3]乙個很直觀的示例

樸素貝葉斯分類器

p a b frac 類別 結果 a出現在特徵b樣本裡的概率 frac 假設乙個學校裡有60 男生和40 女生。女生穿褲子的人數和穿裙子的人數相等,所有男生穿褲子。隨機看到了乙個穿褲子的學生,那麼這個學生是女生的概率是多少?begin 特徵 穿褲子 類別 女生 p 女生 穿褲子 frac frac ...

樸素貝葉斯分類器

所謂 條件概率 conditional probability 就是指在事件b發生的情況下,事件a發生的概率,用p a b 來表示。根據文氏圖,可以發現 同理可得,所以,即 其中,p a 稱為 先驗概率 prior probability 即在b事件發生之前,我們對a事件概率的乙個判斷 p a b ...

樸素貝葉斯分類器初探

從期末複習開始頹廢了有一陣 開始接觸機器學習,今天讀了一些部落格 整理一下思路 主要是自己的理解 所以可能沒那麼準確 首先分類器指的是根據乙個事物的一些特徵來判斷事物的類別。對於乙個事物x有類別,那麼對於類別集中最大的p yi x 可以認為x即為yi。所以需要算出每乙個p yi x 但是這很難直接算...