Datawhale_温习概率统计(1)——1_古典概型,条件概率,贝叶斯公式

文章目录

  • 一、古典概率之同班同学至少有一对同一天生日概率
    • 1.1 两个基本概念
    • 1.2 问题分析
    • 1.3 问题求解
  • 二、贝叶斯:有一人呈阳性反应,则此人确为肝癌患者的概率是多少
    • 2.1 问题分析
    • 2.2 问题求解
      • 2.3.1 python贝叶斯框架

一、古典概率之同班同学至少有一对同一天生日概率

1.1 两个基本概念

  • 事件概率
    P ( A ) = m n = 事 件 A 包 含 的 基 本 事 件 数 基 本 事 件 总 数 P(A) = \frac{m} {n} = \frac{事件A包含的基本事件数} {基本事件总数} P(A)=nm=A
  • 反事件概率
    P ( A ‾ ) = 1 − P ( A ) P(\overline{A})=1-P(A) P(A)=1P(A)

1.2 问题分析

我们只要求出,每个同学生日都不一样的概率,然后1减去该概率就是我们要求的概率。

一个班级有K个同学,假定随机在365天内的某一天出生(极端情况:K个同学均在某一天出生。 也可能出现)。我们需要计算的事件是:
A : K个同学,每个人出生的时间不同。

可以将A 分解成两部分:
A1: 从365天中 随机抽取K 天 -->> C 365 k C^k_{365} C365k
A2: k天中每一天都有一个人出生 -->> 全排列 : k ! k! k!

全事件为:K个同学在365天中的出生的所有可能,即每个人都有365个可能
36 5 k 365^k 365k

1.3 问题求解

因此:
P ( A ) = A 1 ∗ A 2 A l l = C 365 k ∗ k ! 36 5 k = 365 ! ∗ k ! ( 365 − k ) ! ∗ 36 5 k = 365 ! ( 365 − k ) ! ∗ 36 5 k P(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} P(A)=AllA1A2=365kC365kk!=(365k)!365k365!k!=(365k)!365k365!

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
"""

由此可知,显然同班同学至少有一对同一天生日的概率是非常高的。

二、贝叶斯:有一人呈阳性反应,则此人确为肝癌患者的概率是多少

贝叶斯可以查看之前写的文章: 图解贝叶斯定理迭代学习

假定用血清甲胎蛋白法诊断肝癌。
C C C : 表示被检验者有肝癌这一事件
A A A : 表示被检验者为阳性反应这一事件
当前有肝癌的患者被检测呈阳性反应的概率为0.95。即 P ( A ∣ C ) = 0.95 P(A|C) = 0.95 P(AC)=0.95
当前非肝癌的患者被检测呈阴性反应的概率为0.9。即 P ( A ‾ ∣ C ‾ ) = 0.90 P(\overline {A}|\overline {C}) = 0.90 P(AC)=0.90
若某人群中肝癌患者概率为0.0004,即 P ( C ) = 0.0004 P(C) = 0.0004 P(C)=0.0004,现在有一人呈阳性反应,求此人确为肝癌患者的概率是多少?

2.1 问题分析

显然我们要求的是 P ( C ∣ A ) P(C|A) P(CA)
存在两个事件:
X1: 被检测出有肝癌 P ( C ) = 0.0004 P(C)=0.0004 P(C)=0.0004
X2: 未被检测出有肝癌 P ( C ‾ ) = 1 − 0.0004 P(\overline {C})=1-0.0004 P(C)=10.0004

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

2.2 问题求解

P ( C ∣ A ) = P ( C ) P ( A ∣ C ) P ( C ) P ( A ∣ C ) + P ( C ‾ ) P ( A ∣ C ‾ ) = 0.0004 ∗ 0.95 0.0004 ∗ 0.95 + 0.9996 ∗ 0.1 = 0.0038 P(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 P(CA)=P(C)P(AC)+P(C)P(AC)P(C)P(AC)=0.00040.95+0.99960.10.00040.95=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}
"""

基于检测结果 就 检测方法评估(后验概率) 。可见在医学上仅仅用该检测方法去确认是肝癌是不可取的需要再借鉴其他指标。

你可能感兴趣的:(基础)