機器學習A-Z~樸素貝葉斯

本文要講述一個古老的機器學習算法,叫作樸素貝葉斯。這個算法比較簡單明瞭,沒有使用很是複雜的數學定理。用到的核心的數學理論就是機率中的一個定理,叫作貝葉斯定理(Bayes' Theorem)。python

貝葉斯定理

如今咱們看一個例子,假設有一個生產扳手的工廠,有兩臺機器。這兩臺機器分別生產了不少扳手,並且每一個扳手都能看出是哪一個機器生產的。如今有了不少不少生產出的扳手,而且這些扳手裏面有達標的正品和不達標的次品。如今要解決的問題是:咱們想知道,2號機器它生產的產品是次品的機率是多少。解決這個問題要用到的定理就是貝葉斯定理。算法

$$ P(A|B) = \frac{P(B|A)*P(A)}{P(B)} $$機器學習

學過幾率論的朋友應該對它有點了解,這裏也稍微解釋下。咱們給上面的問題提供一些條件:函數

  • 1號機器每小時生產30個扳手
  • 2號機器每小時生產30個扳手
  • 全部的產品中有1%的次品
  • 全部次品中有50%來自機器1,50%來自機器2

問題是:機器2生產的產品是次品的機率是多少?學習

如今一步步往下計算,首先計算最後生產的產品是機器1生產的機率P(Mach1)=30/50=0.6,最後生產的產品是機器1生產的機率P(Mach2)=20/50=0.4。而後全部產品中有1%的次品表示P(Defect) = 1%。接下來的條件表示要用到條件機率P(Mach1 | Defect) = 50%。這句話的意思就是若是一個產品是次品,那麼它是機器1生產的機率是50%。同理P(Mach2 | Defect) = 50%。咱們要求的是P(Defect | Mach2)= ?。帶入貝葉斯定理公式:spa

$$ P(Defect|Mach2) = \frac{P(Mach2|Defect)*P(Defect)}{P(Mach2)} $$code

結果爲0.5*0.01/0.4=1.25%。顯然,使用貝葉斯定理能夠經過一些很容易得到的機率來得出不容易得到的機率結果,能夠節省咱們不少的精力。這就是貝葉斯定理的應用。rem

樸素貝葉斯

接下來來說樸素貝葉斯分類器,咱們要用到的就是上述的貝葉斯定理。其中P(A|B)被稱做後驗機率,P(B|A)和P(B)這兩個機率並不徹底是機率,由於樸素貝葉斯分類器中,B表明特徵,因此說這兩個機率咱們稱做似然數學

來看看下面的例子,有兩組數據綠組和藍組,x1表明人羣的年齡,x2表明他們的收入。全部的紅組表明全部步行上班的人,綠組表明開車上班的人。如今若是出現一個新的點,咱們要對它進行分類,肯定是分到紅色組中仍是綠色組中。產品

咱們要使用樸素貝葉斯來解決這個分類問題,首先來看看咱們須要通過的三個步驟。

第一步,看看這個貝葉斯公式:

$$ P(Walks|X) = \frac{P(X|Walks)*P(Walks)}{P(X)} $$

這裏的X就是它的特徵。對於新的點,它有對應的年紀和收入就是這個新用戶的特徵,咱們要求的就是已知這些特徵,要獲得它分到紅組或者綠組的機率。這裏的P(Walks)就是隨機抽一我的,它是走路上班的機率,這個也被稱做先驗機率,對應的就是後驗。P(X)指的是隨機抽一我的,他所顯示的特徵和新用戶的特徵的似然或者可能性。這裏的似然也是個機率,它是對數據特徵的機率,所以咱們把它叫作似然。再而後,這裏的P(X|)指的是對這個數據特徵的機率,所以叫作似然。接下來第三部要求的也是個似然P(X|Walks),或者叫作邊際的似然,邊際的可能性。這樣咱們就能求出後驗機率P(Walks|X)。

求解完步行部分的再求開車部分的:

$$ P(Drives|X) = \frac{P(X|Drives)*P(Drives)}{P(X)} $$

而後咱們就能夠比較P(Walks|X)和P(Drives|X),也就是已知用戶的特徵,其步行或者開車的機率。這兩個機率哪一個比較大,那麼就能夠將這個用戶分類到那個分組中。

那麼開始按照上面說的流程進行計算,首先比較簡單,P(Walks)=Number of Walkers/Total Observations=10/30。接下來,計算P(X),也就是似然。這個是樸素貝葉斯中核心的一步。這裏的X指的是新用戶他所表明的特徵,即年紀和收入。咱們能夠圍繞這個新用戶畫一個圈,那麼這個圈就表明着在這個二維數據空間中的全部用戶,他們的特徵和新用戶很是類似。要求的P(X)就是咱們原先數據空間中的全部數據,它的特徵坐落在這個圈中的機率。那麼咱們要計算的就是原先數據中與新用戶擁有類似特徵的個數除以總的人數。P(X)=Number of Similar Observations/Total Observations=4/30.

再而後求P(X}Walks),也就是邊際似然,那麼就是若是一我的是步行上班,那麼它坐落在這個圈中的機率。那麼這裏的計算公式很簡單,就是P(X|Walks) = Among those who Walk/Total number of Walkers=3/10。這樣,咱們就能夠求得後驗機率P(Walks|X) = 0.75。一樣的方法能夠獲得P(Drives|X)=0.25。

因爲0.75>0.25,所以這個用戶分配到步行上班組的機率大於分配到開車上班組的機率。

樸素貝葉斯的一些補充說明

接下來咱們來看看幾個問題,首先第一個,爲何把它作樸素貝葉斯?或者爲何樸素?當咱們使用樸素貝葉斯方法的時候已經作過一個假設,這個假設就是數據的全部特徵都是獨立的。在上述的例子裏的兩個特徵,年齡和薪水,實際上這二者是可能有關係的,通常來講年齡越大可能薪水就越大。但這裏假設年齡和薪水二者沒有相關性。所以在一個機器學習的問題中,咱們常常會作一些假設,這些假設並不必定都是對的,但這些假設能夠幫助咱們更高效快捷的解決問題。咱們容許有一點偏差,由於咱們的終極問題是解決問題。

接下來第二個問題,似然函數P(X),上面計算這個函數的方法是先在新數據周圍畫了個圈,表示在這個圈裏的數據點,都表示和這個新數據點有類似的特徵,那麼接下來這個似然就是指若是有一個新的點,那麼它坐落在這個圈中的機率。那麼這個P(X)你會發現,它跟咱們想要計算的後驗機率是和紅組相關仍是綠組相關是沒有關係的。咱們最後要計算的兩個後驗機率的公式中的分母都是P(X),那麼咱們比較這二者實際上能夠把這個P(X)個消掉,也就是說能夠直接比較二者的分子P(X|Walks)P(Walks)和P(X|Drives)P(Drives)。

最後一個問題,若咱們已知的組超過兩組怎麼辦?目前已經有兩組的狀況下,比較二者的後驗機率,那麼咱們將新數據分配到更大的機率的分組中。那麼同理若是有三組的話,就是比較三者的後驗機率,哪一個更大就分配到其分組中。

代碼實現

這裏的代碼實現實際上也只是講以前的文章中將分類器改爲樸素貝葉斯便可:

from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

以上,就是樸素貝葉斯算法的相關知識。

相關文章
相關標籤/搜索