揭秘《庆余年算法番外篇》续集:范闲通过最大似然法推理找到火烧史家镇的凶手

揭秘《庆余年算法番外篇》:范闲通过贝叶斯推理找到太子火烧使家镇的证据
上次写了这篇文章之后,很多留言说开了上帝视角,先假设了二皇子和太子有罪,这次通过最大似然法进行推导。

方法介绍:

最大似然法是一种在概率统计中广泛使用的参数估计方法。该方法基于一组已知的样本数据,旨在寻找能够以最高概率生成这些数据的模型参数。通过最大化似然函数,即可确定最合适的参数值,从而使得模型最好地拟合观察数据。以下是具体分析:

方法介绍:

最大似然法的核心在于构建似然函数,该函数反映了在不同参数下,观察到的样本数据出现的概率。通过寻找使似然函数达到最大值的参数,可以获得参数的最大似然估计。

  • 定义与原理:
    最大似然法的核心在于构建似然函数,该函数反映了在不同参数下,观察到的样本数据出现的概率。
    通过寻找使似然函数达到最大值的参数,可以获得参数的最大似然估计。
  • 前提条件:
    需要有一个未知参数的概率分布模型,以及由该模型生成的一定数量的样本点。
    采样需满足独立同分布的假设条件。
  • 数学表达:
    对于离散型总体,似然函数表现为概率质量函数的连乘形式;而对于连续型总体,则涉及到概率密度函数的类似处理。
    为便于计算,通常对似然函数取对数,转换为对数似然函数,然后通过求导和置零来求解未知参数。
  • 性质:
    最大似然估计具有泛函不变性,即如果某个函数的MLE已知,则其单调函数的MLE也可直接求解。
    在样本量足够大的情况下,最大似然估计接近最小方差,并且趋于正态分布。
  • 应用范围:
    最大似然法广泛应用于统计学、机器学习等领域,特别是在建立系统发生树等生物学研究中非常关键。
    在实际应用中,最大似然法常用于估计如高斯分布等各类概率分布模型的参数。
  • 优缺点:
    优点是理论基础坚实,适用范围广,当样本量足够大时,估计结果准确且具有良好的统计性质。
    缺点是在样本量不足或数据有偏时可能导致估计偏差,且计算复杂度较高,特别是在面对大量参数和复杂模型时。
  • 注意事项和考虑因素:
  • 确保样本质量:高质量的样本数据是进行准确估计的前提。
  • 注意模型选择:不同的模型适用于不同类型的数据分布,选择错误的模型可能导致估计结果不准确。
  • 计算资源:最大似然估计在处理复杂模型时可能需要较大的计算力,尤其是在优化似然函数时可能需要高性能计算支持。

剧情背景

在《庆余年》中,史家镇突发火灾,造成了严重的损失。范闲受命调查此事,发现背后可能涉及到太子、鉴查院、皇帝和长公主等多方势力。为了找出真凶,范闲决定使用最大似然估计法,通过现有的证据逐步推断出最有可能的嫌疑人。

在这里插入图片描述
在这里插入图片描述

定义条件概率

我们定义每个证据在不同嫌疑人为真凶的情况下的条件概率(增加一些推导),鉴查院跟范闲是一伙的可以排除,庆帝也排除,他如果不想让范闲查当时就没必要派他去北齐,还剩下二皇子、大皇子、长公主。

  1. 史家镇信息:史家镇除了二皇子和长公主,范闲还跟太子说过,二皇子和长公主作为关联方各自的概率为40%,太子20%。
  2. 人证史阐立:作为史家镇唯一幸存者,太子处处针对史阐立,并且史阐立还见过太子的人在案发地点周围,所以太子的概率为90%,长公主和二皇子各为5%。
  3. 作案条件:二皇子和太子各40%,长公主不在京都,作案能力较弱,概率为20%。
  4. 作案手法:二皇子以往都是派剑客行刺,从不放火,太子身边没剑客,长公主不确定,所以二皇子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}')

结果与分析:

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 21:40:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 21:40:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 21:40:03       87 阅读
  4. Python语言-面向对象

    2024-06-06 21:40:03       96 阅读

热门阅读

  1. Flask的模块化实践

    2024-06-06 21:40:03       24 阅读
  2. Flask启动重复注册schedule问题

    2024-06-06 21:40:03       29 阅读
  3. LeetCode-239.滑动窗口最大值

    2024-06-06 21:40:03       26 阅读
  4. Napster诞生25周年:文件共享革命的引领者

    2024-06-06 21:40:03       31 阅读
  5. ZCC5429 异步升压芯片

    2024-06-06 21:40:03       35 阅读
  6. B站播放数量如何实现,高并发读写计数难点

    2024-06-06 21:40:03       29 阅读