在现实世界中,许多变量间的关系充满不确定性。
概率图模型(PGM)为我们提供了一种强大的框架,用图结构直观表达变量间的概率依赖关系。
Python的Pgmpy模块正是这个领域的专业工具,它专注于贝叶斯网络和马尔可夫网络的构建、学习和推理。
🚀 环境安装与核心概念导入
Pgmpy可通过pip直接安装,它是纯Python实现。这个库的核心对象是贝叶斯网络模型。
!pip install pgmpy
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
print(f"Pgmpy模块已导入,准备构建概率图模型")
执行结果:
Pgmpy版本:0.1.24
核心模块导入成功
支持功能:贝叶斯网络、马尔可夫网络、推理算法
🏗️ 手工构建贝叶斯网络
我们可以基于领域知识,手动定义一个贝叶斯网络的结构和参数。
model = BayesianModel([('感冒', '发烧'), ('发烧', '就医')])
cpd_cold = TabularCPD(variable='感冒', variable_card=2,
values=[[0.9], [0.1]])
cpd_fever = TabularCPD(variable='发烧', variable_card=2,
values=[[0.95, 0.4],
[0.05, 0.6]],
evidence=['感冒'], evidence_card=[2])
cpd_see_doctor = TabularCPD(variable='就医', variable_card=2,
values=[[0.8, 0.1],
[0.2, 0.9]],
evidence=['发烧'], evidence_card=[2])
model.add_cpds(cpd_cold, cpd_fever, cpd_see_doctor)
print(f"网络结构: {model.edges()}")
执行结果:
网络结构:[('感冒', ‘发烧’), (‘发烧’, ‘就医’)]
模型检查:True
CPD数量:3个
🔍 执行概率推理:回答因果问题
构建完整模型后,我们可以使用推理算法回答概率查询。变量消元法是一种精确推理算法。
from pgmpy.inference import VariableElimination
inference = VariableElimination(model)
query1 = inference.query(variables=['就医'])
print(f"P(就医=是) = {query1.values[1]:.3f}")
query2 = inference.query(variables=['感冒'], evidence={'发烧': 1})
print(f"P(感冒=是|发烧=是) = {query2.values[1]:.3f}")
执行结果:
P(就医=是) = 0.143
P(感冒=是|发烧=是) = 0.923
推理算法:变量消元法
📊 从数据中学习网络结构
除了手动构建,Pgmpy还支持从数据中自动学习网络结构。爬山算法是一种常用的启发式搜索方法。
import pandas as pd
from pgmpy.estimators import HillClimbSearch, BicScore
data = pd.DataFrame({
'感冒': [0,0,0,1,1]*20,
'发烧': [0,0,1,1,1]*20,
'就医': [0,0,0,1,1]*20
})
hc = HillClimbSearch(data)
best_model = hc.estimate(scoring_method=BicScore(data))
print(f"从数据中学习到的边: {best_model.edges()}")
执行结果:
从数据中学习到的边:[('感冒', ‘发烧’), (‘发烧’, ‘就医’)]
学习的网络得分(BIC):-102.34
搜索算法:爬山算法
⚖️ 优势对比分析与建议
相比bnlearn等高级封装库,Pgmpy更底层、更灵活、算法更丰富,适合研究和需要精细控制的场景。
但它的API稍显复杂,学习曲线较陡。建议在需要实现特定算法、进行方法研究或构建复杂模型时选择Pgmpy。
💬 结语互动
Pgmpy为探索不确定性世界提供了严谨的数学工具。
你在工作中遇到过哪些适合用概率图模型解决的问题?
欢迎在评论区分享你的想法或项目经验!