樸素貝葉斯分類

歸去_來兮發表於2023-01-27

一、樸素貝葉斯法原理

1.基本原理

  樸素貝葉斯法(Naive Bayes)是一種基礎分類演算法,它的核心是貝葉斯定理+條件獨立性假設。貝葉斯定理描述的是兩個條件機率之間的關係,對兩個事件A和B,由乘法法則易知$$P(A∩B)=P(A)P(B│A)=P(B)P(A│B)$$
  貝葉斯定理就是對這個關係式的變形,即

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

  若把樣本特徵和類別作為對應的條件和條件機率,則貝葉斯定理可以用來解決分類問題。如對樣本\(x=\left( x_1,x_2,...,x_n \right)\),所屬類別為\(y\),那麼該特徵下對應該類別的機率代入貝葉斯公式就是$$P(y|x_1,x_2,...,x_n)=\frac{P(y)P(x_1,x_2,...,x_n|y)}{P(x_1,x_2,...,x_n)}$$
  貝葉斯分類法的思想就是計算樣本特徵對應於各類別的機率,以機率最大的作為分類輸出。分母部分是特徵的聯合機率,可以進一步由全機率公式展開;分子部分由於含複雜的條件機率,使得直接的計算較複雜,因此這裡做一個條件獨立性假設,即認為樣本的各維特徵間是相互獨立的,這是一個較強的假設,樸素貝葉斯也由此得名。在該條件之下,分子便可化為$$P(y)\prod_{i=1}^{n}P(x_i|y)$$
  注意到,在用於分類決策時,分母部分的值對於所有的類別都是相同的,要找出最大機率對應的類別,只考察分子即可。因此,樸素貝葉斯分類器表示為$$\hat{y}=\arg max_{y_k}{P(y_k)\prod_{i=1}^{n}P(x_i|y_k)}$$

2.平滑處理

  在離散特徵的情形之下進行分類輸出的機率計算,可能會出現機率為0的情況,如隨機變數觀測值的某一維並未在訓練集中出現,那麼它所屬的條件機率為0,致使對應類別的後驗機率為0,從而使分類產生偏差,這是不合理的,因此需進行一定的平滑處理。具體,就是在頻率計算時,對每組統計的頻數加上一個常數。
先驗機率:\(P(y_k)=\frac{\sum_{i=1}^{N}{I(y_i=y_k)+\lambda}}{N+K\lambda}\)
條件機率:\(P(x_i|y_k)=\frac{\sum_{i=1}^{N}{I(x_i,y_i=y_k)+\lambda}}{\sum_{i=1}^{N}{I(y_i=y_k)+S\lambda}}\)
  當\(\lambda=1\)時,稱為拉普拉斯平滑(Laplace smoothing)。

3.三個基本模型

  根據特徵隨機變數的型別,分為伯努利樸素貝葉斯、多項式樸素貝葉斯、高斯樸素貝葉斯三種基本模型。
(1) 伯努利樸素貝葉斯
  若特徵隨機變數符合的是離散型的二項分佈,也就是僅布林值,那麼此時的模型稱為伯努利樸素貝葉斯。從統計的角度,分類器表示式分子中的連乘運算對應於n次獨立試驗。
(2) 多項式樸素貝葉斯
  若特徵隨機變數符合的是離散型的多項分佈,那麼此時的模型稱為多項式樸素貝葉斯。同樣地,分類器表示式分子中的連乘運算對應於n次獨立試驗。
(3) 高斯樸素貝葉斯
  若特徵隨機變數是連續型的(如身高、體重),即假定它是符合高斯分佈的(正態分佈),機率的計算就是由已知的資料計算出高斯分佈的兩個引數(均值、標準差),進而由密度函式確定對應的取值,代入公式計算。同樣地,分類器表示式分子中的連乘運算對應於n次獨立試驗。

二、示例

  這裡對多項式樸素貝葉斯分類模型舉例。
訓練集:

樣本特徵向量X 類別Y
[1, 1, 2, 3] 1
[1, 2, 2, 4] 2
[1, 2, 3, 3] 2
[1, 2, 4, 4] 3
[1, 3, 3, 4] 3
[2, 2, 3, 4] 1
[2, 1, 3, 3] 3

測試樣本:[1, 2, 3, 4]

則類別集合為\(Y\in\left\{ 1,2,3 \right\}\) ,
\(P(Y=1)=\frac{2}{7}\),\(P(Y=2)=\frac{2}{7}\),\(P(Y=3)=\frac{3}{7}\),
\(P\left( X_1=1|Y=1 \right)=\frac{1}{2}\),\(P\left( X_2=2|Y=1 \right)=\frac{1}{2}\),\(P\left( X_3=3|Y=1 \right)=\frac{1}{2}\),
\(P\left( X_4=4|Y=1 \right)=\frac{1}{2}\),\(P\left( X_1=1|Y=2 \right)=1\),\(P\left( X_2=2|Y=2 \right)=1\),
\(P\left( X_3=3|Y=2 \right)=\frac{1}{2}\),\(P\left( X_4=4|Y=2 \right)=\frac{1}{2}\),\(P\left( X_1=1|Y=3 \right)=\frac{2}{3}\),
\(P\left( X_2=2|Y=3 \right)=\frac{1}{3}\),\(P\left( X_3=3|Y=3 \right)=\frac{2}{3}\),\(P\left( X_4=4|Y=3 \right)=\frac{2}{3}\),

歸屬於類別1的機率:

\[\begin{equation*} \begin{aligned} &P(Y=1)P(X_1=1|Y=1)P(X_2=2|Y=1)P(X_3=3|Y=1)P(X_4=4|Y=1)\\ &=\frac{2}{7}\cdot\frac{1}{2}\cdot\frac{1}{2}\cdot\frac{1}{2}\cdot\frac{1}{2}\\ &=\frac{1}{56} \end{aligned} \end{equation*} \]

歸屬於類別2的機率:

\[\begin{equation*} \begin{aligned} &P(Y=2)P(X_1=1|Y=2)P(X_2=2|Y=2)P(X_3=3|Y=2)P(X_4=4|Y=2)\\ &=\frac{2}{7}\cdot1\cdot1\cdot\frac{1}{2}\cdot\frac{1}{2}\\ &=\frac{1}{14} \end{aligned} \end{equation*} \]

歸屬於類別3的機率:

\[\begin{equation*} \begin{aligned} &P(Y=3)P(X_1=1|Y=3)P(X_2=2|Y=3)P(X_3=3|Y=3)P(X_4=4|Y=3)\\ &=\frac{3}{7}\cdot\frac{2}{3}\cdot\frac{1}{3}\cdot\frac{2}{3}\cdot\frac{2}{3}\\ &=\frac{8}{189} \end{aligned} \end{equation*} \]

歸屬於類別2的機率最大,因此分類輸出為2。

三、Python實現

(1) 伯努利樸素貝葉斯

'''
sklearn實現伯努利樸素貝葉斯分類。
'''

import numpy as np
from sklearn.naive_bayes import BernoulliNB

## 1.構造訓練集和待測樣本
#訓練集資料
train_x=[
    [1, 1, 1, 1],
    [1, 1, 1, 1],
    [1, 1, 1, 0],
    [1, 1, 0, 0],
    [1, 0, 0, 0],
    [0, 0, 0, 0]
]
#訓練集資料標籤
train_y=[
    1,
    2,
    2,
    3,
    3,
    1
]

#待測樣本
test_x = [
    [1, 2, 1, 2],
    [1, 1, 2, 2]
]

#轉為array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定義分類器
bnbClf = BernoulliNB()

## 3.訓練
Fit_bnbClf = bnbClf.fit(train_x,train_y)

## 4.預測
pre_y = Fit_bnbClf.predict(test_x)

print('預測類別:')
print(pre_y)

(2) 多項式樸素貝葉斯

'''
sklearn實現多項式樸素貝葉斯分類。
'''

import numpy as np
from sklearn.naive_bayes import ComplementNB

## 1.構造訓練集和待測樣本
#訓練集資料
train_x=[
    [1, 1, 2, 3],
    [1, 2, 2, 4],
    [1, 2, 3, 3],
    [1, 2, 4, 4],
    [1, 3, 3, 4],
    [2, 2, 3, 4],
    [2, 1, 3, 3]
]
#訓練集資料標籤
train_y=[
    1,
    2,
    2,
    3,
    3,
    1,
    3
]


#待測樣本
test_x = [
    [1, 2, 3, 4],
    [1, 1, 1, 4]
]

#轉為array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定義分類器
cnbClf = ComplementNB()

## 3.訓練
Fit_cnbClf = cnbClf.fit(train_x,train_y)

## 4.預測
pre_y = Fit_cnbClf.predict(test_x)

print('預測類別:')
print(pre_y)

(3) 高斯樸素貝葉斯

'''
sklearn實現高斯樸素貝葉斯分類。
'''

import numpy as np
from sklearn.naive_bayes import GaussianNB

#訓練集資料
train_x=[
    [1.1, 2, 3, 4],
    [1, 2.2, 3, 4],
    [1, 2, 3.3, 4],
    [1, 2, 3, 4.4],
    [1.1, 2.2, 3, 4],
    [1, 2, 3.3, 4.4]
]
#訓練集資料標籤
train_y=[
    1,
    2,
    2,
    3,
    3,
    1
]

#待測樣本
test_x = [
    [1.2, 2, 3, 4],
    [1, 2.3, 3, 4]
]

#轉為array形式
train_x = np.array(train_x)
train_y = np.array(train_y)
test_x = np.array(test_x)

## 2.定義分類器
gnbClf = GaussianNB()

## 3.訓練
Fit_gnbClf = gnbClf.fit(train_x,train_y)

## 4.預測
pre_y = Fit_gnbClf.predict(test_x)

print('預測類別:')
print(pre_y)




End.

相關文章