概念和定义
概率 (Probability)
- 定义: 概率是衡量事件发生可能性的数值,范围从 0 到 1。
- 公式:
条件概率 (Conditional Probability)
- 定义: 在事件 已经发生的条件下,事件 发生的概率。
- 公式:
- 前提条件: 事件 已发生且 。
联合概率 (Joint Probability)
- 定义: 两个或多个事件同时发生的概率。
- 公式:
- 前提条件:
- 对于相关事件:
- 对于独立事件:
全概率公式 (Total Probability Theorem)
- 定义: 计算一个事件在所有可能条件下发生的总概率。
- 公式:
- 前提条件: 事件 形成一个完备事件组。
贝叶斯定理 (Bayes’ Theorem)
- 定义: 根据已知的结果更新某事件的概率。
- 公式:
- 前提条件: 需要已知 , , 和 。
术语解释
-
先验概率 (Prior Probability):
- 定义: 先验概率是指在获得新证据之前,某事件发生的概率。
- 英文: Prior Probability
- 公式:
- 例子: 在总体人群中,一个人有流感的先验概率为 5%。
-
似然 (Likelihood):
- 定义: 似然是指在假设某事件已发生的条件下,观察到某证据的概率。
- 英文: Likelihood
- 公式:
- 例子: 如果 Alice 有流感,那么她出现流感症状的概率为 90%。
-
后验概率 (Posterior Probability):
- 定义: 后验概率是指在获得新证据后,某事件发生的更新概率。
- 英文: Posterior Probability
- 公式:
- 例子: 在已知 Alice 出现流感症状的情况下,她有流感的概率为 45%。
贝叶斯定理推导
-
条件概率公式: 根据条件概率公式,我们有:
-
联合概率的对称性: 由联合概率的对称性,我们知道:
-
条件概率的另一种形式: 同样,根据条件概率的定义,我们可以写出:
-
联合概率表示: 通过上面的公式,我们可以得到联合概率的另一种表示形式:
-
代入条件概率公式: 将上述联合概率的表达式代入条件概率公式 ( 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) )。
计算步骤:
-
先验概率:
-
似然:
-
总概率:
-
使用贝叶斯定理:
因此,在已知 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