scikit-learn機器學習(五)--條件概率,全概率和貝葉斯定理及python實現
阿新 • • 發佈:2019-02-12
在理解貝葉斯之前需要先了解一下條件概率和全概率,這樣才能更好地理解貝葉斯定理
一丶條件概率
條件概率定義:已知事件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出現在第三個子集中的概率
結果:
這只是一個簡單的例子,可以筆算試一下 看看是不是這個結果。程式碼還能優化,自己才疏學淺,也是個渣