概念和定义

概率 (Probability)

  • 定义: 概率是衡量事件发生可能性的数值,范围从 0 到 1。
  • 公式:

条件概率 (Conditional Probability)

  • 定义: 在事件 已经发生的条件下,事件 发生的概率。
  • 公式:
  • 前提条件: 事件 已发生且

联合概率 (Joint Probability)

  • 定义: 两个或多个事件同时发生的概率。
  • 公式:
  • 前提条件:
    • 对于相关事件:
    • 对于独立事件:

全概率公式 (Total Probability Theorem)

  • 定义: 计算一个事件在所有可能条件下发生的总概率。
  • 公式:
  • 前提条件: 事件 形成一个完备事件组。

贝叶斯定理 (Bayes’ Theorem)

  • 定义: 根据已知的结果更新某事件的概率。
  • 公式:
  • 前提条件: 需要已知 , , 和

术语解释

  1. 先验概率 (Prior Probability):

    • 定义: 先验概率是指在获得新证据之前,某事件发生的概率。
    • 英文: Prior Probability
    • 公式:
    • 例子: 在总体人群中,一个人有流感的先验概率为 5%。
  2. 似然 (Likelihood):

    • 定义: 似然是指在假设某事件已发生的条件下,观察到某证据的概率。
    • 英文: Likelihood
    • 公式:
    • 例子: 如果 Alice 有流感,那么她出现流感症状的概率为 90%。
  3. 后验概率 (Posterior Probability):

    • 定义: 后验概率是指在获得新证据后,某事件发生的更新概率。
    • 英文: Posterior Probability
    • 公式:
    • 例子: 在已知 Alice 出现流感症状的情况下,她有流感的概率为 45%。

贝叶斯定理推导

  1. 条件概率公式: 根据条件概率公式,我们有:

  2. 联合概率的对称性: 由联合概率的对称性,我们知道:

  3. 条件概率的另一种形式: 同样,根据条件概率的定义,我们可以写出:

  4. 联合概率表示: 通过上面的公式,我们可以得到联合概率的另一种表示形式:

  5. 代入条件概率公式: 将上述联合概率的表达式代入条件概率公式 ( P(A|B) ) 中:

这就是贝叶斯定理的公式:

示例和计算

假设我们有以下情况:

  • 事件 ( A ):Alice 有流感。
  • 事件 ( B ):Alice 出现流感症状。

已知的结果是 Alice 出现了流感症状(事件 ( B ))。我们希望计算在这种情况下,Alice 实际上有流感的概率 ( P(A|B) )。

我们已知:

  • ( P(A) ):在总体人群中,一个人有流感的先验概率为 5%。
  • ( P(B|A) ):如果 Alice 有流感,那么她出现流感症状的概率为 90%。
  • ( P(B) ):在总体人群中,一个人出现流感症状的总概率为 10%。

我们希望计算在已知 Alice 出现流感症状的情况下,她实际上有流感的概率 ( P(A|B) )。

计算步骤:

  1. 先验概率:

  2. 似然:

  3. 总概率:

  4. 使用贝叶斯定理:

因此,在已知 Alice 出现流感症状(已知的结果)的情况下,她实际上有流感的概率为 45%。

Python 实现

# 先验概率
P_A = 0.05  # 在总体人群中,一个人有流感的先验概率
 
# 似然
P_B_given_A = 0.90  # 如果 Alice 有流感,那么她出现流感症状的概率
 
# 总概率
P_B = 0.10  # 在总体人群中,一个人出现流感症状的总概率
 
# 使用贝叶斯定理计算后验概率
P_A_given_B = (P_B_given_A * P_A) / P_B
 
# 输出结果,指明已知的结果是 Alice 出现流感症状
print(f"在已知 Alice 出现流感症状(已知的结果)的情况下,她实际上有流感的概率为 {P_A_given_B:.2f}")

输出:

在已知 Alice 出现流感症状(已知的结果)的情况下,她实际上有流感的概率为 0.45

多次迭代计算

在实际应用中,我们可能会进行多次检测,每次检测的结果都会影响我们的后验概率。下面是一个迭代更新后验概率的示例代码:

代码实现

# 定义初始先验概率和似然
P_A = 0.05  # 初始先验概率,某人有流感的概率
P_B_given_A = 0.90  # 似然,如果某人有流感,检测结果为阳性的概率
P_B_given_not_A = 0.10  # 假阳性率,在没有流感的情况下检测结果为阳性的概率
 
# 定义一个函数来计算后验概率
def bayesian_update(P_A, P_B_given_A, P_B_given_not_A, test_result):
    # 计算总概率 P(B)
    P_not_A = 1 - P_A  # 没有流感的概率
    P_B = P_B_given_A * P_A + P_B_given_not_A * P_not_A
    
    if test_result == 'positive':
        # 使用贝叶斯定理计算后验概率 P(A|B)
        P_A_given_B = (P_B_given_A * P_A) / P_B
    elif test_result == 'negative':
        # 计算 P(not B | A) 和 P(not B | not A)
        P_not_B_given_A = 1 - P_B_given_A
        P_not_B_given_not_A = 1 - P_B_given_not_A
        # 计算总概率 P(not B)
        P_not_B = P_not_B_given_A * P_A + P_not_B_given_not_A * P_not_A
        # 使用贝叶斯定理计算后验概率 P(A|not B)
        P_A_given_B = (P_not_B_given_A * P_A) / P_not_B
    else:
        raise ValueError("Invalid test result. Use 'positive' or 'negative'.")
    
    return P_A_given_B
 
# 模拟多次检测结果
test_results = ['positive', 'positive', 'negative', 'positive', 'negative']
 
# 迭代更新后验概率
for result in test_results:
    P_A = bayesian_update(P_A, P_B_given_A, P_B_given_not_A, result)
    print(f"在检测结果为 {result} 后,Alice 有流感的概率为 {P_A:.4f}")

输出结果

在检测结果为 positive 后,Alice 有流感的概率为 0.3214
在检测结果为 positive 后,Alice 有流感的概率为 0.7652
在检测结果为 negative 后,Alice 有流感的概率为 0.5525
在检测结果为 positive 后,Alice 有流感的概率为 0.8993
在检测结果为 negative 后,Alice 有流感的概率为 0.7831