嫁不嫁問題讓你通俗易懂的了解朴素貝葉斯分類


概述

貝葉斯分類算法是統計學的一種概率分類方法,朴素貝葉斯分類是貝葉斯分類中最簡單的一種。其分類原理就是利 用貝葉斯公式根據某特征的先驗概率計算出其后驗概率,然后選擇具有最大后驗概率的類作為該特征所屬的類。之 所以稱之為”朴素”,是因為貝葉斯分類只做最原始、最簡單的假設:所有的特征之間是統計獨立的。 

 

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)在屬性相關性較小時,朴素貝葉斯性能最為良好,對於這一點,有半朴素貝葉斯之類的算法
通過考慮部分關聯性適度改進。

  

  

 

 


免責聲明!

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



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