You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pomegranate构建双变量BBN时触发KeyError: ('A', 'A', 'B')如何解决

问题原因

你定义ConditionalProbabilityTable时的条目结构不符合pomegranate的要求,缺少了子节点(monty)的取值字段,导致模型构建时无法匹配到对应的条件概率,触发KeyError。

对于有n个父节点的条件概率表,每一行条目的标准格式为:[父节点1取值, 父节点2取值, ..., 父节点n取值, 子节点取值, 对应概率]。你当前的场景下monty有2个父节点,所以每行应该有4个元素,你现有代码的每行只有3个元素,且未明确monty的取值,不符合格式要求。

修正后的代码
from pomegranate import *

guest = DiscreteDistribution({'A': 0.5, 'B':0.5})
prize = DiscreteDistribution({'A': 0.5, 'B': 0.5})
# 每行顺序严格对应:guest取值、prize取值、monty取值、对应概率
monty = ConditionalProbabilityTable(
        [['A', 'A', 'A', 0.5],    
         ['A', 'A', 'B', 0.5],
         ['B', 'B', 'A', 0.5],
         ['B', 'B', 'B', 0.5],
         ['A', 'B', 'A', 0.5],
         ['A', 'B', 'B', 0.5],
         ['B', 'A', 'A', 0.5],
         ['B', 'A', 'B', 0.5]], [guest, prize])

s1 = Node(guest, name="guest")
s2 = Node(prize, name="prize")
s3 = Node(monty, name="monty")

model = BayesianNetwork("Monty Hall Problem")
model.add_states(s1, s2, s3)
model.add_edge(s1, s3)
model.add_edge(s2, s3)
model.bake()
补充说明

如果你的双门蒙提霍尔场景存在业务规则限制(比如monty不能打开 guest选中的门、或者不能打开藏有奖品的门),只需要调整对应条目的概率值即可,只需保证同一组父节点取值下,所有子节点取值的概率总和为1即可正常运行。


内容的提问来源于stack exchange,提问作者prashant thakre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:36:03