揭秘《庆余年算法番外篇》:范闲通过贝叶斯推理找到太子火烧使家镇的证据
上次写了这篇文章之后,很多留言说开了上帝视角,先假设了二皇子和太子有罪,这次通过最大似然法进行推导。
方法介绍:
最大似然法是一种在概率统计中广泛使用的参数估计方法。该方法基于一组已知的样本数据,旨在寻找能够以最高概率生成这些数据的模型参数。通过最大化似然函数,即可确定最合适的参数值,从而使得模型最好地拟合观察数据。以下是具体分析:
方法介绍:
最大似然法的核心在于构建似然函数,该函数反映了在不同参数下,观察到的样本数据出现的概率。通过寻找使似然函数达到最大值的参数,可以获得参数的最大似然估计。
- 定义与原理:
最大似然法的核心在于构建似然函数,该函数反映了在不同参数下,观察到的样本数据出现的概率。
通过寻找使似然函数达到最大值的参数,可以获得参数的最大似然估计。 - 前提条件:
需要有一个未知参数的概率分布模型,以及由该模型生成的一定数量的样本点。
采样需满足独立同分布的假设条件。 - 数学表达:
对于离散型总体,似然函数表现为概率质量函数的连乘形式;而对于连续型总体,则涉及到概率密度函数的类似处理。
为便于计算,通常对似然函数取对数,转换为对数似然函数,然后通过求导和置零来求解未知参数。 - 性质:
最大似然估计具有泛函不变性,即如果某个函数的MLE已知,则其单调函数的MLE也可直接求解。
在样本量足够大的情况下,最大似然估计接近最小方差,并且趋于正态分布。 - 应用范围:
最大似然法广泛应用于统计学、机器学习等领域,特别是在建立系统发生树等生物学研究中非常关键。
在实际应用中,最大似然法常用于估计如高斯分布等各类概率分布模型的参数。 - 优缺点:
优点是理论基础坚实,适用范围广,当样本量足够大时,估计结果准确且具有良好的统计性质。
缺点是在样本量不足或数据有偏时可能导致估计偏差,且计算复杂度较高,特别是在面对大量参数和复杂模型时。 - 注意事项和考虑因素:
- 确保样本质量:高质量的样本数据是进行准确估计的前提。
- 注意模型选择:不同的模型适用于不同类型的数据分布,选择错误的模型可能导致估计结果不准确。
- 计算资源:最大似然估计在处理复杂模型时可能需要较大的计算力,尤其是在优化似然函数时可能需要高性能计算支持。
剧情背景
在《庆余年》中,史家镇突发火灾,造成了严重的损失。范闲受命调查此事,发现背后可能涉及到太子、鉴查院、皇帝和长公主等多方势力。为了找出真凶,范闲决定使用最大似然估计法,通过现有的证据逐步推断出最有可能的嫌疑人。
定义条件概率
我们定义每个证据在不同嫌疑人为真凶的情况下的条件概率(增加一些推导),鉴查院跟范闲是一伙的可以排除,庆帝也排除,他如果不想让范闲查当时就没必要派他去北齐,还剩下二皇子、大皇子、长公主。
- 史家镇信息:史家镇除了二皇子和长公主,范闲还跟太子说过,二皇子和长公主作为关联方各自的概率为40%,太子20%。
- 人证史阐立:作为史家镇唯一幸存者,太子处处针对史阐立,并且史阐立还见过太子的人在案发地点周围,所以太子的概率为90%,长公主和二皇子各为5%。
- 作案条件:二皇子和太子各40%,长公主不在京都,作案能力较弱,概率为20%。
- 作案手法:二皇子以往都是派剑客行刺,从不放火,太子身边没剑客,长公主不确定,所以二皇子20%,太子和长公主各40%。
代码实现:
# 定义证据的条件概率
evidence = {
'证据1': {'太子': 0.2, '二皇子': 0.4, '长公主': 0.4},
'证据2': {'太子': 0.9, '二皇子': 0.05, '长公主': 0.05},
'证据3': {'太子': 0.4, '二皇子': 0.4, '长公主': 0.2},
'证据4': {'太子': 0.4, '二皇子': 0.2, '长公主': 0.4}
}
# 定义嫌疑人列表
suspects = ['太子', '二皇子', '长公主']
# 计算每个嫌疑人的联合概率
def calculate_joint_probability(suspect, evidence):
joint_prob = 1
for ev in evidence:
joint_prob *= evidence[ev][suspect]
return joint_prob
# 计算所有嫌疑人的联合概率
joint_probabilities = {}
for suspect in suspects:
joint_probabilities[suspect] = calculate_joint_probability(suspect, evidence)
# 找出联合概率最大的嫌疑人
most_likely_suspect = max(joint_probabilities, key=joint_probabilities.get)
print(f'最有可能的真凶是: {most_likely_suspect}')
# 打印所有嫌疑人的联合概率
for suspect, prob in joint_probabilities.items():
print(f'{suspect} 的联合概率: {prob}')