1. 程式人生 > >機器學習基礎——讓你一文學會樸素貝葉斯模型

機器學習基礎——讓你一文學會樸素貝葉斯模型

今天這篇文章和大家聊聊樸素貝葉斯模型,這是機器學習領域非常經典的模型之一,而且非常簡單,適合初學者入門。

樸素貝葉斯模型,顧名思義和貝葉斯定理肯定高度相關。之前我們在三扇門遊戲的文章當中介紹過貝葉斯定理,我們先來簡單回顧一下貝葉斯公式:

\[P(A|B)=\frac{P(A)P(B|A)}{P(B)}\]

我們把\(P(A)\)和\(P(B)\)當做先驗概率,那麼貝葉斯公式就是通過先驗和條件概率推算後驗概率的公式。也就是尋果溯因,我們根據已經發生的事件去探究導致事件發生的原因。而樸素貝葉斯模型正是基於這個原理,它的原理非常樸素,樸素到一句話就可以概率:當一個樣本有可能屬於多個類別的時候,我們簡單地選擇其中概率最大的那個。

所以,既然是選擇樣本所屬的類別,顯然樸素貝葉斯模型是一個分類演算法。

在我們具體介紹演算法原理之前,我們先來熟悉幾個概念。其中幾個概念在我們之前的文章當中也介紹過,這裡就當做複習。


先驗概率


先驗概率其實很好理解,我們先不管裡面”先後“這兩個字。說白了,其實先驗概率就是我們可以事先通過做實驗計算的概率。比如拋硬幣正面朝上,比如在一個路口遇到紅燈,再比如明天會下雨。

這些事情,有些是我們可以通過實驗得到的,有些是可以根據之前的經驗估計的。在我們問題當中,這些事件的概率是相對明確的。可以認為是我們在做模型探究之前就可以確定的概率,所以稱為先驗概率。


後驗概率


後驗概率從直觀上來看與先驗概率相反,是我們通過實驗或者是之前的經驗沒有辦法直接獲取的。它更多的指的是某個事件由於某個原因或者是另一個事件導致的概率。

舉個例子來說,一個學生參加考試,能夠及格的概率是可以測量的。無論通過一個學生多次考試進行測試,還是批量學生進行統計,都是可行的。但假設學生在考試之前可以選擇複習或者是打遊戲,顯然,複習會提升學生通過的概率,打遊戲可能會降低也可能變化不大,我們不得而知。假設我們知道小明已經通過了考試,想要知道他在考試之前有沒有複習,這就是一個後驗概率。

從邏輯上來看,它和條件概率恰好相反。條件概率是事件A發生的前提下會發生事件B的概率,而後驗概率是已經知道事件B發生了,求事件A發生的概率。


似然估計


這也是一個爛大街的詞,所有介紹貝葉斯的文章,沒有一個不提到這個詞的。但是很少有文章能夠將這個概念講解清楚。

似然的英文是likelihood,從語義上來說它和概率(probability)非常接近,可能只是翻譯的時候做了區分。兩者在數學公式上的表示也非常接近,都可以寫成\(P(x|\theta)\)。

其中概率求的是已經知道引數\(\theta\),事件x發生的概率。而似然側重事件A發生時的引數\(\theta\)。那麼自然,似然估計函式就是通過概率分佈估計引數的函數了。最大似然估計也就好理解了,就是求事件A發生時,最有可能的引數\(\theta\)的值。

舉個很簡單的例子,假設我們有一個不透明的黑箱,裡面有若干個黑球和若干個白球。但我們不知道到底黑球有幾個白球有幾個。為了探索這個比例,我們有放回地從箱子當中取出10個球,假設最終結果是7黑3白,那麼請問箱子裡黑球的比例是多少?

這題簡直不能更簡單,不是小學生的問題麼?既然取了10次裡面有7個黑球,那顯然黑球的概率應該是70%啊,這有什麼問題嗎?

表面上當然毫無問題,但實際上不對。因為我們實驗得到的實驗結果並不代表概率本身,簡單來說,箱子裡黑球是70%可以出現7黑3白,箱子裡黑球是50%也一樣可以出現這個結果,我們怎麼能判斷箱子裡黑球一定是70%呢?

這個時候就要用到似然函數了。


似然函式


我們把剛才黑白球的實驗代入到上面的似然估計的公式當中去,實驗最後得到的結果是確定的,是事件x。我們要求的,也就是黑球的比例是引數\(\theta\)。由於我們是有放回的實驗,所以每次拿出黑球的概率是不變的,根據二項分佈,我們可以寫出事件x發生的概率:

\[P(x|\theta)=\theta^7*(1-\theta)^3=f(\theta)\]

這個式子就是我們的似然函式,也叫概率函式。它反映不同的引數下,事件x發生的概率。我們要做的就是根據這個函式計算出\(f(\theta)\)最大時\(\theta\)的取值。

這個計算過程就很簡單了,我們對\(\theta\)求導,然後令導數等於0,然後求出此時對應的\(\theta\)的取值。最後的結果當然是\(\theta=0.7\)時方程有最大值。

我們也可以把\(f(\theta)\)的函式影象畫出來,直觀地感受概率分佈。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 100)
y = np.power(x, 7) * np.power(1 - x, 3)

plt.plot(x, y)
plt.xlabel('value of theta')
plt.ylabel('value of f(theta)')
plt.show()

這也就證明了,我們直觀的感受是對的。不是因為我們拿出來黑球的概率是70%箱子裡黑球的比例就是70%,而是箱子裡黑球比例是70%拿出來黑球佔70%的概率最大。


模型詳解


接下來就到了重頭戲,我們還是先看貝葉斯公式:

\[P(A|B)=\frac{P(A)P(B|A)}{P(B)}\]

我們接下來對公式進行一個變形,我們假設與B事件有關的所有事件的集合為C。顯然\(A \in C\),假設C集合中一個有m個事件,分別寫成: \(C_1, C_2, \cdots, C_m\)。

那麼

\(P(B)=\sum_{i=1}^mP(B|C_i)P(C_i)\)

我們在追尋事件B發生的原因的時候,會追尋出所有可能導致這個結果的引數集合C,然後從其中挑選出概率最大的那個作為結果。

我們用它來分類的原理也是一樣,對於一個樣本x,我們會計算出它分別屬於所有類別的概率,然後選擇其中概率最大的一個作為最終預測的類別。這個樸素的思想就是樸素貝葉斯模型的原理。

我們假設\(x=\{a_1, a_2, \cdots, a_n\}\),其中的每一個a表示樣本x的一個維度的特徵。同樣,我們還會有一個類別的集合\(C=\{y_1, y_2, \cdots, y_m\}\),其中的每一個y表示一個特定的類別。我們要做的就是計算出x屬於各個類別y的概率,選擇其中概率最大的那個作為最終的分類結果。

我們根據貝葉斯公式寫出概率公式:

\[P(y_i|x)=\frac{P(x|y_i)P(y_i)}{P(x)}\]

其中\(P(x)\)是一個常量,對於所有的\(y_i\)保持不變,所以可以忽略,我們只需要關注分子的部分。

這裡,我們做一個重要的假設:我們假設樣本x中各個維度的特徵值彼此是獨立的。

這個假設非常樸素,但是也非常重要,如果沒有這個假設,那麼這裡的概率會複雜到我們幾乎無法計算。正是因為有了這個樸素的假設,所以才會稱作是樸素貝葉斯模型,這也是得名的原因。當然,英文是naive bayes,所以理論上來說稱作是乃衣服貝葉斯也是可以的。

有了這個假設之後就好辦了,我們把公式展開就行:

\(P(y_i|x)=P(y_i)P(a_1|y_i)P(a_2|y_i)\cdots P(a_n|y_i)=P(y_i)\prod_{j=1}^nP(a_j|y_i)\)

其中\(P(y_i)\)是先驗概率,我們可以通過實驗或者是其他方法得到,像是\(P(a_j|y_i)\)就不能直接得到了,就需要我們用統計的方法來計算。

如果\(a_j\)是離散值,很簡單,我們只需要統計\(y_i\)事件發生時,各個\(a_j\)的實現比例即可。假設我們實驗了若干次,\(y_i\)一共發生了M次,\(a_j\)發生了N次,那麼顯然:

\[P(a_j|y_i)=\frac{N}{M}\]

為了防止M=0,我們可以在分子和分母上同時加上一個平滑引數,所以最終的結果寫成:

\[P(a_j|y_i)=\frac{N+\alpha}{M+\beta}\]

但如果\(a_j\)是連續值應該怎麼辦?如果它是連續值,那麼它的取值可能是無數多種。那麼顯然,我們不可能針對它的每一個取值都去計算概率。也不可能蒐集到這麼多樣本。這種情況下我們應該怎麼辦呢?

連續值也沒關係,我們可以假設變數的分佈滿足正態分佈。它的正態分佈曲線其實就是這個變數的概率分佈。

用上圖舉個例子,我們觀察最下面的累積百分比這個值。它其實代表x的位置與負無窮之間隔成的區域的面積。這個面積的取值範圍是0-1,我們就可以用這個面積的值來代表f(x)的概率。實際上假設變數服從不同維度的正態分佈,其實就是高斯混合模型(GMM)的思想了,這裡點到為止,不做過多展開。

也就是說,如果是離散值,那麼我們就通過計算比例的方式來代表概率,如果是連續值,那麼就通過正態分佈計算概率分佈的方法來計算概率。通過這種方法,我們就可以通過n個\(P(a_j|y_i)\)連乘得到\(P(y_i|x)\)的概率,最後,我們比較所有y對應的概率,選擇其中最大的那個作為分類結果。

以上流程完全正確,但是還存在一個小小的問題。

\(P(a_j|y_i)\)是一個浮點數,而且很有可能非常小,而我們需要計算n個浮點數的乘積。由於存在精度誤差,所以當連乘的結果小於精度的時候,就無法比較兩個概率之間的大小了。

為了解決這個問題,我們需要對浮點數的連乘做一個變形:我們對等式的左右兩邊取log。將若干個浮點數相乘,轉化成相加:

\[ \begin{eqnarray} P(y_i|x) &= P(y_i)P(a_1|y_i)P(a_2|y_i)\cdots P(a_n|y_i) &= P(y_i)\prod_{j=1}^nP(a_j|y_i) \\ \log(P(y_i|x)) &= \log(P(y_i))+ \log(P(a_1|y_i)) + \cdots + log(P(a_n|y_i)) &= \log(P(y_i|x)) + \sum_{i=1}^n \log(P(a_i|y_i)) \end{eqnarray} \]

由於對數函式是單調函式,所以我們可以直接用取完對數之後的結果來比大小,就可以避免精度帶來的影響了。

以上就是貝葉斯模型的原理,在之後的文章當中會給大家分享貝葉斯模型在文字分類當中的應用。

更文不易,如果有所收穫,求個**關注*

相關推薦

機器學習基礎——文學樸素模型

今天這篇文章和大家聊聊樸素貝葉斯模型,這是機器學習領域非常經典的模型之一,而且非常簡單,適合初學者入門。 樸素貝葉斯模型,顧名思義和貝葉斯定理肯定高度相關。之前我們在三扇門遊戲的文章當中介紹過貝葉斯定理,我們先來簡單回顧一下貝葉斯公式: \[P(A|B)=\frac{P(A)P(B|A)}{P(B)}\] 我

機器學習實戰教程(四):樸素基礎篇之言論過濾器

word 最可 dog 一個 mac github上 開課 和數 基礎上 原文鏈接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一、前言 樸素貝葉斯算法是有監督的學習算法,解決的是分類問題,

機器學習實踐(九)—sklearn之樸素演算法

一、樸素貝葉斯演算法 什麼是樸素貝葉斯分類方法 屬於哪個類別概率大,就判斷屬於哪個類別 概率基礎 概率定義為一件事情發生的可能性 P(X) : 取值在[0, 1] 聯合概率、條件概率與相互獨立

機器學習實戰中,第四章樸素,過濾垃圾郵件,正則表示式切分郵件內容得出字母的問題解決方法

原文中的程式碼:listOfTokens = re.split(r'\W*', bigString) 修改為:listOfTokens = re.split(r'\W+', bigString)

機器學習-西瓜書】七、樸素分類器

推薦閱讀:拉普拉斯修正 7.3樸素貝葉斯分類器 關鍵詞: 樸素貝葉斯;拉普拉斯修正 上一小節我們知道貝葉斯分類器的分類依據是這公式:P(c∣x)=P(x,c)P(x)=P(c)⋅P(c∣x)P(x) ,對於每個樣本而言,分母P(x)=∑mi=1P(

機器學習實戰教程(五):樸素實戰篇之新浪新聞分類

原文連結: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一、前言 上篇文章機器學習實戰教程(四):樸素貝葉斯基礎篇之言論過濾器講解了樸素貝葉斯的基礎知識。本篇文章將在此基礎上進行擴充套件,你將看到以下內容: 拉普拉

機器學習回顧篇(5):樸素演算法

1 引言 說到樸素貝葉斯演算法,很自然地就會想到貝葉斯概率公式,這是我們在高中的時候就學過的只是,沒錯,這也真是樸素貝葉斯演算法的核心,今天我們也從貝葉斯概率公式開始,全面擼一擼樸素貝葉斯演算法。 2 貝葉斯概率公式 2.1 聯合概率與全概率公式 定義1:完備事件組 ${A_1} \cup {A_2

機器學習基礎——帶實戰樸素模型文字分類

本文始發於個人公眾號:TechFlow 上一篇文章當中我們介紹了樸素貝葉斯模型的基本原理。 樸素貝葉斯的核心本質是假設樣本當中的變數服從某個分佈,從而利用條件概率計算出樣本屬於某個類別的概率。一般來說一個樣本往往會含有許多特徵,這些特徵之間很有可能是有相關性的。為了簡化模型,樸素貝葉斯模型假設這些變數是獨

《web安全之機器學習入門》第7章樸素模型檢測webshell

N-gram演算法,認為第N個詞只與前面的第N-1個詞相關。例如對於一個句子,I love my country.那麼2-gram得到的詞集為:["I love","love my","my country"]程式碼如下:檢測webshell的第一種方式的思路為,將php w

步步教輕鬆學樸素模型實現篇2

導讀:樸素貝葉斯模型是機器學習常用的模型演算法之一,其在文字分類方面簡單易行,且取得不錯的分類效果。所以很受歡迎,對於樸素貝葉斯的學習,本文首先介紹理論知識即樸素貝葉斯相關概念和公式推導,為了加深理解,採用一個維基百科上面性別分類例子進行形式化描述。然後通過程式設計實現樸素貝葉斯分類演算法,並在遮蔽社

步步教輕鬆學樸素模型演算法理論篇1

導讀:樸素貝葉斯模型是機器學習常用的模型演算法之一,其在文字分類方面簡單易行,且取得不錯的分類效果。所以很受歡迎,對於樸素貝葉斯的學習,本文首先介紹理論知識即樸素貝葉斯相關概念和公式推導,為了加深理解,採用一個維基百科上面性別分類例子進行形式化描述。然後通過程式設計實現樸素貝葉斯分類演算法,並在遮蔽社

機器學習樸素模型及程式碼示例

一、樸素貝葉斯的推導 樸素貝葉斯學習(naive Bayes)是一種有監督的學習,訓練時不僅要提供訓練樣本的特徵向量X,而且還需提供訓練樣本的實際標記Y,是一種基於貝葉斯定理和特徵條件獨立假設的分類方法。 1. 貝葉斯定理: 貝葉斯定理: 。 對於分

機器學習--樸素模型原理

技術 附加 數據 求最大值 計數 .... 皮爾遜 max 數學家 樸素貝葉斯中的樸素是指特征條件獨立假設, 貝葉斯是指貝葉斯定理, 我們從貝葉斯定理開始說起吧. 1. 貝葉斯定理 貝葉斯定理是用來描述兩個條件概率之間的關系 1). 什麽是條件概率? 如果有兩個事

統計學習方法c++實現之三 樸素

樸素貝葉斯法 前言 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法,這與我們生活中判斷一件事情的邏輯有點類似,樸素貝葉斯法的核心是引數的估計,在這之前,先來看一下如何用樸素貝葉斯法分類。 程式碼地址https://github.com/bBobxx/statistical-learning,歡

《統計學習方法(李航)》樸素學習筆記

作者:jliang https://blog.csdn.net/jliang3   1.重點歸納 1)樸素貝葉斯(naive Bayes)法只能用於分類,先基於特徵條件獨立假設學習輸入/輸出的聯合概率分佈,然後對給定的輸入x,利用貝葉斯定理求出後驗概率最大的輸出y。 2

自然語言處理:基於樸素的語種檢測

本文來自是對七月線上寒小陽自然語言處理課程的總結。 本文使用樸素貝葉斯完成一個語種檢測的分類器,準確度經過簡單的引數調優可以達到99.1%。 機器學習的演算法要取得好效果,離不開資料,咱們先拉點資料(twitter資料,包含English, French, Germa

分類-3-生成學習-3-樸素模型、laplace平滑、多元伯努利事件模型、多項式事件模型

多元伯努利事件模型( multi-variate Bernoulli event model) 在 GDA 中,我們要求特徵向量 x 是連續實數向量。如果 x 是離散值的話,可以考慮採用樸素貝葉斯的分類方法。 假如要分類垃圾郵件和正常郵件。 我們用

iO開發 -Masonry學習看就用,看就能上手專案

在這裡問下大家,用的約束方式是哪種?近年來,約束這件事情在開發中的分量越來越重,不同機型的問世,使得原來使用係數的開發人員苦不堪言,一開始約束的使用讓很多人很不習慣,網上給出的Demo也層出不全,沒有人真正告訴你該怎麼來寫一個tableview,怎麼來寫一個scrollView,這對於不

機器學習基礎概念(

“無監督學習”是指人們在獲得訓練的向量資料後在沒有標籤的情況下嘗試找出其內部蘊含關係的一種挖 掘工作,這個過程中使用者除了可能要設定一些必要的超引數( hyper-parameter)以外,不 用對這些樣本做任何的標記甚至是過程干預; “有監督學習”與此不同,每一個樣本都有著 明確的標籤,最

機器學習讀書筆記(四)樸素基礎篇之網站賬號分類

pan 技巧 nbsp 增強 就是 使用 分類問題 預測 結果 一、條件概率 在學習計算p1和p2概率之前,我們需要了解什麽是條件概率,就是指在事件B發生的情況下,事件A發生的概率,用P(A|B)來表示。 根據文氏圖,可以很清楚地看到在事件B發生的情況下,事件A發