貝葉斯式相親

一天,小西找到小迪。python

小西:小迪,最近我閨蜜的男友向她求婚了。web

小迪:而後呢,她答應了嗎?算法

小西:尚未呢,他們認識時間還不是很長。並且,我閨蜜以爲那個男生有些方面不符合她的擇偶標準,她如今也是很是糾結呢!網絡

小迪:婚姻仍是要理性一點,若是她不知道該如何判斷,或許樸素貝葉斯算法能夠幫助她去理性得看待這個問題。dom

小西:樸素貝葉斯是什麼?它是怎麼幫助人類理性分析問題的呢?ide

小迪:貝葉斯分類算法是統計學的一種機率分類方法,樸素貝葉斯分類是貝葉斯分類中最簡單的一種。其分類原理就是利用貝葉斯公式根據某特徵的先驗機率計算出其後驗機率,而後選擇具備最大後驗機率的類做爲該特徵所屬的類。之因此稱之爲」樸素」,是由於貝葉斯分類只作最原始、最簡單的假設:全部的特徵之間是統計獨立的。svg

小西:聽上去仍是很是多邏輯性呢!那咱們該如何使用它呢?函數

小迪:那咱們就以一個女生是否選擇要嫁給一個男生爲例解釋一下這個算法。測試

1、概述

想要搞懂樸素貝葉斯算法,必定要先理解條件機率公式跟全機率公式,這兩個公式在大學時候咱們都學過,下面咱們來回顧一下。spa

假設某樣本X有$a_1,a_2,…,a_n$個屬性,那麼有$P(X)=P(a_1,a_2,…,a_n) = P(a_1)*P(a_2)*…*P(a_n)$。知足這樣的公式就說明特徵統計獨立。

1. 條件機率公式

條件機率(Condittional probability),就是指在事件B發生的狀況下,事件A發生的機率,用P(A|B)來表示。

根據文氏圖可知:在事件B發生的狀況下,事件A發生的機率就是P(A∩B)除以P(B)。

同理可得:

因此,

接着看全機率公式,若是事件$A_1,A_2,A_3,…,A_n$構成一個完備事件且都有正機率,那麼對於任意一個事件B則有:

2. 貝葉斯推斷

根據條件機率和全機率公式,能夠獲得貝葉斯公式以下:

P(A)稱爲"先驗機率"(Prior probability),即在B事件發生以前,咱們對A事件機率的一個判斷。

P(A|B)稱爲"後驗機率"(Posterior probability),即在B事件發生以後,咱們對A事件機率的從新評估。

P(B|A)/P(B)稱爲"可能性函數"(Likely hood),這是一個調整因子,使得預估機率更接近真實機率。

因此條件機率能夠理解爲:後驗機率 = 先驗機率 * 調整因子

若是"可能性函數">1,意味着"先驗機率"被加強,事件A的發生的可能性變大;

若是"可能性函數"=1,意味着B事件無助於判斷事件A的可能性;

若是"可能性函數"<1,意味着"先驗機率"被削弱,事件A的可能性變小。

3. 嫁?仍是不嫁?這是一個問題……

下面咱們就以「嫁不嫁」這個問題應用一下咱們的樸素貝葉斯算法。

顏值 性格 上進否 嫁與否
上進
不帥 通常 不嫁
不帥 很差 不上進 不嫁
通常
不帥 上進
很差 通常 不嫁
不上進
不帥 很差 上進 不嫁
很差 上進
不帥 不上進 不嫁

上面這張表是根據女生根據假象男生的性格來決定是否嫁給他的標準信息表,咱們利用這張表來針對特定男生的信息計算是否值得嫁的機率。

假設某個男生帥,性格很差,不上進,那麼:

根據貝葉斯公式:

轉換成分類任務的表達式:

<svg xmlns:xlink="http://www.w3.org/1999/xlink&...; width="34.537ex" height="6.313ex" viewBox="0 -1610.3 14870.2 2718" role="img" focusable="false" style="vertical-align: -2.573ex;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">類</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">別</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">徵</text></g><g transform="translate(7494,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">類</text></g><g transform="translate(8297,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">別</text></g><g transform="translate(9489,0)"><g transform="translate(120,0)"><g transform="translate(60,715)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">徵</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">類</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">別</text></g></g><g transform="translate(1002,-803)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">徵</text></g></g></g></g></g></svg>

按照樸素貝葉斯的求解,能夠轉換爲計算$P(嫁|帥\ 性格很差\ 不上進)$和$P(不嫁|帥\ 性格很差\ 不上進)$,最終選擇嫁與不嫁的答案。

$P(嫁|帥\ 性格很差\ 不上進)=P(嫁)\frac{P(帥|嫁)P(性格很差|嫁)P(不上進|嫁)}{P(帥\ 性格很差\ 不上進)}$

$P(不嫁|帥\ 性格很差\ 不上進)=P(不嫁)\frac{P(帥|不嫁)P(性格很差|不嫁)P(不上進|不嫁)}{P(帥\ 性格很差\ 不上進)}$

分母的計算用到的是全機率公式:

因此$P(帥\ 性格很差\ 不上進) = \P(嫁)P(帥|嫁)P(性格很差|嫁)P(不上進|嫁) \+ P(不嫁)P(帥|不嫁)P(性格很差|不嫁)P(不上進|不嫁)$

由上面得出:

P(嫁)= 5/10 = 1/2

P(不嫁)= 5/10 = 1/2

P(帥|嫁) P(性格很差|嫁) P(不上進|嫁)= 4/5 1/5 1/5

P(帥|不嫁) P(性格很差|不嫁) P(不上進|不嫁) = 1/5 3/5 2/5

對於類別「嫁」的貝葉斯分子爲:

P(嫁) P(帥|嫁) P(性格很差|嫁) P(不上進|嫁) = 1/2 4/5 1/5 1/5 = 2/125

對於類別「不嫁」的貝葉斯分子爲:

P(不嫁) P(帥|不嫁) P(性格很差|不嫁) P(不上進|不嫁) = 1/2 1/5 3/5 2/5 = 3/125

因此最終結果爲:

P(嫁|帥 性格很差 不上進) = (2/125) / (2/125 + 3/125) = 40%

P(不嫁|帥 性格很差 不上進) = (3/125) / (2/125 + 3/125) = 60%

60% > 40%,該女生選擇不嫁。

2、樸素貝葉斯種類

小西:樸素貝葉斯就是根據先驗機率與調整因子來肯定機率的,是吧!

小迪:沒錯,可是樸素貝葉斯的形式確不止如此。在scikit-learn中,一共有3個樸素貝葉斯的分類算法。分別是GaussianNB,MultinomialNB和BernoulliNB。

1. GaussianNB

GaussianNB就是先驗爲高斯分佈(正態分佈)的樸素貝葉斯,假設每一個標籤的數據都服從簡單的正態分佈。

其中$C_k$爲Y的第k類類別。$\mu_k和\sigma_k^2$爲須要從訓練集估計的值。

高斯分佈圖像

咱們可使用用scikit-learn簡單實現一下GaussianNB。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" contenteditable="true" cid="n138" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">#導入包
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

導入數據集

from sklearn import datasets
iris=datasets.load_iris()


切分數據集

Xtrain, Xtest, ytrain, ytest = train_test_split(iris.data,
iris.target,
random_state=12)

建模

clf = GaussianNB()
clf.fit(Xtrain, ytrain)

在測試集上執行預測,proba導出的是每一個樣本屬於某類的機率

clf.predict(Xtest)
clf.predict_proba(Xtest)

測試準確率

accuracy_score(ytest, clf.predict(Xtest))</pre>

2. MultinomialNB

MultinomialNB就是先驗爲多項式分佈的樸素貝葉斯。它假設特徵是由一個簡單多項式分佈生成的。多項分佈能夠描述各類類型樣本出現次數的機率,所以多項式樸素貝葉斯很是適合用於描述出現次數或者出現次數比例的特徵。該模型經常使用於文本分類,特徵表示的是次數,例如某個詞語的出現次數。

多項式分佈公式以下:

其中,$P(X_j=x_{jl}|Y=C_k)$是第k個類別的第j維特徵的第l個取值條件機率。$m_k$是訓練集中輸出爲第k類的樣本個數。$\lambda$ 爲一個大於0的常數,經常取爲1,即拉普拉斯平滑。也能夠取其餘值。

3. BernoulliNB

BernoulliNB就是先驗爲伯努利分佈的樸素貝葉斯。假設特徵的先驗機率爲二元伯努利分佈,即以下式:

此時$l$只有兩種取值。$x_{jl}$只能取值0或者1。

在伯努利模型中,每一個特徵的取值是布爾型的,即true和false,或者1和0。在文本分類中,就是一個特徵有沒有在一個文檔中出現。

小西:那咱們該在什麼狀況下分別使用這三種樸素貝葉斯模型呢?

小迪:通常來講,若是樣本特徵的分佈大部分是連續值,使用GaussianNB會比較好。若是若是樣本特徵的分佈大部分是多元離散值,使用MultinomialNB比較合適。而若是樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。

小西:原來如此。

注:全部圖片均來源於網絡

相關文章
相關標籤/搜索