概述
貝葉斯分類算法是統計學的一種概率分類方法,朴素貝葉斯分類是貝葉斯分類中最簡單的一種。其分類原理就是利 用貝葉斯公式根據某特征的先驗概率計算出其后驗概率,然后選擇具有最大后驗概率的類作為該特征所屬的類。之 所以稱之為”朴素”,是因為貝葉斯分類只做最原始、最簡單的假設:所有的特征之間是統計獨立的。
1.條件概率公式
條件概率(Condittional probability),就是指在事件B發生的情況下,事件A發生的概率,用P(A|B)來表示。

根據文氏圖可知:在事件B發生的情況下,事件A發生的概率就是P(A∩B)除以P(B)。


同理可得:

所以

全概率公式:如果事件 構成一個完備事件且都有正概率,那么對於任意一個事件B則 有:

2.貝葉斯推斷
根據條件概率和全概率公式,可以得到貝葉斯公式如下 :

P(A)稱為"先驗概率”(Prior probability),即在B事件發生之前,我們對A事件概率的一個判斷。
P(A| B)稱為"后驗概率" (Posterior probability),即在B事件發生之后,我們對A事件概率的重新評估。
P(B |A)/P(B)稱為"可能性函數”(Likely hood), 這是一個調整因子,使得預估概率更接近真實概率。
所以條件概率可以理解為:后驗概率=先驗概率*調整因子
如果”可能性函數">1,意味着"先驗概率"被增強,事件A的發生的可能性變大;
如果"可能性函數"=1,意味着B事件無助於判斷事件A的可能性;
如果”可能性函數"<1,意味着"先驗概率"被削弱,事件A的可能性變小。

3.案例分析(帥,高,上進,性格好,嫁不嫁問題?。。。)
假如:不帥,性格不好,個子矮,不上進的男生,女生選擇嫁的概率是多少?
即求出:
P(嫁|不帥, 性格不好,不高,不上進)
根據貝葉斯定理,拆成了三個概率的問題
1.P1=P(不帥,性格不好,不高,不上進|嫁)=P(嫁)*P(不帥|嫁)*P(性格不好|嫁)*P(不高|
嫁)*P(不上進|嫁)
2.P(嫁)
3.P2=P (不帥,性格不好,不高,不上進) =P(不帥)*P(性格不好)*P(矮)*P(不上進)
結果: P(嫁|不帥, 性格不好,不高,不上進)=P1*P(嫁)/P2
5.案例代碼實現
生成樣本(兩個方法:隨機生成,靜態手動插入,選其一即可)
1 # 方法1,隨機生成樣本 2 import random 3 def create_Data1(): 4 looks=['帥','不帥'] 5 characters=['好','不好'] #性格 6 heights=['高','矮'] 7 progress=['上進','不上進'] 8 marriages=['嫁','不嫁'] 9 datasets=[] 10 for i in range(0,20): 11 dataset = []#創建樣本 12 dataset.append(random.choice(looks)) #每個樣本隨機選擇長相 13 dataset.append(random.choice(characters))#每個樣本隨機選擇性格 14 dataset.append(random.choice(heights)) #每個樣本隨機選擇高矮 15 dataset.append(random.choice(progress))#每個樣本隨機選擇上不上進 16 dataset.append(random.choice(marriages))#每個樣本隨機選擇嫁不嫁 17 print(dataset) 18 datasets.append(dataset)#將每一組樣本加入到樣本集中 19 print(datasets) 20 return datasets
1 # 方法2 指定數據樣本 2 import random 3 def create_Data(): 4 datasets=[ 5 ['帥','不好','矮','不上進','不嫁'], 6 ['不帥','好','矮','上進','不嫁'], 7 ['帥','好','矮','上進','嫁'], 8 ['不帥','好','高','上進','嫁'], 9 ['帥','不好','矮','上進','不嫁'], 10 ['不帥','不好','矮','不上進','不嫁'], 11 ['帥','好','高','不上進','嫁'], 12 ['不帥','好','高','上進','嫁'], 13 ['帥','好','高','上進','嫁'], 14 ['不帥','不好','高','上進','嫁'], 15 ['帥','好','矮','不上進','不嫁'], 16 ['帥','好','矮','不上進','不嫁'] 17 ] 18 return datasets
1 # 計算函數 2 def compute_threeProb(datasets,c1,c2,c3,c4,c5):# 傳入訓練數據集,需要判斷的數據(帥不帥,性格好不好,高還是矮,上不上進,嫁不嫁) 3 C5_count=0 #滿足c5條件的數據條數 4 Result_count=0 #滿足c5條件下且滿足需要判斷的四個特征的個數 5 p3_count=0 #計算樣本中符合要判斷的四個特征的個數 6 Allcount=len(datasets) #數據樣本條數 7 for dataset in datasets: 8 #滿足c5條件的數據條數 9 if dataset[4]==c5: 10 C5_count+=1 11 #該類別下滿足需要判斷的四個特征的個數 12 if dataset[0]==c1 and dataset[1]== c2 and dataset[2]==c3 and dataset[3]==c4: 13 Result_count+=1 14 #計算樣本中符合要判斷的四個特征的個數 15 if dataset[0] == c1 and dataset[1] == c2 and dataset[2] == c3 and dataset[3] == c4: 16 p3_count+=1 17 18 p1=(C5_count/Allcount)*(Result_count/C5_count) #類似 P(不帥,性格不好,不高,不上進|嫁) 19 p2=C5_count/Allcount #類似 P(嫁) 20 p3=p3_count/Allcount #類似 P(不帥,性格不好,不高,不上進) 21 if p3!=0: 22 prob_marriage=p1*p2/p3 23 print(prob_marriage) 24 return prob_marriage 25 else: 26 print("不存在!") 27 return 0
1 # 調用 2 datasets=create_Data() 3 rel=compute_threeProb(datasets,c1='帥',c2='好',c3='矮',c4='上進',c5='嫁') 4 print(f'此情況嫁的概率為:{rel}')
運行結果:

6.優缺點:
優點:
(1) 算法邏輯簡單,易於實現(算法思路很簡單,只要使用貝葉斯公式轉化即可!)
(2)分類過程中時空開銷小(假設特征相互獨立,只會涉及到二維存儲)
缺點:
(1)理論上,朴素貝葉斯模型與其他分類方法相比具有最小的誤差率,但是實際上並非總是如此,
這是因為朴素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在
屬性個數比較多或者屬性之間相關性較大時,分類效果不好。
(2)在屬性相關性較小時,朴素貝葉斯性能最為良好,對於這一點,有半朴素貝葉斯之類的算法
通過考慮部分關聯性適度改進。
