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

CS50AI课程贝叶斯网络代码报错:NameError及类/方法未识别求助

问题:CS50AI贝叶斯网络代码报错NameError: name 'Node' is not defined

运行CS50AI课程中的贝叶斯网络代码时,出现NameError: name 'Node' is not defined错误,同时Node、DiscreteDistribution、ConditionalProbabilityTable、distribution、BayesianNetwork()、add_edge、bake这些类与方法均未被识别。

原代码:

# Also the terms Node, DiscreteDistribution, ConditionalProbabilityTable, distribution, BayesianNetwork(), add_edge, bake are not being recognised.

from pomegranate import *

# Rain node has no parents

rain = Node(DiscreteDistribution({"none": 0.7,"light": 0.2,"heavy": 0.1}), name="rain")

# Track maintenance node is conditional on rain

maintenance = Node(ConditionalProbabilityTable([["none", "yes", 0.4],["none", "no", 0.6],["light", "yes", 0.2],["light", "no", 0.8],["heavy", "yes", 0.1],["heavy", "no", 0.9]], [rain.distribution]), name="maintenance")

# Train node is conditional on rain and maintenance

train = Node(ConditionalProbabilityTable([["none", "yes", "on time", 0.8],["none", "yes", "delayed", 0.2],["none", "no", "on time", 0.9],["none", "no", "delayed", 0.1],["light", "yes", "on time", 0.6],
["light", "yes", "delayed", 0.4],["light", "no", "on time", 0.7],["light", "no", "delayed", 0.3],
["heavy", "yes", "on time", 0.4],["heavy", "yes", "delayed", 0.6],["heavy", "no", "on time", 0.5],["heavy", "no", "delayed", 0.5],], [rain.distribution, maintenance.distribution]), name="train")

# Appointment node is conditional on train

appointment = Node(ConditionalProbabilityTable([["on time", "attend", 0.9],["on time", "miss", 0.1],["delayed", "attend", 0.6],["delayed", "miss", 0.4]], [train.distribution]), name="appointment")

# Create a Bayesian Network and add states

model = BayesianNetwork()
model.add_states(rain, maintenance, train, appointment)

# Add edges connecting nodes

model.add_edge(rain, maintenance)
model.add_edge(rain, train)
model.add_edge(maintenance, train)
model.add_edge(train, appointment)

# Finalize model

model.bake()

错误原因

核心问题是pomegranate库版本不兼容:

  • CS50AI课程采用的是旧版pomegranate(v0.13.x及更早版本),该版本使用Node、BayesianNetwork等类构建贝叶斯网络。
  • 若你当前安装的是v1.0+的新版pomegranate,库的API已完全重构:原有的Node类被移除,概率分布、贝叶斯网络的创建方式,以及add_edge、bake等方法的调用逻辑都发生了根本性变化,导致旧代码无法识别这些类和方法。

修正后的代码(适配新版pomegranate v1.0+)

from pomegranate import DiscreteDistribution, ConditionalProbabilityTable, BayesianNetwork

# 定义各个节点的概率分布
rain = DiscreteDistribution({"none": 0.7, "light": 0.2, "heavy": 0.1})

maintenance = ConditionalProbabilityTable(
    [["none", "yes", 0.4],
     ["none", "no", 0.6],
     ["light", "yes", 0.2],
     ["light", "no", 0.8],
     ["heavy", "yes", 0.1],
     ["heavy", "no", 0.9]],
    [rain]
)

train = ConditionalProbabilityTable(
    [["none", "yes", "on time", 0.8],
     ["none", "yes", "delayed", 0.2],
     ["none", "no", "on time", 0.9],
     ["none", "no", "delayed", 0.1],
     ["light", "yes", "on time", 0.6],
     ["light", "yes", "delayed", 0.4],
     ["light", "no", "on time", 0.7],
     ["light", "no", "delayed", 0.3],
     ["heavy", "yes", "on time", 0.4],
     ["heavy", "yes", "delayed", 0.6],
     ["heavy", "no", "on time", 0.5],
     ["heavy", "no", "delayed", 0.5]],
    [rain, maintenance]
)

appointment = ConditionalProbabilityTable(
    [["on time", "attend", 0.9],
     ["on time", "miss", 0.1],
     ["delayed", "attend", 0.6],
     ["delayed", "miss", 0.4]],
    [train]
)

# 创建贝叶斯网络并添加节点
model = BayesianNetwork()
model.add_states(rain, maintenance, train, appointment)

# 添加边定义依赖关系
model.add_edge(rain, maintenance)
model.add_edge(rain, train)
model.add_edge(maintenance, train)
model.add_edge(train, appointment)

# 编译网络
model.bake()

另一种解决方案:安装旧版pomegranate

如果你想完全沿用课程中的代码,可卸载当前版本,安装与课程匹配的旧版:

pip uninstall pomegranate -y
pip install pomegranate==0.13.5

内容的提问来源于stack exchange,提问作者Ritwik Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:45:12