朴素貝葉斯


條件概率

•設A,B為任意兩個事件,若P(A)>0,我們稱在已知事件A發生的條件下,事件B發生的概率為條件概率,記為P(B|A),並定義

 

乘法公式

•如果P(A)>0,則P(AB)=P(A)P(B|A)

•如果P(A1…An-1)>0,則P(A1…An)= P(A1) P(A2|A1) P(A3|A1A2)…P(An|A1…An-1)

全概率公式

 

 

•P(Ai)>0,則對任一事件B,有

 

•全概率公式是用於計算某個“結果” B發生的可能性大小。如果一個結果B的發生總是與某些前提條件Ai 相聯系,那么在計算P(B)時,我們就要用Ai 對B作分解,應用全概率公式計算P(B),我們常稱這種方法為全集分解法。

根據小偷們的資料,計算村子今晚失竊概率的問題:P(Ai)表示小偷 i 作案的概率,P(B|Ai)表示小偷i 作案成功的概率,那么P(B)就是村子失竊的概率

貝葉斯公式(又稱逆概公式)

 

P(Ai)>0,則對任一事件B,只要P(B)>0,有

 

 

•如果在B發生的條件下探求導致這一結果的各種“原因” Aj 發生的可能性大小P(Aj |B),則要應用貝葉斯公式

若村子今晚失竊,計算哪個小偷嫌疑最大的問題(嫌疑最大就是后驗概率最大)

假設小偷1和小偷2在某村庄的作案數量比為3:2,前者偷竊成功的概率為0.02,后者為0.01,現村庄失竊,求這次失竊是小偷1作案的概率。

【分析】A1={小偷1作案},A2={小偷2作案},B={村庄失竊}

 

 

總結:

先驗概率P(A):在不考慮任何情況下,A事件發生的概率條件概率P(B|A):A事件發生的情況下,B事件發生的概率后驗概率P(A|B):在B事件發生之后,對A事件發生的概率的重新評估全概率:如果A和A'構成樣本空間的一個划分,那么事件B的概率為:A和A'的概率分別乘以B對這兩個事件的概率之和。

朴素貝葉斯的直觀理解

案例:

有一個訓練集包含100個人,其中有60個非洲人(黑卷47,黑直1,黃卷11,黃直1),有40個亞洲人(黑卷1,黃卷4,黃直*35),請訓練朴素貝葉斯模型。

膚色x1={黑,黃}, 發型x2={卷,直}; 地區label={亞,非}

先計算先驗概率:

亞洲人的比例m,非洲人的比例

 

模型構建:根據資料計算模型參數

亞洲人中膚色=黑的比例,亞洲人中膚色=黃的比例

 

非洲人中膚色=黑的比例,非洲人中膚色=黃的比例

 

亞洲人中發型=卷的比例,亞洲人中發型=直的比例

 

非洲人中發型=卷的比例,非洲人中發型=直的比例

 

假設新來了一個人【[黑,卷],地區=?】,請用朴素貝葉斯模型預測這個人的地區。Y表示地區,X表示特征向量,根據貝葉斯公式,並假設特征間獨立的假設有:

 

和特征間獨立的假設(朴素),得

 

根據計算結果,模型會將這個人的地區預測為非洲。

朴素:假設特征間是獨立的(忽略膚色和發型的聯系),從而變成了“低配版的貝葉斯模型”,稱為“朴素貝葉斯”。

優點:是可以減少需要估計的參數的個數;缺點:會犧牲一定的分類准確率。

如果是貝葉斯模型的話,模型參數總數為:

 

是指數增長的,實際是不可行的;而朴素貝葉斯模型參數總數為:

 

通過朴素貝葉斯就可以避免線性增長。

訓練:先根據數據集,計算標記(地區)的先驗概率,再計算每一個特征(膚色和發型)的條件概率,這些概率值就是模型參數,因此朴素貝葉斯的訓練成本很低。

預測:當一個【黑,卷】來報道時,假設特征間是獨立的,朴素貝葉斯模型會預測他的老家是非洲的,原理就是

“非洲人的概率 非洲人里膚色為黑的比例 非洲人里發型為卷的比例 > 亞洲人的概率 亞洲人里膚色為黑的比例 亞洲人里發型為卷的比例”。

朴素貝葉斯模型會將實例預測為后驗概率最大的類。

繼續上文的引例,考慮一個這樣的問題:

假設某人的地區完全依靠其膚色的就能確定,發型是一個對判斷地區沒有參考價值的特征,假設P(卷|非洲)=0, P(卷|亞洲)=0.001,當來了一個【黑,卷】人的時候,我們算出

然后被預測為亞洲人,傻了吧?

原因:出現某個模型參數為0時,0乘任何數都=0,直接影響到后驗概率的計算結果。

解決這一問題的方法是使用平滑操作,改造先驗概率公式:

 

改造每個特征的條件概率公式(這里只列舉了2個):

 

在隨機變量各個取值的頻數上賦予一個正數,當λ=1時,稱為拉普拉斯平滑

 

 

拉普拉斯平滑

 

 

17: 15+2 (拉普拉斯平滑)

10: 9+1 (拉普拉斯平滑)

代碼實現

import pandas as pd
​
def tokey(col_name,category,y): #定義寫key的函數,比如產生 'X1=3|Y=1'
    return col_name+"="+str(category)+"|Y="+str(y)
​
df = pd.read_csv("datas/bayes_lihang.txt")
lam = 1 #平滑因子
P = {} #用於存儲所有概率的字典
Y = df["Y"].value_counts().keys() #獲取類別種類的list
col_names = df.columns.tolist()[:-1] #獲取特征列名
for y in Y: #遍歷每個類別
    df2 = df[df["Y"]==y] #獲取每個類別下的DF
    p = (df2.shape[0]+lam)/(df.shape[0]+len(Y)*lam) #計算先驗概率
    P[y] = p #將先驗概率加入P
    for col_name in col_names: #遍歷每個特征
        categorys = df2[col_name].value_counts().keys() #獲取每個特征下特征值種類的list
        for category in categorys: #遍歷每個特征值
            p = (df2[df2[col_name]==category].shape[0]+lam)/(df2.shape[0]+len(categorys)*lam) #計算在某類別下,特征=某特征的條件概率
            P[tokey(col_name,category,y)] = p  #將條件概率加到P
print(P) 
X = [2,"S"] #待測數據
res = []  #用於存儲屬於某一類別的后驗概率
for y in Y: #遍歷類別
    p = P[y] #獲取先驗概率
    for i in range(len(X)): #遍歷特征
        p*=P[tokey(col_names[i],X[i],y)]  #獲取條件概率
    print(p)
    res.append(p)  #將后驗概率加入res
    
import numpy as np
np.argmax(res) #返回最大的后驗概率對應的類別

 

多項式朴素貝葉斯:

當特征是離散變量時,使用多項式模型

高斯朴素貝葉斯:

當特征是連續變量時,使用高斯模型

伯努利朴素貝葉斯:

伯努利模型和多項式模型是一致的,但要求特征是二值化的(1,0)

注意:當特征中既有連續變量又有離散變量時,一般將連續變量離散化后使用多項式模型

•在機器學習中,朴素貝葉斯分類器是一系列以假設特征之間強獨立(朴素)下運用貝葉斯定理為基礎的簡單概率分類器。

•高度可擴展的,求解過程只需花費線性時間

•目前來說,朴素貝葉斯在文本分類(textclassification)的領域的應用多,無論是sklearn還是Spark Mllib中,都只定制化地實現了在文本分類領域的算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM