1. 程式人生 > >scikit-learn機器學習(五)--條件概率,全概率和貝葉斯定理及python實現

scikit-learn機器學習(五)--條件概率,全概率和貝葉斯定理及python實現

在理解貝葉斯之前需要先了解一下條件概率和全概率,這樣才能更好地理解貝葉斯定理

一丶條件概率

條件概率定義:已知事件A發生的條件下,另一個事件B發生的概率成為條件概率,即為P(B|A)
這裡寫圖片描述
如圖A∩B那一部分的發生的概率即為P(AB),

P(AB)=發生A的概率*發生A之後發生B的概率=發生B的概率*發生B之後發生A的概率

即:

P(AB)=P(A)*P(B|A)=P(B)*P(A|B)

所以條件概率公式

P(B|A)=P(AB)/P(A)=P(B)*P(A|B)/P(A)

二丶全概率公式

全概率公式就是在樣本空間E中,有一個事件A,而樣本空間被劃分為多個子空間B1,B2,B3…….,對於每一個子空間Bi,發生A事件的概率為:

P(A)=P(Bi)*P(A|Bi)   i=1,2,3......n
也就是:發生Bi的概率*Bi中發生A的概率

那麼整個樣本空間E中發生A的概率即為:每一個樣本子空間中發生A的概率的總和:

P(A)=P(B1)*P(A|B1)+P(B2)*P(A|B2)+.............+P(Bn)*P(A|Bn)

以上就是全概率公式,也可以寫作:
這裡寫圖片描述

全概率公式就是求一個事件在整個樣本中發生的概率

三丶貝葉斯定理

貝葉斯定理不同的是,他是已知一個事件在整個樣本中發生的概率之後,然後求另一個時間發生的概率

比如在A時間發生的情況下,它屬於Bi子樣本空間的概率P(Bi|A),那麼我們就可以根據條件概率公式

來求

發生a事件概率*發生a事件且a時間發生在Bi子樣本的概率=發生Bi的概率*發生Bi之後發生a的概率
即為:**P(Bi|A)*P(A)=P(Bi)*P(A|Bi)**

然後根據全概率公式:
這裡寫圖片描述
所以:

P(Bi/A)=P(Bi)*P(A|Bi)/P(A)

把P(A)帶入上面的式子,可得貝葉斯公式
這裡寫圖片描述

下面我們舉個例子:
在這一系列資料中計算出在第三個子資料集中發生1事件的概率:

python實現:

#建立一個虛擬的資料
def c_data():
    dataset=[
        [1,2,3,5,1],#資料中包含四個子資料
        [1,2,1,1
,8,8], [1,7,2,3,5], [4,8,9,1,1,8,9,3] ] return dataset #計算某一事件A發生的全概率 def compute_prob(dataset,event): #發生的概率 prob_event=0.0 for sub_dataset in dataset: prob_sub=1/len(dataset)#該子集發生的概率 num=len(sub_dataset)#子集的資料個數 data_dict = {}#建立一個字典 for data in sub_dataset: prob=0.0 if data in data_dict: data_dict[data]+=1 else: data_dict[data]=1 if event in data_dict: prob+=data_dict[event]/num#事件在該子集中的出現概率 data_dict.clear()#清空字典用於下一個子集 else: print("沒有該事件") prob_event+=prob*prob_sub #子集發生概率*自己中事件發生概率 return prob_event#返回事件的全概率 #計算事件A發生條件下第幾個子空間sub_dataset發生的概率 def comnpute_prob_sub_dataset(dataset,sub_dataset_id,event): prob_sub_dataset=1/len(dataset)#發生在該子空間的概率 print("發生在該子空間中的概率:%f"%prob_sub_dataset) event_num=dataset[sub_dataset_id].count(event)#該事件在子空間中出現的次數 prob_sub_dataset_event=event_num/len(dataset[sub_dataset_id])#事件在子空間中發生的概率 print("在改子空間中發生事件的概率:%f"%prob_sub_dataset_event) prob_event=compute_prob(dataset,event=event) print("整個樣本發生事件的概率:%f"%prob_event) prob_sub_dataset=(prob_sub_dataset*prob_sub_dataset_event)/prob_event#事件發生在某一子集中的概率 print("概率為:%f"%prob_sub_dataset) return prob_sub_dataset dataset=c_data() comnpute_prob_sub_dataset(dataset,sub_dataset_id=2,event=1)#1出現在第三個子集中的概率

結果:
這裡寫圖片描述

這只是一個簡單的例子,可以筆算試一下 看看是不是這個結果。程式碼還能優化,自己才疏學淺,也是個渣