Datawhale_溫習概率統計(1)——1_古典概型,條件概率,貝葉斯公式

一、古典概率之同班同學至少有一對同一天生日概率

1.1 兩個基本概念

  • 事件概率
    P(A)=mn=AP(A) = \frac{m} {n} = \frac{事件A包含的基本事件數} {基本事件總數}
  • 反事件概率
    P(A)=1P(A)P(\overline{A})=1-P(A)

1.2 問題分析

我們只要求出,每個同學生日都不一樣的概率,然後1減去該概率就是我們要求的概率。

一個班級有K個同學,假定隨機在365天內的某一天出生(極端情況:K個同學均在某一天出生。 也可能出現)。我們需要計算的事件是:
A : K個同學,每個人出生的時間不同。

可以將A 分解成兩部分:
A1: 從365天中 隨機抽取K 天 -->> C365kC^k_{365}
A2: k天中每一天都有一個人出生 -->> 全排列 : k!k!

全事件爲:K個同學在365天中的出生的所有可能,即每個人都有365個可能
365k365^k

1.3 問題求解

因此:
P(A)=A1A2All=C365kk!365k=365!k!(365k)!365k=365!(365k)!365kP(A) = \frac{A_1*A_2}{All}=\frac{C^k_{365}*k!}{365^k}=\frac{365!*k!}{(365-k)!*365^k}=\frac{365!}{(365-k)!*365^k}

python簡單實現:

def n_1(n):
    if n == 1:
        return 1
    return n * n_1(n-1)

def A_mn(m, n):
    return n_1(n) / n_1(n - m)

def C_mn(m, n):
    # A_mn/n_1(m)
    return n_1(n) / (n_1(m) * n_1(n - m))

# 假設有 40 個同學
k=40
p_a = C_mn(k, 365) * n_1(k) / 365**k
print('1 - p_a:', 1 - p_a)
"""
>>> print('1 - p_a:', 1 - p_a)
1 - p_a: 0.891231809817949
"""

由此可知,顯然同班同學至少有一對同一天生日的概率是非常高的。

二、貝葉斯:有一人呈陽性反應,則此人確爲肝癌患者的概率是多少

貝葉斯可以查看之前寫的文章: 圖解貝葉斯定理迭代學習

假定用血清甲胎蛋白法診斷肝癌。
CC : 表示被檢驗者有肝癌這一事件
AA : 表示被檢驗者爲陽性反應這一事件
當前有肝癌的患者被檢測呈陽性反應的概率爲0.95。即 P(AC)=0.95P(A|C) = 0.95
當前非肝癌的患者被檢測呈陰性反應的概率爲0.9。即 P(AC)=0.90P(\overline {A}|\overline {C}) = 0.90
若某人羣中肝癌患者概率爲0.0004,即P(C)=0.0004P(C) = 0.0004,現在有一人呈陽性反應,求此人確爲肝癌患者的概率是多少?

2.1 問題分析

顯然我們要求的是 P(CA)P(C|A)
存在兩個事件:
X1: 被檢測出有肝癌 P(C)=0.0004P(C)=0.0004
X2: 未被檢測出有肝癌P(C)=10.0004P(\overline {C})=1-0.0004

X1的似然度:P(AC)=0.95P(A|C) = 0.95
X2的似然度:P(AC)=0.1P(A|\overline {C}) = 0.1

2.2 問題求解

P(CA)=P(C)P(AC)P(C)P(AC)+P(C)P(AC)=0.00040.950.00040.95+0.99960.1=0.0038P(C|A) = \frac {P(C)P(A|C)} {P(C)P(A|C)+P(\overline {C} )P(A|\overline {C})} =\frac {0.0004*0.95}{0.0004*0.95 + 0.9996*0.1} =0.0038

2.3.1 python貝葉斯框架

參考學習 《貝葉斯思維:統計建模的PYTHON學習法》



class Smpl_bayes():
    def __init__(self, hypos_dct):
        self.d = hypos_dct

    def Upadate(self, data):
        """
        根據似然更新分佈
        """
        for hypo, p in self.d.items():
            like = self.Likelihood(data, hypo)
            self.Mult(hypo, like)
        self.Normalize()

    def Likelihood(self, data, hypo):
    	"""
    	一般似然函數 都依據具體情況而定
    	"""
        like_dct = {
            'A|C' : 0.95,
            'A_|C': 0.05,
            'A|C_': 0.1,
            'A_|C_': 0.9
        }
        like_str = f'{data}|{hypo}'
        return like_dct[like_str]

    def Set(self, hypo, p):
        self.d[hypo] = p 
    
    def Mult(self, hypo, factor):
        self.Set(hypo, self.d.get(hypo, 0) * factor)

    def Normalize(self):
        total = sum(self.d.values())
        for hypo, p in self.d.items():
            self.Set(hypo, p/total)
        

cancer_distr = Smpl_bayes({'C': 0.0004, 'C_': 1-0.0004})
cancer_distr.Upadate('A') # 對事件C update 可以求 P(C|A)  P(C_|A)

cancer_distr.d
"""
>>> cancer_distr.d
{'C': 0.003787123779150887, 'C_': 0.9962128762208491}
"""

基於檢測結果 就 檢測方法評估(後驗概率) 。可見在醫學上僅僅用該檢測方法去確認是肝癌是不可取的需要再借鑑其他指標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章