樸素貝葉斯

條件機率

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

 

乘法公式

•若是P(A)>0,則P(AB)=P(A)P(B|A)app

•若是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)就是村子失竊的機率spa

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

 

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

 

 

•若是在B發生的條件下探求致使這一結果的各類「緣由」 Aj 發生的可能性大小P(Aj |B),則要應用貝葉斯公式事件

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

假設小偷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中,都只定制化地實現了在文本分類領域的算法

相關文章
相關標籤/搜索