使用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
相关产品推荐
相关产品推荐

