- 人工智能
- 机器学习
- 深度学习
【免费下载链接】aima-python
Python implementation of algorithms from Russell And Norvig's "Artificial Intelligence - A Modern Approach"
本文是基于 aima-python 仓库 API 文档页 docs/probability.rst 编写的一份技术指南。该文档页通过 Sphinxautomodule指令将aima.probability、aima.mdp与aima.making_simple_decisions三个模块的全部公开成员自动收录为 API 参考,对应 Russell & Norvig《人工智能:一种现代方法》(AIMA)第 13–17 章的内容。读完本文,你将掌握这三个模块的核心类与算法:概率分布与贝叶斯网络的构建和精确/近似推断、HMM 滤波与 Kalman 滤波、以及从 MDP 求解到决策网络、POMDP 的一整套"概率→决策"链路,并能在自己的项目里直接复用这些实现。
模块总览与文档结构
docs/probability.rst是文档站点(见 docs/index.rst)中的 API 参考页之一,正文由三个automodule指令组成,逐一导入并展示模块的全部公开成员:
aima.probability—— 概率模型(第 13–15 章):概率分布、贝叶斯网络、精确/近似推断、HMM、Kalman 滤波、动态贝叶斯网络、粒子滤波与蒙特卡洛定位;aima.mdp—— 马尔可夫决策过程(第 17 章):MDP/GridMDP 建模、价值迭代、策略迭代以及 POMDP 求解;aima.making_simple_decisions—— 简单决策(第 15/16 章):决策网络与信息收集智能体的重导出。
值得说明的是,aima.making_simple_decisions本身只有 11 行:它从aima.probability导入DecisionNetwork与InformationGatheringAgent并重新导出(__all__ = ['DecisionNetwork', 'InformationGatheringAgent']),文档字符串明确指出aima.probability才是这两个类的"规范居所"(canonical home)。因此,本文以aima.probability为主线,将aima.mdp作为"从概率推断走向决策"的自然延伸,这与文档页自身的编排顺序完全一致。
概率分布的表示:ProbDist 与 JointProbDist
aima.probability首先提供离散概率分布的基础数据结构(对应 AIMA 第 13 章"不确定性与概率")。
ProbDist:单变量离散分布
ProbDist(aima/probability.py)用字典prob存储"取值→概率"的映射,并通过构造参数var_name记录随机变量名。构造时可传入freq频率字典,随后自动调用normalize()归一化:
P = ProbDist('Flip'); P['H'], P['T'] = 0.25, 0.75; P['H'] # 0.25 P = ProbDist('X', {'lo': 125, 'med': 375, 'hi': 500}) P['lo'], P['med'], P['hi'] # (0.125, 0.375, 0.5)关键行为与参数约定:
__getitem__:查询概率,未赋值的取值返回 0(而不是抛 KeyError);__setitem__:赋值时自动把取值登记进values列表;normalize():把全部概率除以总和,使各取值概率之和为 1;总和为 0 时抛出ZeroDivisionError;若总和已接近 1(np.isclose),则不再重复缩放;show_approx(numfmt='{:.3g}'):按 key 排序后以指定格式(默认 3 位有效数字)输出,用于可移植的 doctest 与调试。
JointProbDist:多变量联合分布
JointProbDist(aima/probability.py)把ProbDist扩展到一组变量,底层键是"每个变量一个取值"的元组。它同时维护vals(defaultdict),记录每个变量出现过的取值域,供后续枚举使用:
P = JointProbDist(['X', 'Y']); P[1, 1] = 0.25 P[1, 1] # 0.25 P[dict(X=0, Y=1)] = 0.5 P[dict(X=0, Y=1)] # 0.5其取值既可以用元组(与variables顺序一致),也可以用字典(顺序无关),统一由辅助函数event_values(event, variables)(aima/probability.py)转换为元组。values(var)返回某变量的可能取值列表。
基于联合分布的推断与独立性检验
enumerate_joint_ask(X, e, P)(aima/probability.py):给定联合分布P与证据e({var: val}字典),通过枚举所有与证据一致的条目,计算查询变量X的条件分布(第 13.3 节)。断言X不能同时出现在证据中;enumerate_joint(variables, e, P)(aima/probability.py):递归累加与证据一致的所有条目概率,是前者的底层引擎;is_independent(variables, P)(aima/probability.py):逐一检验某组变量是否相互独立——对每个变量,比较"无条件边缘分布"与"以其他变量各种取值为条件的条件分布",全部相等才返回 True;gen_possible_events(vars, P)(aima/probability.py):回溯枚举一组变量所有可能的取值组合(事件)。
测试 tests/test_probability.py 中的test_probdist_basic、test_probdist_frequency、test_probdist_normalize、test_jointprob、test_enumerate_joint、test_is_independent等用例,逐项验证了上述行为,可直接作为使用示例。
贝叶斯网络:建模、CPT 与多值节点
aima.probability实现了两套贝叶斯网络节点/网络结构:布尔变量版与多值离散版,并支持从标准 BIF 文件加载网络。
布尔网络:BayesNet 与 BayesNode
BayesNode(aima/probability.py)表示一个布尔变量的条件概率表 P(X | parents)。cpt参数支持三种书写形式,代码会自动统一为"父取值元组→P(X=true)"的字典:
- 一个数字:无条件概率 P(X=true),适用于无父节点(内部转为
{(): cpt}); - 一个字典
{v: p}:单一父节点,表示 P(X=true | parent=v) = p,键是布尔值; - 一个字典
{(v1, v2, ...): p}:多父节点,每个键的元组长度必须等于父节点数。
在所有形式中,X=false 的概率都被隐式地由 1 − P(X=true) 推出,这体现在p(value, event)方法中。构造时还会断言:父名与元组长度匹配、每个取值均为布尔值、概率在 [0, 1] 区间内。sample(event)按条件概率随机采样 True/False。
BayesNet(aima/probability.py)是节点容器,要求节点按"父先于子"的拓扑顺序加入(构造函数与add都会断言父节点已在网内、变量名不重复),并自动维护children指针。variable_node(var)按名取节点;variable_values(var)对布尔网络恒返回[True, False]。
书中经典的入室盗窃网络被直接实例化为模块级常量burglary(aima/probability.py),喷洒器网络为sprinkler(aima/probability.py),可直接复用:
burglary = BayesNet([('Burglary', '', 0.001), ('Earthquake', '', 0.002), ('Alarm', 'Burglary Earthquake', {(T, T): 0.95, (T, F): 0.94, (F, T): 0.29, (F, F): 0.001}), ('JohnCalls', 'Alarm', {T: 0.90, F: 0.05}), ('MaryCalls', 'Alarm', {T: 0.70, F: 0.01})])注意模块中定义了T, F = True, False,方便书写 CPT。
多值离散网络:DiscreteBayesNode 与 DiscreteBayesNet
DiscreteBayesNode(aima/probability.py)把变量域扩展到任意有限离散取值集合:构造参数为(X, parents, values, cpt),其中values是变量域,cpt把每个父取值元组映射到"按域顺序的概率序列"或"{value: prob}字典"(根节点用空元组()作唯一键)。DiscreteBayesNet(aima/probability.py)则是对应的网络容器。
关键设计点(文档字符串明示):enumeration_ask/elimination_ask等精确推断算法只依赖node.p与variable_values两个接口,因此对多值节点无需任何改动即可直接工作。
从 BIF 文件加载网络
read_bif(source)(aima/probability.py)解析贝叶斯交换格式(BIF)文本或文件对象,构建DiscreteBayesNet。BIF 是贝叶斯网络仓库(bnlearn 的 BN Repository)采用的标准格式,因此 aima 可以直接加载诸如车险("Insurance")这样的标准多值网络。解析器用正则提取variable声明中的变量域与probability段中的 CPT(支持table ...整体表与(父取值) 概率逐行表两种写法),并在添加节点前先递归添加父节点,从而容忍 BIF 文件本身非拓扑序的节点排列。
insurance()(aima/probability.py)返回 AIMA 第 4 版车险案例研究(第 16 节)所引用的 Binder、Koller、Russell & Kanazawa(1997)27 变量离散模型,数据从aima-data子模块中的insurance.bif加载(经 aima/utils.py 的open_data定位到仓库根的 aima-data 目录)。运行前需确保子模块已初始化(见仓库根 SUBMODULE.md)。
测试侧,test_read_bif、test_insurance_bayes_net、test_discrete_bayes_net_inference(tests/test_probability.py)验证了 BIF 解析、Insurance 网络结构(变量数、节点父关系)与多值网络上的精确推断。
连续变量贝叶斯网络
对于连续分布节点,模块提供:
gaussian_probability(param, event, value)(aima/probability.py):线性高斯模型。param由离散父事件决定,含sigma、b以及a(连续父节点权重字典);event是连续父节点的取值字典;返回当前节点取值value的高斯概率密度。logistic_probability(param, event, value)(aima/probability.py):用于"连续父节点、离散子节点"的 logistic 模型,参数含mu与sigma。ContinuousBayesNode(aima/probability.py):同时拥有离散父节点(决定分布参数)与连续父节点(决定分布取值)的节点,type为'c'时用高斯、'd'时用 logistic 计算continuous_p。
贝叶斯网络精确推断:枚举法与变量消元
枚举推断
enumeration_ask(X, e, bn)(aima/probability.py)对应 [Figure 14.9]:通过enumerate_all枚举联合分布中与证据一致的条目,返回查询变量的条件分布(归一化后为ProbDist)。其 doctest 给出了经典结果:
enumeration_ask('Burglary', dict(JohnCalls=T, MaryCalls=T), burglary).show_approx() # 'False: 0.716, True: 0.284'底层enumerate_all(variables, e, bn)(aima/probability.py)按拓扑序递归:若变量已在证据中,直接乘以其条件概率;否则对该变量所有取值求和。复杂度随变量数指数增长,适合小网络。
变量消元
elimination_ask(X, e, bn)(aima/probability.py)对应 [Figure 14.11],以因子(Factor)为单位做变量消元:对每个变量(逆拓扑序)先make_factor生成因子,隐藏变量(is_hidden:非查询变量且不在证据中)立即sum_out求和消去,最后把所有剩余因子pointwise_product相乘并归一化。对同一查询给出与枚举法一致的结果('False: 0.716, True: 0.284'),但避免了显式构造联合分布。
配套的数据结构Factor(aima/probability.py)封装"变量列表 + 条件概率表",提供pointwise_product(因子逐点相乘、变量取并集)、sum_out(对某变量求和消去)、normalize(缩到单变量并转为ProbDist)。模块级函数pointwise_product、sum_out、make_factor、all_events分别承担因子乘法、消元调度、因子构造与事件枚举。
测试test_enumeration_ask与test_elimination_ask(tests/test_probability.py)不仅覆盖入室盗窃网络,还验证了两个算法在sprinkler网络上的结果一致。
贝叶斯网络近似推断:三类蒙特卡洛采样
当网络过大无法精确推断时,模块提供对应 [Figure 14.13–14.16] 的三类采样算法(含 doctest 中固定的随机种子与期望输出):
prior_sample(bn)(aima/probability.py):按拓扑序逐节点用node.sample(event)采样,得到联合分布的随机样本;rejection_sampling(X, e, bn, N=10000)(aima/probability.py):先prior_sample生成 N 个样本,再用consistent_with(aima/probability.py,检查事件与证据在每个键上一致)筛选与证据一致的样本,统计查询变量取值频率。若 N 个样本全部被拒绝,将抛出 ZeroDivisionError(即证据过于罕见时的退化情形);likelihood_weighting(X, e, bn, N=10000)(aima/probability.py):改进的加权采样。weighted_sample(bn, e)(aima/probability.py)对证据变量不采样,而是把其条件概率node.p(e[Xi], event)累乘为权重w,对非证据变量正常采样;最后按权重累加统计。由于不再丢弃样本,效率显著高于拒绝采样;gibbs_ask(X, e, bn, N=1000)(aima/probability.py):吉布斯采样。从与证据一致的随机状态出发,循环 N 轮,每轮把每个非证据变量按markov_blanket_sample从其马尔可夫毯(父、子、子之父母,见 [Equation 14.12],实现见 aima/probability.py)重采样,并统计查询变量取值。
三者默认样本数分别为 N=10000 / 10000 / 1000。测试用例test_prior_sample、test_rejection_sampling、test_likelihood_weighting、test_gibbs_ask(tests/test_probability.py)以固定随机种子验证了这些算法在burglary/sprinkler网络上的输出。
时序模型:HMM 滤波、平滑与参数学习
第 15 章时序推理部分由HiddenMarkovModel及一组算法函数承载。
HiddenMarkovModel 与滤波
HiddenMarkovModel(aima/probability.py)以转移模型transition_model、传感器模型sensor_model与先验prior(默认[0.5, 0.5])构造,sensor_dist(ev)按证据真/假返回传感器模型的对应行。核心算法:
forward(HMM, fv, ev)(aima/probability.py):一步滤波——先经转移模型投影前向消息,再按证据的传感器分布加权并归一化([Figure 15.4]);backward(HMM, b, ev)(aima/probability.py):一步后向消息;forward_backward(HMM, ev)(aima/probability.py):前向-后向平滑,对整条观测序列计算各时刻状态的后验(sv,注意实现会在证据序列头部插入哨兵None以对齐伪代码下标);viterbi(HMM, ev)(aima/probability.py):维特比算法([Equation 15.11]),返回最可能状态序列ml_path及其逐时刻概率ml_probabilities,回溯图保存每个时刻状态的前驱;fixed_lag_smoothing(e_t, HMM, d, ev, t)(aima/probability.py):固定时滞 d 步的平滑([Figure 15.6]),证据不足(t ≤ d)时返回 None;particle_filtering(e, N, HMM)(aima/probability.py):两状态粒子滤波——先按转移模型传播、按证据计算重要性权重并归一化,再weighted_sample_with_replacement重采样。
Baum-Welch:HMM 参数学习
baum_welch(HMM, observations, iterations=100)(aima/probability.py)是 EM 在 HMM 上的实例(第 20.3 节):每轮迭代先以缩放的前向-后向传递计算平滑状态边缘gamma_t(i)=P(X_t=i | e_1:T)与转移边缘xi_t(i,j)=P(X_t=i, X_{t+1}=j | e_1:T)(E 步),再按期望计数重新估计全部参数(M 步):
prior_i = gamma_0(i) A_ij = sum_t xi_t(i, j) / sum_t gamma_t(i) sensor_oi = sum_{t: e_t = o} gamma_t(i) / sum_t gamma_t(i)返回学习后的新HiddenMarkovModel。测试test_forward_backward、test_viterbi、test_fixed_lag_smoothing、test_particle_filtering、test_baum_welch(tests/test_probability.py)覆盖了上述全部算法(含与教科书小例对照的断言)。
Kalman 滤波
KalmanFilter(aima/probability.py)针对线性高斯动态系统(第 15.4 节):
x_{t+1} = F x_t + noise, noise ~ N(0, Sigma_x) (转移模型) z_t = H x_t + noise, noise ~ N(0, Sigma_z) (传感器模型)构造函数参数为(transition_model, sensor_model, transition_noise, sensor_noise),内部以矩阵(np.atleast_2d)存储 F、H、Sigma_x、Sigma_z。高斯族在贝叶斯滤波更新下封闭,因此前向消息每步都保持高斯,完全由均值向量与协方差矩阵刻画:
predict(mean, cov):时间更新,mean = F @ mean、cov = F @ cov @ F.T + Sigma_x;update(mean, cov, z):测量更新,用卡尔曼增益 K([Equation 15.21])修正均值与协方差;filter(mean, cov, z):一次"预测-更新"循环。
模块级函数kalman_filter(KF, mean0, cov0, observations)(aima/probability.py)从高斯先验 N(mean0, cov0) 出发,对观测序列逐点滤波,返回每步的(mean, covariance)列表。测试test_kalman_filter与test_kalman_filter_steady_state(tests/test_probability.py)验证了滤波过程与稳态行为。
动态贝叶斯网络(DBN)
DynamicBayesNet(aima/probability.py)为平稳一阶马尔可夫过程建模(第 15.5 节),由先验网络(第 0 层状态变量)、转移网络与传感器网络三个规范构成,每个 spec 均为(variable, parents, cpt)三元组(同BayesNode);转移 spec 中名为<var>_prev的父节点指向上一层的状态变量,其余父节点指当前层。
unroll(steps):把 DBN 展开为覆盖第 0..steps 层的普通BayesNet(传感器在第 1..steps 层),展开后的变量名形如var_0、var_t;filter(evidence, query, infer=elimination_ask):滤波即"给定整条观测序列、查询最后层状态变量的后验",evidence是逐时刻(t=1,2,…)的观测字典列表,默认用变量消元做推断,也可传入其他推断函数。
测试test_dynamic_bayes_net(tests/test_probability.py)通过展开后的精确推断验证了 DBN 的滤波结果。
蒙特卡洛定位(MCL)
MCLmap(aima/probability.py)是离散栅格地图:m为 0/1 二维列表(障碍或空地),sample()随机返回合法运动学状态(空地坐标 + 0N/1E/2S/3W 朝向),ray_cast(sensor_num, kin_state)返回指定传感器方向到最近障碍/边界的距离。ContinuousMCLmap(aima/probability.py)是连续版本:世界为 [0,width]×[0,height] 的矩形竞技场,障碍为轴对齐矩形,状态为 (x, y, heading),传感器以相对朝向的弧度角配置(默认 0、π/2、π、3π/2),ray_cast通过射线-线段求交返回连续距离;两个类暴露相同的sample()/ray_cast()接口。
monte_carlo_localization(a, z, N, P_motion_sample, P_sensor, m, S=None)(aima/probability.py)实现 [Figure 25.9] 的蒙特卡洛定位:从先验粒子集 S(缺省时由m.sample()生成 N 个)出发,逐个经P_motion_sample运动采样、按各传感器读数z与ray_cast预测的距离计算权重乘积,最后按权重有放回重采样。测试test_monte_carlo_localization与test_continuous_mcl(tests/test_probability.py)分别验证了离散与连续地图上的定位收敛。
决策网络与信息收集智能体(making_simple_decisions)
aima.making_simple_decisions把第 15/16 章的决策算法以aima.probability的类重新导出(详见 aima/making_simple_decisions.py),因此实际实现都在aima.probability中:
DecisionNetwork(BayesNet)(aima/probability.py):决策网络的抽象基类,是贝叶斯网络的包装,表示智能体当前状态、可用动作、可达状态及其效用。构造参数(action, infer)分别指定单一动作节点与首选的推断方法。best_action()返回最优动作;get_expected_utility(action, evidence)通过infer求动作条件下状态的后验分布,再按get_utility(action, state)(需子类实现)加权求和得到期望效用;InformationGatheringAgent(Agent)(aima/probability.py):对应 [Figure 16.9] 的信息收集智能体,反复选择"信息价值(VPI)最高"的观测,直到下一次观测的成本超过其预期收益为止。execute(percept)按vpi_cost_ratio取 VPI/成本比最大的变量,若vpi(variable) > cost(variable)则request(variable),否则返回decnet.best_action()。vpi计算将观测到该变量各取值的后验概率与对应期望效用加权,再减去当前观测下的期望效用(即 VPI 定义)。integrate_percept、request、cost是留给子类实现的钩子。
MDP 求解:value_iteration 与 policy_iteration
aima.mdp承载第 17 章内容。MDP(aima/mdp.py)的定义与教科书略有不同:转移模型不用三元组概率P(s'|s,a),而是让T(s, a)返回(概率, 结果状态)对的列表。构造参数为(init, actlist, terminals, transitions=None, reward=None, states=None, gamma=0.9),其中actlist可以是列表(所有状态动作相同)、字典(按状态区分动作)或集合(自动转列表);gamma必须满足0 < gamma <= 1(否则抛ValueError);states缺省时从转移表自动收集(get_states_from_transitions)。check_consistency()断言状态集合、初始/终止状态、奖励定义以及每个动作的结果概率之和为 1,用于构造后的自检。
GridMDP 与 4×3 网格环境
GridMDP(aima/mdp.py)是 [Figure 17.1] 的二维网格特例:以"奖励值组成的列表的列表"指定网格,None表示障碍(不可达状态),还需显式给出terminals。注意构造时grid.reverse(),行 0 在底部。动作是(x, y)单位向量,取自utils的orientations;calculate_T实现有噪声的运动模型:0.8 概率按意图方向移动,各 0.1 概率向右/左偏离;go(state, direction)撞墙或越界时原地不动。to_grid(mapping)把(x, y)映射渲染回网格,to_arrows(policy)把策略渲染为> ^ < v箭头(None动作渲染为.)。
模块常量sequential_decision_environment(aima/mdp.py)即书中 4×3 环境:普通格奖励 −0.04,右上角 +1、右列中间 −1 为终止格,中间格为障碍。辅助函数gen_grid(n_rows=3, n_cols=4, terminals=((3, 2), (3, 1)), main_reward=-0.04, terminal_rewards=(1, -1), block_coords=((1, 1),))(aima/mdp.py)可按参数生成任意尺寸的网格,供GridMDP直接使用。
价值迭代与策略迭代
value_iteration(mdp, epsilon=0.001)(aima/mdp.py):[Figure 17.4]。从全 0 效用出发迭代U1[s] = R(s) + gamma * max_a sum p * U[s1],收敛判据为delta <= epsilon * (1 - gamma) / gamma,返回效用字典;best_policy(mdp, U)(aima/mdp.py):按 [Equation 17.4] 由效用字典取每状态期望效用最大的动作,返回{state: action}策略;policy_iteration(mdp)(aima/mdp.py):[Figure 17.7]。随机初始化策略后循环"策略评估 + 策略改进",策略无变化即返回;policy_evaluation(pi, U, mdp, k=20)(aima/mdp.py):修正的策略迭代,固定迭代 k 轮(默认 20)做策略评估近似;q_value(mdp, s, a, U)(aima/mdp.py)与expected_utility(a, s, U, mdp)(aima/mdp.py)分别是 Q 值与期望效用的实现(无动作时 Q 值退化为即时奖励)。
模块末尾的 doctest 展示了端到端用法,也是最佳速查示例:
pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .01)) sequential_decision_environment.to_arrows(pi) # [['>', '>', '>', '.'], ['^', None, '^', '.'], ['^', '>', '^', '<']]policy_iteration对同一环境得到相同的箭头策略。测试 tests/test_mdp.py 的test_value_iteration(用pytest.approx做容差比较,因为数值细节会随 numpy/BLAS 版本浮动)、test_policy_iteration、test_best_policy、test_transition_model对 4×3 环境与gen_grid生成的环境逐一验证。
POMDP:部分可观测环境下的决策
POMDP(MDP)(aima/mdp.py)以矩阵形式定义转移模型P(s'|s,a)、动作集、奖励函数与传感器模型P(e|s)(第 17 节,[Page 659])。构造参数(actions, transitions=None, evidences=None, rewards=None, states=None, gamma=0.95),gamma 同样限定0 < gamma <= 1;转移/传感器模型缺失时打印警告。remove_dominated_plans通过保留"上包络"上的直线来剔除被支配的计划,remove_dominated_plans_fast则在 100 个等距点上重采样上边界做近似(精确与快速版本可互换,见pomdp_value_iteration中的注释)。配套Matrix类(aima/mdp.py)提供矩阵加减、标量乘、逐元素乘、矩阵乘与转置工具。
pomdp_value_iteration(pomdp, epsilon=0.1)(aima/mdp.py):POMDP 价值迭代,收敛判据max_difference < epsilon * (1 - gamma) / gamma;update_belief(pomdp, belief, action, observation)(aima/mdp.py):[Equation 17.17] 的信念状态滤波——预测步经转移模型传播信念,更新步按观测的传感器似然加权再归一化:b'(s') = alpha * P(o | s') * sum_s P(s' | s, a) b(s);pomdp_lookahead(pomdp, belief, depth)(aima/mdp.py):把 POMDP 建模为动态决策网络(DDN,第 17.5 节),以信念状态上的 expectimax 搜索向前投影depth步:决策节点在信念状态上取值,机会节点按可能观测分支,分支上用update_belief递推更新信念,返回期望折现效用最大的动作。
测试test_pomdp_value_iteration、test_pomdp_value_iteration2、test_update_belief、test_pomdp_lookahead(tests/test_mdp.py)覆盖了 POMDP 求解与信念更新的完整链路。
配套 Notebook 与文档生态
除了本文所依的 docs/probability.rst 与 docs/index.rst,仓库还为这三个模块提供了逐章的 Jupyter Notebook 作为互补教程:
- notebooks/probability.ipynb 与 notebooks/probability.py:贝叶斯网络与概率推断;
- notebooks/mdp.ipynb、notebooks/mdp.py、notebooks/mdp_apps.ipynb 与 notebooks/mdp_apps.py:MDP 求解及应用;
- 第 16/17 章专册见 notebooks/chapter16-17(MDPs、Sequential Decision Problems、Partially Observable MDP 等);第 21 章强化学习的被动/主动学习 notebook 也会复用本页的 MDP 基础设施。
这些 notebook 与 API 文档(均由源码 docstring 自动生成)共同构成"先读教程、再查 API"的完整学习路径。模块的单元测试(tests/test_probability.py、tests/test_mdp.py)则同时充当行为契约与可运行示例。
快速上手与使用建议
- 环境准备:安装依赖(见 requirements.txt 与 pyproject.toml),并初始化
aima-data子模块(SUBMODULE.md),以便insurance()等数据类接口可用;运行测试可执行pytest(配置见 pytest.ini)。 - 概率推断:小网络用
enumeration_ask/elimination_ask精确推断;大网络用rejection_sampling/likelihood_weighting/gibbs_ask近似;时序数据用forward_backward/viterbi或KalmanFilter。 - 序列决策:完全可观测时用
value_iteration/policy_iteration求 4×3 等网格环境的策略;部分可观测时用POMDP与update_belief/pomdp_lookahead。 - 决策理论智能体:继承
DecisionNetwork实现get_utility,再组合InformationGatheringAgent,即可构建"先收集信息、再按 VPI 权衡成本"的完整智能体。
需要提醒的约定:GridMDP的网格行序是反的(row 0 在底部);BayesNet节点必须按父先子后顺序加入;prob类分布未赋值取值查询返回 0;采样算法对罕见证据可能抛ZeroDivisionError(拒绝采样)或依赖固定随机种子才可复现 doctest 输出。理解这些约定后,你就可以把这套实现当作"带标准答案(测试)的教科书级概率决策工具箱"直接集成进自己的项目。
- 人工智能
- 机器学习
- 深度学习
【免费下载链接】aima-python
Python implementation of algorithms from Russell And Norvig's "Artificial Intelligence - A Modern Approach"
相关推荐
贝叶斯优化完全指南:从概率模型到智能决策的终极教程
贝叶斯优化完全指南:从概率模型到智能决策的终极教程 贝叶斯优化是一种基于概率模型的高效优化方法,能够在有限的资源下快速找到复杂函数的最优解。本教程将带你全面了解
机器学习如何掌握PRML概率图模型:贝叶斯网络推理的终极完整指南 🚀
如何掌握PRML概率图模型:贝叶斯网络推理的终极完整指南 🚀 PRML(Pattern Recognition and Machine Learning)项目
机器学习深度学习从源码到打包:JamTools开发者指南之编译与定制教程
从源码到打包:JamTools开发者指南之编译与定制教程 JamTools是一个完全开源的跨平台工具集,支持Windows、macOS和Linux系统,集成了滚
桌面应用计算机视觉音视频RPA网络
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考