pgmpy--Bayesian Model初步学习
前言
贝叶斯网络又称信度网络,是Bayes方法的扩展,是目前不确定知识表达和推理领域最有效的理论模型之一。编写本文的此刻,作者刚刚入门贝叶斯网络,希望通过以下例子对贝叶斯网进行初步入门,与大家共同进步。代码及范例来源为:
案例
案例概述
下面展示两种应用情形,由浅入深,逐步了解并应用贝叶斯网络。
案例1–已知结构、已知参数
针对已知结构及参数,先采用BayesianModel构造贝叶斯网结构,然后通过TabularCPD构造条件概率分布CPD(condition probability distribution)表格,最后将CPD数据添加到贝叶斯网络结构中,完成贝叶斯网络的构造。这里主要用到两个函数:BayesianModel及TabularCPD,通过一下代码可以查询其详细的输入及用法,这里就不详述了。
BayesianModel?
TabularCPD?
具体代码如下:
#coding: utf-8
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
cancer_model = BayesianModel([
('pollution', 'cancer'),
('smoker', 'cancer'),
('cancer', 'x-ray'),
('cancer', 'dyspnoea')])
cpd_pollution = TabularCPD(variable='pollution',
variable_card=2,
values=[[0.9],[0.1]])
cpd_smoker = TabularCPD(variable='smoker',
variable_card=2,
values=[[0.3],[0.7]])
cpd_cancer = TabularCPD(variable='cancer',
variable_card=2,
values=[[0.03, 0.05, 0.001, 0.02], [0.97, 0.95, 0.999, 0.98]],
evidence=['smoker', 'pollution'],
evidence_card=[2, 2])
cpd_x_ray = TabularCPD(variable='x-ray',
variable_card=2,
values=[[0.9, 0.2], [0.1, 0.8]],
evidence=['cancer'],
evidence_card=[2])
cpd_dyspnoea = TabularCPD(variable='dyspnoea',
variable_card=2,
values = [[0.65, 0.3],[0.35, 0.7]],
evidence=['cancer'],
evidence_card=[2])
cancer_model.add_cpds(cpd_pollution, cpd_smoker, cpd_cancer, cpd_x_ray, cpd_dyspnoea)
构造完成贝叶斯网络后,如何进行预测呢?有以下两种方式:
1.直接获取结果–predict
import pandas
A = pd.DataFrame(data=[[1, 1, 1, 1]], columns=['pollution', 'smoker', 'x-ray', 'dyspnoea'])
result = cancer_model.predict(A)
2.获取概率值–predict_probability
经过多次调试,在这种CPD构造贝叶斯网络中,采用predict_probability方式会报错,具体错误原因未知,往路过的大神指点。
案例2–已知结构、未知参数
针对已知结构,未知参数,可以先建立Beyasian网结构,然后将样本导入训练。
import numpy as np
import pandas as pd
from pgmpy.models import BayesianModel
values = pd.DataFrame(np.random.randint(low=0, high=2, size=(100, 5)), columns=['A', 'B', 'C', 'D', 'E'])
train_data = values[:80]
predict_data = values[80:]
model = BayesianModel([('A', 'B'), ('C', 'B'), ('C', 'D'), ('B', 'E')])
model.fit(values)
构造训练完成贝叶斯网络后,可以直接采用例子1中两种方式进行预测。