1. 程式人生 > >機器學習之實戰樸素貝葉斯演算法

機器學習之實戰樸素貝葉斯演算法

貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類,而樸素貝葉斯分類可謂是裡面最簡單、入門的一種。

首先關於貝葉斯定理,感覺簡單而偉大,前些天一直在看吳軍的數學之美(沒看過的極力推薦)系列文章,看到自然語言處理從規則模型到統計模型轉變的時候,語言的識別準確率上升好幾個等級,以至於今天的語言識別到達很強大的地步,同時對於搜尋引擎,網頁搜尋的準確率,也上升好多。這其中的最最重要的就是使用了貝葉斯準則,運用一種統計學的概念,將識別搜尋的結果可能性最大化。由此我聯想到當今的影象識別領域,其實和自然語言處理一樣(當然實現上較之複雜多),現在的感覺就和當初自然語言的規則模型一樣,受到條條框框的限制,那麼影象識別為什麼不也弄一個統計識別模型來呢?貝葉斯定理實現的關鍵是需要歷史,需要樣本,需要基礎來訓練,語言識別有非常多的語料庫正好可以用,那麼影象識別當然也可以有影象庫拿來訓練,只不過對影象,其本身不是最小單元,需要再進行處理,這一點一定程度上加大了它與語言的區別。其次影象本身的性質決定了它不是單一的元素存在,比如給你一副影象,裡面可能有好幾個物體可以識別。所以這一切也決定了它的困難。但是統計模式下的影象識別感覺更具有價值,只待一種方法將影象視為最小單元的演算法,那個時候影象的識別將真正上升一個等級,而與之孕育而生的產業、科技,比如機器人、人工智慧將會在現實中崛起。

再來談貝葉斯分類。現實生活中,我們常常會遇到這樣的問題,比如一個東西我們知道了可以分為好幾類,那麼現實是我們拿到一個東西后開始並不知道它屬於哪一個類,我們所知道的是拿到這個東西后,對其身上的特徵進行分析,把它的特徵都分析出來了。比如一個人吧,我們要將其分成男女(有點不恰當,現實是你一看就知道,但是看,你也是看了其典型特徵才知道的),假設一眼看不出來男女,機器沒那麼智慧。那麼對於這個人我們首先分析其特徵,可以是體重,身高,頭髮長短,鼻子嘴巴耳朵大小等等。那麼現在的問題是已知了這些特徵來判斷這個人是男是女,把這些特徵用xi表示,男女用yi表示,那麼在概率上講問題就變化為已知特徵下是男女的概率了,用數學表示就是:P

(y|x),已知x那麼它是y的概率。x不止一個,y也不止一個,那麼最終可以求得已知所有x,是y1概率多大,是y2概率多大,等等,挑其中最大的概率就認為是屬於yi了。

那麼問題的描述用數學就是:

  1. x是一個樣本,x=a1,a2,...,an,其中ai就是x的一個特徵。
  2. x所屬的類可能是:C=y1,y2,...,yn
  3. 計算P(y1|x),P(y2|x),...,p(yn|x)
  4. 找到其中最大值並屬於這類,P(yk|x)=maxP(y1|x),P(y2|x),...,p(yn|x)$,$xyk

看看上面4步,就是第三步不知道怎麼辦。還好偉大的貝葉斯定理告訴了我們怎麼辦。貝葉斯定理如下:

P
(yi|x)=P(x|yi)P(yi)P(x)

這個定理怎麼解釋呢?還是以上述男女分別為例,假設x取兩個特徵,身高體重,詳細點的值就是身高170,體重50,那麼這個人是男是女。則數學表示就是
  • 是男性的概率,P(男|(身高=170,體重=50))=P((身高=170,體重=50)|男)*P(男)/P((身高=170,體重=50)),假設身高與體重這兩個特徵獨立沒有關係,那麼P((身高=170,體重=50)|男)=P(身高=170|男)*P(體重=50|男),這個應該好理解,因為獨立,兩個連在一起的概率就是分別的概率相乘,再看看P((身高=170,體重=50)),這是什麼,身高體重使我們的觀察量,它的概率是多少,既然是觀察量,無論是男是女,這個值是一樣的,也就是是定值了,姑且認為是1吧,再看看P(男)是多少,我們訓練樣本,那麼在所有訓練樣本中,每個樣本屬於哪一類是知道的,比如我選了50個人,其中30男20女,那麼對於這個訓練樣本P(男)=3/5,這一項也就是樣本中某一類的概率。好了最終P(男|(身高=170,體重=50))=P(身高=170|男)*P(體重=50|男)*P(男)。
  • 同理是女性的概率:P(女|(身高=170,體重=50))=P(身高=170|女)*P(體重=50|女)*P(女)。

繼續往下求,以男的為例,現在的問題就轉變為求P(身高=170|男)*P(體重=50|男)*P(男),P(男)說了怎麼辦,那麼P(身高=170|男)和P(體重=50|男)怎麼辦,這個時候就是訓練樣本大發神威的作用了。P(身高=170|男)的意思表示男的裡面身高為170的概率,既然求男的裡面身高是170的概率,因為我們有一大堆訓練樣本,好了把樣本里面的男的挑出來,單看男的裡面身高規律,我們再去統計一下,假設發現30個男的,有15個男的升高在170左右,其他的都不在,那麼我們是不是可以認為男的裡面身高為170的概率就是15/30=0.5了呢?當然可以。同理可以算出男的裡面體重為50的概率。至於怎麼根據這些值算這個概率,有很多講究,比如我們認為人的身高符合正態分佈,那麼我們用一個正態分佈函式去擬合身高的概率密度函式不就可以了嗎?求出身高這些值得均值與方差,然後用

P(x)=12πσexp((xu)22σ2)去算當具體的一個x來了的時候它的概率。知道了身高這個特徵怎麼算了,那麼同理體重演算法。然後在同理女性的演算法。這樣就計算完了,可以比較了吧

好了再整理一下整體的步驟:
(1)確定用於分類的訓練樣本集,這個樣本集中,每個樣本有多少個特徵,以及樣本屬於哪一個類別要明確。
(2)計算每個類別的概率P(ci),找到訓練集中每個類的樣本個數,除以總的訓練樣本集就可以了。
(3)統計計算在各類別下各個特徵屬性的條件概率估計。也就是

P(x1|y1),P(x2|y1),...P(xn|y1);P(x1|y2),P(x2|y2),...P(xn|y2);...P(x1|yc),P(x2|yc),...P(xn|yc)
至於P(x|y)怎麼算,一般對於連續變化的數值,可以用正態分佈函式來模擬它的概率密度。

至此訓練完成,那麼如何分類?分類是相對測試樣本而言的,這個時候你是不知道測試的樣本的分類的,只知道它的特徵。好了,假設來了一個測試樣本x,它的特徵都知道,它屬於哪一類呢?用下面公式:

P(yi|x)=P(x|yi)P(yi)P(x)
假設各個特徵獨立(一般也都認為獨立,即使有一點關係也忽略了,比如身高與體重,你能說完全沒有關係,身高100的體重能有100?)既然獨立那麼上述轉化為:
P(x|yi)P(yi)=P(x1|yi)P(x2|yi)...P(xn|yi)