机器学习(八):贝叶斯网络——福尔摩斯推理、草地喷水器推断

博客园   2023-05-25 17:39:51

实验4 贝叶斯网络


(资料图)

一、预备知识

二、实验目的

掌握贝叶斯网络算法的原理及设计;

掌握利用贝叶斯网络算法解决推理分析。

三、实验内容

福尔摩斯先生在办公室接到了他邻居华生的电话P(W=T)。华生告诉他:他的家里可能进了窃贼P(B=T),因为他家的警铃响了P(A=T)被告知有窃贼闯入,福尔摩斯迅速开车回家。在路上,他听广播家那里发生了地震。请问他应该回家抓贼还是迅速撤离该地区以躲避地震?

2.

1.计算草地是湿的情况下,下雨的概率?

2.草地是湿的情况下,自动喷水的概率?

四、操作方法和实验步骤

问题 1:福尔摩斯推理

1.搭建模型

from pgmpy.models import BayesianNetworkfrom pgmpy.factors.discrete import TabularCPDfrom pgmpy.inference import VariableEliminationmodel = BayesianNetwork([("B", "A"), ("E", "A"), ("A", "W"), ("E", "R")])cpd_1 = TabularCPD(variable="B", variable_card=2, values=[[0.9], [0.1]])cpd_2 = TabularCPD(variable="E", variable_card=2, values=[[0.99], [0.01]])cpd_A = TabularCPD(variable="A", variable_card=2,                   values=[[0.99, 0.1, 0.1, 0.01],                           [0.01, 0.9, 0.9, 0.99]],                   evidence=["E", "B"],#父节点                   evidence_card=[2, 2])#警铃cpd_W = TabularCPD(variable="W", variable_card=2,                   values=[[0.99, 0.35],                           [0.01, 0.65]],                   evidence=["A"],#父节点                   evidence_card=[2])#华生致电福尔摩斯cpd_R = TabularCPD(variable="R", variable_card=2,                     values=[[0.999, 0.01],                            [0.001, 0.99]],                     evidence=["E"],#父节点                     evidence_card=[2])#广播播报地震model.add_cpds(cpd_1, cpd_2, cpd_A, cpd_W, cpd_R)infer = VariableElimination(model)print(infer.query(variables=["B"],evidence={"A":1}))print(infer.query(variables=["E"],evidence={"A":1,"R":1}))print(infer.query(variables=["B"],evidence={"A":1,"R":1}))

2.计算概率

问题2:草地喷水器推理

1.搭建模型

model = BayesianNetwork([("R", "S"), ("R", "G"), ("S", "G")])cpd_1 = TabularCPD(variable="R", variable_card=2, values=[[0.8], [0.2]])cpd_S = TabularCPD(variable="S", variable_card=2,                   values=[[0.6, 0.99],                           [0.4, 0.01]],                   evidence=["R"],#父节点                   evidence_card=[2])cpd_G = TabularCPD(variable="G", variable_card=2,                   values=[[1.0, 0.2, 0.1, 0.01],                           [0.0, 0.8, 0.9, 0.99]],                   evidence=["S", "R"],#父节点                   evidence_card=[2, 2])#警铃                   model.add_cpds(cpd_1, cpd_S, cpd_G)infer = VariableElimination(model)print(infer.query(variables=["R"],evidence={"G":1}))print(infer.query(variables=["S"],evidence={"G":1}))

2.计算概率

五、实验结果和分析

问题1:福尔摩斯推理

(1)警铃A响了,那么窃贼入室B的概率是84.12%

(2)之后再路上听广播说发生了地震,那么发生地震的概率是98.92%,是窃贼入室的概率是11.75%

问题2:草地喷水器推理

(1)草地是湿的情况下,下雨的概率是35.77%

(2)草地是湿的情况下,自动喷水的概率64.67%