一、樸素貝葉斯法原理
1.基本原理
樸素貝葉斯法(Naive Bayes)是一種基礎分類演算法,它的核心是貝葉斯定理+條件獨立性假設。貝葉斯定理描述的是兩個條件機率之間的關係,對兩個事件A和B,由乘法法則易知$$P(A∩B)=P(A)P(B│A)=P(B)P(A│B)$$
貝葉斯定理就是對這個關係式的變形,即
若把樣本特徵和類別作為對應的條件和條件機率,則貝葉斯定理可以用來解決分類問題。如對樣本\(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的機率:
歸屬於類別2的機率:
歸屬於類別3的機率:
歸屬於類別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.