基于pgmpy模块的贝尔斯网络实现

124 阅读2分钟

一、引

pgmpy 是一款基于python的概率图模型包,主要包括贝尔斯网络和马尔可夫蒙特卡洛等常见概率图模型的实现以及推断方法。 以学生获得的推荐信的质量为例来构造贝尔斯网络。 相关特征之间的DAG和概率表如图所示:

image.png

由图可知,考试难度、个人天赋都会影响成绩,另外个人天赋也会影响SAT分数,而成绩会直接影响推荐信的质量。

二、代码实现

1、构建模型模型框架,并指定变量之间的关系。

`  
 from pgmpy.factors.discrete import TabularCPD
 from pympy.models import BayesianModel
 letter_model = BaysesianModel([('D','G'),('I','G'),('G','L'),('I','S')] #指定概率模型图
 `
 

2、构建各个节点的条件概率分布,同时需要指定相关参数

#学生成绩的条件概率分布
grade_cpd = TabularCPD(
variable='G', # 节点名称
variable_card=3, # 节点取值个数
values=[[0.3, 0.05, 0.9, 0.5], # 该节点的概率表
[0.4, 0.25, 0.08, 0.3],
[0.3, 0.7, 0.02, 0.2]],
evidence=['I', 'D'], # 该节点的依赖节点
evidence_card=[2, 2] # 依赖节点的取值个数)   
#考试难度的条件概率分布
difficulty_cpd = TabularCPD(
        variable='D',
        variable_card=2,
        values=[[0.6], [0.4]])
#个人天赋的条件概率分布
intel_cpd = TabularCPD(
        variable='I',
        variable_card=2,
        values=[[0.7], [0.3]])
#推荐信质量的条件概率分布
letter_cpd = TabularCPD(
        variable='L',
        variable_card=2,
        values=[[0.1, 0.4, 0.99],
        [0.9, 0.6, 0.01]],
        evidence=['G'],
        evidence_card=[3])
#SAT考试分数的条件概率分布
sat_cpd = TabularCPD(
        variable='S',
        variable_card=2,
        values=[[0.95, 0.2],
        [0.05, 0.8]],
        evidence=['I'],
        evidence_card=[2])  

3、将各个节点添加到模型中

`将各节点添加到模型中,构建贝叶斯网络
letter_model.add_cpds(
grade_cpd, 
difficulty_cpd,
intel_cpd,
letter_cpd,
sat_cpd)
#导入pgmpy贝叶斯推断模块
from pgmpy.inference import VariableElimination
#贝叶斯网络推断
letter_infer = VariableElimination(letter_model)
#天赋较好且考试不难的情况下推断该学生获得推荐信质量的好坏
prob_L = letter_infer.query(
        variables=['L'],
        evidence={'I': 1, 'D': 0}) # 指定上层节点的取值,即evidence
print(prob_L)`
运行结果:

image.png

上图显示,在天赋较好且考试不难的情况下推断该学生获得推荐信质量好的概率为0.8582,差的概率为0.1418。 以上就是基于基于pgmpy的贝尔斯网络实现。