不确定性推理 构建贝叶斯网络 有错误怎么解决

使用pip工具安装pomegrannate库

!pip install pomegranate
from pomegranate import *

TODO:建立吸烟结点

smoke = Node(DiscreteDistribution({
    "吸烟": 0.5,
    "不吸烟": 0.5,
}), name="吸烟")

TODO:建立支气管炎

bronchitis = Node(ConditionalProbabilityTable([
    ["吸烟", "患支气管炎", 0.6],
    ["吸烟"," 不患支气管炎", 0.4],
    ["不吸烟", "患支气管炎", 0.3],
    ["不吸烟"," 不患支气管炎", 0.7],
], [smoke.distribution]), name="支气管炎")

TODO:建立肺癌

lungCancer = Node(ConditionalProbabilityTable([
    ["吸烟", "患肺癌", 0.1],
    ["吸烟"," 不患肺癌", 0.9],
    ["不吸烟", "患肺癌", 0.01],
    ["不吸烟"," 不患肺癌", 0.99],
], [smoke.distribution]), name="肺癌")

TODO:建立肺结核

tuberculosis = Node(DiscreteDistribution({
    "不患肺结核": 0.01,
    "患肺结核": 0.99,
}), name="肺结核")

# TODO:建立呼吸困难结点

dyspnoea = Node(ConditionalProbabilityTable([
    ["不患支气管炎", "不患肺癌", "不呼吸困难", 0.9],
    ["不患支气管炎", "不患肺癌", "有呼吸困难", 0.1],
    ["患支气管炎", "不患肺癌", "不呼吸困难", 0.7],
    ["患支气管炎", "不患肺癌", "有呼吸困难", 0.3],
    ["不患支气管炎", "患肺癌", "不呼吸困难", 0.8],
    ["不患支气管炎", "患肺癌", "有呼吸困难", 0.2],
    ["患支气管炎", "患肺癌", "不呼吸困难", 0.1],
    ["患支气管炎", "患肺癌", "有呼吸困难", 0.9],    
], [bronchitis.distribution, lungCancer.distribution]), name="呼吸困难")

# TODO:建立X光胸透

xRay = Node(ConditionalProbabilityTable([
    ["不患肺癌", "不患肺结核", "不胸透异常", 0.99],
    ["不患肺癌", "不患肺结核", "有胸透异常", 0.01],
    ["患肺癌", "不患肺结核", "不胸透异常", 0.8],
    ["患肺癌", "不患肺结核", "有胸透异常", 0.2],
    ["不患肺癌", "患肺结核", "不胸透异常", 0.05],
    ["不患肺癌", "患肺结核", "有胸透异常", 0.95],
    ["患肺癌", "患肺结核", "不胸透异常", 0.03],
    ["患肺癌", "患肺结核", "有胸透异常", 0.97],
], [lungCancer.distribution, tuberculosis.distribution]), name="X光胸透")

TODO:创建贝叶斯网络并添加状态结点, 注意结点名称要与之前结点定义一致

model = BayesianNetwork()
model.add_states(smoke, bronchitis, lungCancer, tuberculosis, dyspnoea, xRay)

TODO:添加个结点间连接

model.add_edge(smoke, bronchitis)
model.add_edge(smoke, lungCancer)
model.add_edge(bronchitis, dyspnoea)
model.add_edge(lungCancer, dyspnoea)
model.add_edge(tuberculosis, xRay)
model.add_edge(lungCancer, xRay)

完成模型拓扑结构

model.bake()
#计算预测结构
predictions = model.predict_proba({
     "吸烟": "吸烟",
     "呼吸困难": "有呼吸困难",
     "X光胸透": "有胸透异常"
 })

输出各节点预测结果

for node, prediction in zip(model.states, predictions):
    if isinstance(prediction, str):
        print(f"{node.name}: {prediction}")
    else:
        print(f"{node.name}")
        for value, probability in prediction.parameters[0].items():
            print(f"    {value}: {probability:.4f}")

你的中文前面有的有空格

from pomegranate import *

# TODO:建立吸烟结点
smoke = Node(DiscreteDistribution({
    "吸烟": 0.5,
    "不吸烟": 0.5,
}), name="吸烟")

# TODO:建立支气管炎
bronchitis = Node(ConditionalProbabilityTable([
    ["吸烟", "患支气管炎", 0.6],
    ["吸烟", "不患支气管炎", 0.4],
    ["不吸烟", "患支气管炎", 0.3],
    ["不吸烟", "不患支气管炎", 0.7],
], [smoke.distribution]), name="支气管炎")

# TODO:建立肺癌
lungCancer = Node(ConditionalProbabilityTable([
    ["吸烟", "患肺癌", 0.1],
    ["吸烟", "不患肺癌", 0.9],
    ["不吸烟", "患肺癌", 0.01],
    ["不吸烟", "不患肺癌", 0.99],
], [smoke.distribution]), name="肺癌")

# TODO:建立肺结核
tuberculosis = Node(DiscreteDistribution({
    "不患肺结核": 0.01,
    "患肺结核": 0.99,
}), name="肺结核")

# TODO:建立呼吸困难结点
dyspnoea = Node(ConditionalProbabilityTable([
    ["不患支气管炎", "不患肺癌", "不呼吸困难", 0.9],
    ["不患支气管炎", "不患肺癌", "有呼吸困难", 0.1],
    ["患支气管炎", "不患肺癌", "不呼吸困难", 0.7],
    ["患支气管炎", "不患肺癌", "有呼吸困难", 0.3],
    ["不患支气管炎", "患肺癌", "不呼吸困难", 0.8],
    ["不患支气管炎", "患肺癌", "有呼吸困难", 0.2],
    ["患支气管炎", "患肺癌", "不呼吸困难", 0.1],
    ["患支气管炎", "患肺癌", "有呼吸困难", 0.9],
], [bronchitis.distribution, lungCancer.distribution]), name="呼吸困难")

# TODO:建立X光胸透
xRay = Node(ConditionalProbabilityTable([
    ["不患肺癌", "不患肺结核", "不胸透异常", 0.99],
    ["不患肺癌", "不患肺结核", "有胸透异常", 0.01],
    ["患肺癌", "不患肺结核", "不胸透异常", 0.8],
    ["患肺癌", "不患肺结核", "有胸透异常", 0.2],
    ["不患肺癌", "患肺结核", "不胸透异常", 0.05],
    ["不患肺癌", "患肺结核", "有胸透异常", 0.95],
    ["患肺癌", "患肺结核", "不胸透异常", 0.03],
    ["患肺癌", "患肺结核", "有胸透异常", 0.97],
], [lungCancer.distribution, tuberculosis.distribution]), name="X光胸透")

# TODO:创建贝叶斯网络并添加状态结点, 注意结点名称要与之前结点定义一致
model = BayesianNetwork()
model.add_states(smoke, bronchitis, lungCancer, tuberculosis, dyspnoea, xRay)

# TODO:添加个结点间连接
model.add_edge(smoke, bronchitis)
model.add_edge(smoke, lungCancer)
model.add_edge(bronchitis, dyspnoea)
model.add_edge(lungCancer, dyspnoea)
model.add_edge(tuberculosis, xRay)
model.add_edge(lungCancer, xRay)

# 完成模型拓扑结构
model.bake()
# 计算预测结构
predictions = model.predict_proba({
    "吸烟": "吸烟",
    "呼吸困难": "有呼吸困难",
    "X光胸透": "有胸透异常"
})

# 输出各节点预测结果
for node, prediction in zip(model.states, predictions):
    if isinstance(prediction, str):
        print(f"{node.name}: {prediction}")
    else:
        print(f"{node.name}")
        for value, probability in prediction.parameters[0].items():
            print(f"{value}: {probability:.4f}")

img