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