1、实习介绍
在本项目中,我们将实现贝叶斯网络的推理算法,特别是变量消除和完美信息值计算。这些推理算法将可以推理隐形颗粒和鬼魂的存在。
在搞懂了整个项目代码框架之后,就可以去进行局部的编码了。
2、问题编码
1、question1-Bayes Net Structure
在这个部分,我们需要根据项目描述构造一个空的贝叶斯网。
- X 位置决定哪个房子在棋盘的哪一边。它要么是食物剩下的,要么是鬼魂留下的。
- Y位置决定了房屋的垂直方向。它同时模拟两个房子的垂直位置,并具有四个值之一:both-top、both-bottom、left-top 和 left-bottom。“左上”顾名思义:棋盘左边的房子在上面,棋盘右边的房子在下面。
- 食屋和鬼屋指定了两间屋子的实际位置。它们都是“X位置”和“Y 位置”的确定性函数。
- 观察结果是吃豆子在绕着棋盘旅行时所做的测量。请注意,有许多这样的节点——可能是房屋墙壁的每个棋盘位置都有一个。如果给定位置没有房子,则对应的观察值是none;否则它要么是红色,要么是蓝色,颜色的精确分布取决于房子的种类。
其中我们要进行编码的文件是BayesAgents.py中的constructBayesNet函数:
该贝叶斯网络中有5种变量:
-单个“x位置”变量(控制房屋的x位置)
-单个“y位置”变量(控制房屋的y位置)
-单个“food house”变量(包含房屋中心)
-单个“鬼屋”变量(包含房屋中心)
-Pacman可以测量每个细胞的大量“观察”变量
我们必须使用常量命名所有位置和房屋变量(X_POS_VAR、FOOD_HOUSE_VAR等)位于文件顶部。
使用上述步骤填充“obsVars”;
用Bayes网络中的每条边填充Bayes Net (a tuple `(from, to)`);
设置每个'variableDomainsDict[var]=values',其中'values'是集合对“var”的可能赋值。应再次使用在此文件顶部定义的常量;
2、question2-Bayes Net Probabilities
- 在这里,要填充CPT给出y位置变量的先验概率
可以参考方法fillXCPT:
从中可以看出,我们不需要自己手写概率,可以通过从layout中导入已经写的常量,然后调用方法setProbability,因为y的位置变量有四种,所以要设置4次。最后调用setCPT()即可。
3、question3-Join Factors
- 在factorOperations.py中实现joinFactors函数。
- 它输入一个Factors列表,并返回一个新的Factors,其概率条目是输入Factors的相应行的乘积。
- Factors存储了一个variableDomainsDict,它将每个变量映射到它可以接受的值列表(它的域)。
- Factor从实例化它的BayesNet获取它的variableDomainsDict。因此,它包含了BayesNet的所有变量,而不仅仅是Factor中使用的非条件变量和条件变量。
需要用到的函数:
Factor.getAllPossibleAssignmentDicts:返回该因子包含的所有assignmentDicts的列表
Factor.setProbability:设置函数,设置因子的概率
Factor.getProbability:获取因子的概率值
Factor.unconditionedVariables: 返回因子中无条件变量的副本
Factor.conditionedVariables: 返回因子中条件变量的副本
Factor.variableDomainsDict: 返回因子中变量域的副本
首先,先从factors列表中取出每一个factor,然后调用factor.conditionedVariables()函数取出这个因子中的条件变量。
然后取出这个因子的每一个条件变量,如果既不在setsOfUnconditioned(变量的可迭代对象,它包含了这个因子中非条件的变量),也不在setsOfConditioned(是一个变量的可迭代对象,
它包含了这个因素所制约的变量)中时,把这个变量加入到setsOfConditioned中。
然后再更新下这个因子的域字典。
最后调用Factor的构造函数,生成一个新的Factor.
然后处理限制:在那些行不等于1的factors上调用joinFactors。
最后返回一个新的Factor。
3、运行结果
1、question1
测试指令:
python autograder.py -q q1
2、question2
运行指令
python autograder.py -q q2
3、question3
运行指令
python autograder.py -q q2
在调试期间运行特定测试可能很有用,以查看仅打印出一组因素。例如,要仅运行第一个测试,请运行:
python autograder.py -t test_cases/q3/1-product-rule
完成了问题1、2、3,并且通过了测试。