Bootstrap

《庆余年算法番外篇》:范闲通过贝叶斯推理找到太子火烧史家镇的证据

剧情背景

在这里插入图片描述

在《庆余年2》中史家镇是李云睿和二皇子向北齐走私的重要通道,太子派人把史家镇烧成灰烬,最后嫁祸于二皇子,加大范闲对二皇子的恨意,坐收渔翁之利,意图销毁所有证据。范闲接到任务,需要在被毁的镇子里找到蛛丝马迹,通过贝叶斯推理分析这些线索,找出太子犯罪的确凿证据。
在这里插入图片描述

场景描述

在这里插入图片描述
范闲到达被火烧过的镇子,开始寻找可能的线索。他知道凶手非常狡猾,留下的线索非常隐蔽。范闲决定利用贝叶斯推理来整理和分析这些线索,以找到关键证据。

数据收集与预处理

范闲在镇上收集了一系列线索,包括:

  • 目击者的证词:一些幸存者描述了火灾发生的情况。
  • 物理证据:镇上残留的烧焦物、脚印等。
  • 时间线索:火灾发生的具体时间。

范闲将这些线索整理成一个大表格,每一行代表一个线索。

使用贝叶斯推理分析线索

贝叶斯推理是一种统计方法,通过已知的证据来更新对某个事件的概率估计。范闲可以利用贝叶斯推理来分析所有线索,找出最可能的证据。

贝叶斯定理公式

在这里插入图片描述

  • ( P(A|B) ):在证据B出现的情况下,事件A发生的概率(后验概率)。
  • ( P(B|A) ):在事件A发生的情况下,证据B出现的概率(似然)。
  • ( P(A) ):事件A发生的先验概率。
  • ( P(B) ):证据B出现的概率。

先验概率

在京城能防火烧镇的人猜测只有太子和二皇子,所以设置

  • 太子有罪的初始概率 𝑃(𝐴) 为0.5
  • 二皇子有罪的初始概率 𝑃(𝐴) 为0.5

确定线索的似然概率和总体概率

数据来源

为了确定这些线索的似然概率,范闲参考类似情况下的历史数据。例如,在100起火灾案件中,如果80起案件中都发现了相关人员的存在,那么这个线索的似然概率就是0.8。具体步骤如下:

1. 线索1:在镇上发现太子的手下的似然概率

假设在过去的100起类似案件中,90起案件中都有罪犯的手下出现在现场,那么线索1的似然概率 ( P(B1|A) ) 可以被估计为0.9。这表示如果太子确实是罪犯,那么镇上发现他的手下的可能性很高。

2. 线索2:目击者看到可疑火光的似然概率

假设在过去的100起火灾案件中,70起案件中目击者报告看到可疑的火光,那么线索2的似然概率 ( P(B2|A) ) 可以被估计为0.7。如果太子是罪犯,那么目击者看到可疑火光的可能性也较高。

3. 线索3:发现密信与太子府有关联的似然概率

假设在过去的100起类似案件中,80起案件中发现了类似的密信与罪犯来往,那么线索3的似然概率 ( P(B3|A) ) 可以被估计为0.8。如果太子是罪犯,那么发现密信的可能性也较高。

确定线索的总体概率

这些概率基于通常在事故现场找到这些线索的概率假设:

  • 线索1的总体概率 ( P(B1) ) 是 0.2。通常在事故现场发现相关人员的概率。
  • 线索2的总体概率 ( P(B2) ) 是 0.3。通常在事故现场目击者看到可疑火光的概率。
  • 线索3的总体概率 ( P(B3) ) 是 0.1。通常在事故现场发现密信的概率。

贝叶斯推理计算

# 先验概率:太子和二皇子有罪的初始概率
P_A = 0.5
P_B = 0.5

# 线索的似然概率
P_B1_given_A = 0.9  # 线索1:太子的手下在场
P_B2_given_A = 0.7  # 线索2:目击者看到火光
P_B3_given_A = 0.8  # 线索3:发现密信

# 线索的总体概率
P_B1 = 0.2
P_B2 = 0.3
P_B3 = 0.1

# 使用贝叶斯定理更新后验概率
def bayesian_inference(P_prior, P_likelihood, P_evidence):
    return (P_likelihood * P_prior) / P_evidence

# 计算每个线索对太子有罪的支持
P_A_given_B1 = bayesian_inference(P_A, P_B1_given_A, P_B1)
P_A_given_B2 = bayesian_inference(P_A, P_B2_given_A, P_B2)
P_A_given_B3 = bayesian_inference(P_A, P_B3_given_A, P_B3)

# 综合所有线索
P_A_combined = P_A_given_B1 * P_A_given_B2 * P_A_given_B3
P_A_final_normalized = P_A_combined / (P_A_combined + (1 - P_A_combined))

# 计算二皇子有罪的概率(假设没有发现线索)
P_B_given_B1 = bayesian_inference(P_B, 1 - P_B1_given_A, P_B1)
P_B_given_B2 = bayesian_inference(P_B, 1 - P_B2_given_A, P_B2)
P_B_given_B3 = bayesian_inference(P_B, 1 - P_B3_given_A, P_B3)

P_B_combined = P_B_given_B1 * P_B_given_B2 * P_B_given_B3
P_B_final_normalized = P_B_combined / (P_B_combined + (1 - P_B_combined))

print(f"综合所有线索后,太子有罪的概率: {P_A_final_normalized:.2f}")
print(f"综合所有线索后,二皇子有罪的概率: {P_B_final_normalized:.2f}")

计算结果解释

  1. 线索1:太子的手下在场
    在这里插入图片描述

  2. 线索2:目击者看到火光
    在这里插入图片描述

  3. 线索3:发现太子府密信
    在这里插入图片描述

综合这些线索:

在这里插入图片描述

归一化后的结果:

在这里插入图片描述

对于二皇子的计算,假设没有找到直接线索:

在这里插入图片描述

综合这些线索:

在这里插入图片描述
归一化后的结果:

在这里插入图片描述

场景细节

  1. 范闲到达镇上:范闲仔细查看火灾现场,收集所有可能的线索。
  2. 数据分析:范闲将线索整理成数据,使用贝叶斯推理进行分析。
  3. 证据确认:通过贝叶斯推理,范闲找到了支持太子有罪的关键证据,同时分析二皇子的无罪概率。
  4. 揭露真相:范闲将证据带回,揭露了太子的罪行,避免了一场冤案。

总结

结果展示

角色初始概率 ( P(A) )证据后概率
太子0.50.91
二皇子0.50.13

通过这个具体场景,涨知识啦,能更清晰的掌握贝叶斯概念和应用场景

;