貝葉斯分類器
1. 引言
貝葉斯分類器是一種基于貝葉斯定理的分類算法,它利用特征之間的關系和類別的先驗概率來進行分類。貝葉斯分類器在文本分類、垃圾郵件過濾、醫學診斷等領域有著廣泛的應用。
貝葉斯分類算法是統計學的一種分類方法,是一類利用概率統計知識進行分類的方法。這類算法均以貝葉斯定理為基礎,統稱為貝葉斯分類。貝葉斯的核心思想為可以概括為:先驗概率+數據=后驗概率。(一般而言,先驗概率就是對于數據所在領域的歷史經驗,貝葉斯學派大膽假設先驗分布的模型,如正態分布、伯努利分布等)
在所有的機器學習分類算法當中,樸素貝葉斯和其他絕大多數的分類算法不同。對于大多數的分類算法,比如決策樹、邏輯回歸、支持向量機等,他們都是判別方法,也就是直接學習出特征輸出Y和特征X之間的關系,要么是決策函數 Y = f ( X ) Y=f(X) Y=f(X),要么是條件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X),但是樸素貝葉斯是生成方法,也就是直接找出特征輸出Y和特征X之間的聯合分布 P ( X , Y ) P(X, Y) P(X,Y),然后利用 P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X) = \frac{P(X,Y)}{P(X)} P(Y∣X)=P(X)P(X,Y)?得到。
2. 預備知識
為了理解貝葉斯分類器,我們需要了解一些基本的概念:
- 貝葉斯定理:用于計算在觀測到數據后,類別的后驗概率。
- 先驗概率:在觀測到數據之前,對類別的概率分布的估計。
- 條件概率:在給定某個條件下,某個事件發生的概率。
2.1 貝葉斯定理
貝葉斯定理是一個關于條件概率的公式,又稱為“逆概率”或“后驗概率”。它表述了當我們已知某個條件下的觀察結果時,我們可以利用這些信息來更新對一個假設的概率估計。其公式為:
P ( H ∣ E ) = P ( E ∣ H ) P ( H ) P ( E ) P(H|E) = \frac{P(E|H)P(H)}{P(E)} P(H∣E)=P(E)P(E∣H)P(H)?
其中, P ( H ∣ E ) P(H|E) P(H∣E)表示在發生E的情況下, H H H發生的概率; P ( E ∣ H ) P(E|H) P(E∣H)表示在發生H的情況下,E發生的概率; P ( H ) P(H) P(H)表示H發生的先驗概率, P ( E ) P(E) P(E)表示E發生的概率。
2.2 最大似然估計
最大似然估計(Maximum Likelihood Estimation, MLE),也稱為極大似然估計,是用來估計概率模型參數的一種方法。它可以在已知隨機變量屬于某種概率分布的前提下,利用隨機變量的一些觀測值估計出分布的參數值。
對于函數 p ( x ∣ θ ) p(x|\theta) p(x∣θ),輸入有兩個: x x x表示某個具體數據, θ \theta θ表示模型的參數。
- 如果 θ \theta θ已知, x x x是變量,則該函數稱為概率函數(probability function),描述對于不同的樣本點 x x x,其出現的概率是多少;
- 如果 x x x已知, θ \theta θ是變量,該函數稱為似然函數(likelihood function),描述對于不同的模型參數,出現 x x x這個樣本點的概率是多少。
極大似然估計假設樣本集中的所有樣本都是獨立同分布的,樣本集合為 D D D,以此來估計參數向量 θ \theta θ。記已知的樣本集為: D = x 1 , x 2 , . . . , x N D={x_1, x_2, ..., x_N} D=x1?,x2?,...,xN?。
似然函數(likelihood function):聯合概率密度函數 p ( D ∣ θ ) p(D|\theta) p(D∣θ)稱為 D = { x 1 , . . . , x N } D=\{x_1, ..., x_N\} D={x1?,...,xN?}關于 θ \theta θ的似然函數。
L ( θ ) = p ( D ∣ θ ) = p ( x 1 , . . . , x N ∣ θ ) = ∏ i = 1 N p ( x i ∣ θ ) L(\theta) = p(D|\theta)=p(x_1,...,x_N|\theta)=\prod_{i=1}^N p(x_i|\theta) L(θ)=p(D∣θ)=p(x1?,...,xN?∣θ)=i=1∏N?p(xi?∣θ)
值得注意的是,這里的 p ( x 1 , . . . , x N ∣ θ ) = ∏ i = 1 N p ( x i ∣ θ ) p(x_1,...,x_N|\theta)=\prod_{i=1}^N p(x_i|\theta) p(x1?,...,xN?∣θ)=∏i=1N?p(xi?∣θ)的前提是屬性之間相互獨立,這是樸素貝葉斯所作出的假設。
3. 算法介紹
貝葉斯分類器模型表述為
P ( c ∣ x ) = P ( x , c ) P ( x ) P(c|x)=\frac{P(x,c)}{P(x)} P(c∣x)=P(x)P(x,c)?
基于貝葉斯定理, P ( c ∣ x ) P(c|x) P(c∣x)可寫為
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) P(c|x)=\frac{P(c)P(x|c)}{P(x)} P(c∣x)=P(x)P(c)P(x∣c)?
其中, P ( c ) P(c) P(c)是類“先驗”概率, P ( x ∣ c ) P(x|c) P(x∣c)是樣本 x x x相對于類標記c的類條件概率,或者稱之為“似然”;對于每個類別來說,分母都是相同的,因而在求解時可以只比較分子部分。
樸素貝葉斯模型的關鍵在于計算給定樣本時的每個類別的后驗概率,后驗概率最大的類別即為輸出類別。
令 D c D_c Dc?表示訓練集 D D D中第c個類別樣本組成的集合,假設這些樣本是獨立同分布的,則參數 θ c \theta_c θc?對于數據集 D c D_c Dc?的似然是
P ( D c ∣ θ c ) = ∏ x ∈ D c P ( x ∣ θ c ) P(D_c|\theta_c)=\prod _{x\in D_c}P(x|\theta_c) P(Dc?∣θc?)=x∈Dc?∏?P(x∣θc?)
對 θ c \theta_c θc?進行極大似然估計,就是去尋找能夠最大化似然 P ( D c ∣ θ c ) P(D_c|\theta_c) P(Dc?∣θc?)的參數值 θ c ^ \hat{\theta_c} θc?^?,直觀上看,極大似然估計是試圖在 θ c \theta_c θc?的所有可能取值中,找到一個能夠使得數據出現的“可能性”最大的值,也即
θ c ^ = a r g m a x θ c P ( D c ∣ θ c ) \hat{\theta_c} = argmax_{\theta_c}P(D_c|\theta_c) θc?^?=argmaxθc??P(Dc?∣θc?)
估計類條件概率的一種常用策略是先假定其具有某種確定的概率分布形式,再根據訓練樣本對概率分布的參數進行估計。
在連續屬性的情形下,假設概率密度函數 p ( x ∣ c ) ~ N ( μ c , σ c 2 ) p(x|_c)\sim N(\mu_c, \sigma_c^2) p(x∣c?)~N(μc?,σc2?),則參數 μ c \mu_c μc?和 σ c 2 \sigma_c^2 σc2?的極大似然估計為
μ c ^ = 1 D c ∑ x ∈ D c x σ c 2 ^ = 1 D c ∑ x ∈ D c ( x ? μ c ^ ) ( x ? μ c ^ ) T \hat{\mu_c} = \frac{1}{D_c}\sum_{x\in D_c}x \\ \hat{\sigma_c^2} = \frac{1}{D_c}\sum_{x\in D_c}(x-\hat{\mu_c})(x-\hat{\mu_c}) ^T μc?^?=Dc?1?x∈Dc?∑?xσc2?^?=Dc?1?x∈Dc?∑?(x?μc?^?)(x?μc?^?)T
也就是說,通過極大似然法得到的正態分布均值就是樣本均值,方差就是 ( x ? μ c ^ ) ( x ? μ c ^ ) T (x-\hat{\mu_c})(x-\hat{\mu_c}) ^T (x?μc?^?)(x?μc?^?)T的均值。
歸納為步驟:
- 計算每個類別的先驗概率。
- 對于每個特征,計算在給定類別的條件下的類條件概率。
- 根據貝葉斯定理計算后驗概率。
- 根據后驗概率選擇類別。
4. 代碼調用
下面是一個簡單的Python代碼實現貝葉斯分類器的示例:
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加載數據集
data = load_iris()
X = data.data
y = data.target# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 創建貝葉斯分類器模型
model = GaussianNB()# 在訓練集上訓練模型
model.fit(X_train, y_train)# 在測試集上進行預測
y_pred = model.predict(X_test)# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
參考文獻
- https://mp.weixin.qq.com/s/AQnMNOJznAbnTy5QnALaCw
- https://blog.csdn.net/yinyu19950811/article/details/78060267
- 周志華《機器學習》