别再死记硬背了!用Python+Matplotlib画张图,5分钟彻底搞懂贝叶斯公式
用Python+Matplotlib动态图解贝叶斯定理:从公式恐惧到直观掌握
贝叶斯定理被誉为概率论中的"瑞士军刀",但许多初学者面对公式中的P(H|E)、P(E|H)等符号时,常常陷入记忆困境。本文将通过Python代码动态生成可视化图形,带您体验"画图学概率"的奇妙旅程——我们不仅会重现经典的图书馆管理员案例,还将构建可交互的概率面积图,让先验概率、似然函数和后验概率的关系一目了然。
1. 环境准备与基础概念可视化
在开始前,请确保已安装以下Python库:
pip install matplotlib numpy ipywidgets
贝叶斯定理的核心在于 概率更新机制 :当新证据出现时,如何修正原有认知。让我们先用韦恩图呈现基础概念:
import matplotlib.pyplot as plt
from matplotlib_venn import venn2
plt.figure(figsize=(10,5))
venn = venn2(subsets=(3, 2, 1), set_labels=('P(H) 先验概率', 'P(E) 证据概率'))
venn.get_label_by_id('11').set_text('P(E|H) 似然')
plt.title("贝叶斯定理核心概念韦恩图")
plt.show()
这段代码将生成:
- 左侧大圆表示事件H的先验概率
- 右侧大圆表示证据E出现的概率
- 重叠区域展示条件概率P(E|H)
关键理解 :贝叶斯定理本质是计算当黄色区域(证据E)发生时,其中来自蓝色部分(假设H)的比例。
2. 动态构建图书馆管理员案例
回到经典案例,假设:
- 农民与管理员比例 20:1 ⇒ P(农民)=20/21, P(管理员)=1/21
- 管理员中40%符合描述 ⇒ P(E|H)=0.4
- 农民中10%符合描述 ⇒ P(E|¬H)=0.1
用面积图动态展示概率更新:
import numpy as np
def plot_bayes_update(prior, likelihood, not_likelihood):
fig, ax = plt.subplots(figsize=(12,6))
# 先验概率面积
admin_area = prior
farmer_area = 1 - prior
ax.barh(['先验'], [admin_area], color='skyblue', label='管理员')
ax.barh(['先验'], [farmer_area], left=[admin_area], color='lightgreen', label='农民')
# 后验概率计算
evidence_admin = prior * likelihood
evidence_farmer = (1-prior) * not_likelihood
total_evidence = evidence_admin + evidence_farmer
posterior = evidence_admin / total_evidence
# 证据条件下的面积
ax.barh(['后验'], [posterior], color='skyblue')
ax.barh(['后验'], [1-posterior], left=[posterior], color='lightgreen')
ax.set_xlim(0,1)
ax.legend()
plt.title(f"先验概率:{prior:.2f} → 后验概率:{posterior:.2f}")
plt.show()
return posterior
result = plot_bayes_update(prior=1/21, likelihood=0.4, not_likelihood=0.1)
运行后会呈现两个水平堆叠图:
- 先验分布 :显示农民与管理员的原始比例
- 后验分布 :显示符合描述的人群中新比例
关键发现 :虽然管理员个体更可能符合描述,但因农民基数大,最终后验概率仍偏向农民。
3. 交互式概率模拟器
为了更直观感受参数影响,我们创建可调节的交互式可视化:
from ipywidgets import interact
def interactive_bayes(prior, likelihood, not_likelihood):
posterior = plot_bayes_update(prior, likelihood, not_likelihood)
print(f"后验概率更新为: {posterior:.2%}")
interact(interactive_bayes,
prior=(0.01, 0.5, 0.01),
likelihood=(0.01, 1.0, 0.01),
not_likelihood=(0.01, 1.0, 0.01))
调节三个滑块观察:
-
prior:改变管理员初始比例 -
likelihood:调整管理员符合描述的概率 -
not_likelihood:改变农民符合描述的概率
实用技巧
:当
prior*likelihood
>
(1-prior)*not_likelihood
时,后验概率才会超过50%。
4. 进阶应用:医疗检测结果分析
将贝叶斯定理应用到更实际的场景——假设:
- 某疾病发病率P(D)=1%
- 检测准确率P(T|D)=99%
- 误报率P(T|¬D)=5%
可视化真实阳性与假阳性的对比:
def medical_test_visualization():
P_D = 0.01
P_T_given_D = 0.99
P_T_given_notD = 0.05
# 计算各区域面积
true_pos = P_D * P_T_given_D
false_pos = (1-P_D) * P_T_given_notD
total_pos = true_pos + false_pos
# 绘制堆叠条形图
fig, ax = plt.subplots(figsize=(10,4))
ax.bar(['检测阳性'], [true_pos], label='真实患者')
ax.bar(['检测阳性'], [false_pos], bottom=[true_pos], label='健康误诊')
ax.legend()
plt.title(f"阳性预测值: {true_pos/total_pos:.1%}")
plt.show()
medical_test_visualization()
这个可视化清晰展示了:即使检测准确率很高,由于疾病发病率低,阳性结果中假阳性占比仍可能很高。
5. 贝叶斯更新过程动画
最后,我们通过动画展示连续证据下的概率更新过程:
from matplotlib.animation import FuncAnimation
def bayesian_update_animation():
fig, ax = plt.subplots(figsize=(10,6))
x = np.linspace(0, 1, 100)
prior = 0.3
likelihood = lambda x: np.where(x>0.5, 0.8, 0.2)
def update(n):
ax.clear()
current_prior = prior
for _ in range(n):
posterior = (current_prior * 0.8) / (current_prior * 0.8 + (1-current_prior)*0.2)
current_prior = posterior
ax.plot(x, likelihood(x), 'r-', label='似然函数')
ax.axvline(current_prior, color='b', linestyle='--', label=f'当前信念:{current_prior:.2f}')
ax.legend()
ax.set_ylim(0,1)
anim = FuncAnimation(fig, update, frames=10, interval=1000)
plt.close()
return anim
bayesian_update_animation()
这段代码展示了:
- 初始先验概率为30%
- 每次获得支持性证据后,后验概率如何逐步提升
- 似然函数(红色曲线)决定更新强度
专业建议 :在实际项目中,可以封装贝叶斯更新器:
class BayesianUpdater:
def __init__(self, prior):
self.current_belief = prior
def update(self, likelihood, not_likelihood):
numerator = self.current_belief * likelihood
denominator = numerator + (1-self.current_belief)*not_likelihood
self.current_belief = numerator / denominator
return self.current_belief
使用示例:
updater = BayesianUpdater(prior=0.1)
for _ in range(5):
print(f"更新后概率: {updater.update(0.8, 0.2):.2f}")
通过这组可视化工具,您已经构建起对贝叶斯定理的立体认知——下次面对复杂概率问题时,不妨先画出概率面积图,让数学关系自然显现。
更多推荐
所有评论(0)