!pip install pomegranate
from pomegranate import *
smoke = Node(DiscreteDistribution({
"吸烟": 0.5,
"不吸烟": 0.5,
}), name="吸烟")
bronchitis = Node(ConditionalProbabilityTable([
["吸烟", "患支气管炎", 0.6],
["吸烟"," 不患支气管炎", 0.4],
["不吸烟", "患支气管炎", 0.3],
["不吸烟"," 不患支气管炎", 0.7],
], [smoke.distribution]), name="支气管炎")
lungCancer = Node(ConditionalProbabilityTable([
["吸烟", "患肺癌", 0.1],
["吸烟"," 不患肺癌", 0.9],
["不吸烟", "患肺癌", 0.01],
["不吸烟"," 不患肺癌", 0.99],
], [smoke.distribution]), name="肺癌")
tuberculosis = Node(DiscreteDistribution({
"不患肺结核": 0.01,
"患肺结核": 0.99,
}), name="肺结核")
dyspnoea = Node(ConditionalProbabilityTable([
["不患支气管炎", "不患肺癌", "不呼吸困难", 0.9],
["不患支气管炎", "不患肺癌", "有呼吸困难", 0.1],
["患支气管炎", "不患肺癌", "不呼吸困难", 0.7],
["患支气管炎", "不患肺癌", "有呼吸困难", 0.3],
["不患支气管炎", "患肺癌", "不呼吸困难", 0.8],
["不患支气管炎", "患肺癌", "有呼吸困难", 0.2],
["患支气管炎", "患肺癌", "不呼吸困难", 0.1],
["患支气管炎", "患肺癌", "有呼吸困难", 0.9],
], [bronchitis.distribution, lungCancer.distribution]), name="呼吸困难")
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光胸透")
model = BayesianNetwork()
model.add_states(smoke, bronchitis, lungCancer, tuberculosis, dyspnoea, xRay)
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}")