CS188-Project4
一、问题描述:
整个地图是不可见的。在探索过程中,他了解了有关相邻细胞的信息。地图包含两个房子:一个鬼屋,可能大部分是红色的,还有一个食品屋,可能大部分是蓝色的。吃豆人的目标是进入美食屋,同时避开鬼屋。吃豆人将根据他的观察推断哪个房子是哪个,并推断在冒险或收集更多证据之间的权衡。
问题目录如下:
核心文件如下:
问题解析:
1.贝叶斯网络结构:
实现BayesAgents.py
的constructBayesNet
,它构建了一个空贝叶斯网络,其结构如下所述:
- X 位置决定哪个房子在棋盘的哪一边。它要么是食物剩下的,要么是鬼魂留下的。
- Y 位置决定了房屋的垂直方向。它同时模拟两个房子的垂直位置,并具有四个值之一:both-top、both-bottom、left-top 和 left-bottom。“左上”顾名思义:棋盘左边的房子在上面,棋盘右边的房子在下面。
- 食屋和鬼屋指定了两间屋子的实际位置。它们都是“X 位置”和“Y 位置”的确定性函数。
- 观察结果是吃豆人在绕着棋盘旅行时所做的测量。请注意,有许多这样的节点——可能是房屋墙壁的每个棋盘位置都有一个。如果给定位置没有房子,则对应的观察值是none;否则它要么是红色,要么是蓝色,颜色的精确分布取决于房子的种类。
2.贝叶斯网络概率:
实现BayesAgents.py
的fillYCPT
,不同于上一问的是,这一问题目已经规定好了X 位置、房屋和观察因素,我们需要采用在上一个问题中构建的贝叶斯网络,并指定控制 Y 位置变量的因素。
3.加入因素:
实现factorOperations.py
的joinFactors
,它接受一个Factor
的列表并返回一个新的Factor
,其概率条目是输入Factor
的相应行的乘积。
joinFactors
可以用作乘积规则,如果有一个
P
(
X
∣
Y
)
P(X|Y)
P(X∣Y) 形式的因子和另一个
P
(
Y
)
P(Y)
P(Y) 形式的因子,那么加入这些因子将产生
P
(
X
,
Y
)
P(X ,Y)
P(X,Y)。因此,joinFactors
允许合并条件变量(在本例中为 Y)的概率。但是,不应该假设joinFactors
被称为概率表-这是可以调用joinFactors
的Factors
,它的行总和不等于1。
二、解题思路:
(1)贝叶斯网络结构
首先看题目提示,构造空的贝叶斯网络需要五种变量,x位置、y位置、食品屋、鬼屋和吃豆人在绕着棋盘旅行时所做的测量值(具体变量含义在问题解析中已阐述),同时网络一定包含有向边,那么构建网络所需就集齐了:变量列表、向边列表以及变量值域,分别对应代码中变量。
obsVars = []
edges = []
variableDomainsDict = {}
按照上图网络结构构建有向边列表:
[(X_POS_VAR, GHOST_HOUSE_VAR), (X_POS_VAR, FOOD_HOUSE_VAR),
(Y_POS_VAR, FOOD_HOUSE_VAR), (Y_POS_VAR, GHOST_HOUSE_VAR)]
最后构建网络即可。
代码如下:
"*** YOUR CODE HERE ***"
"贝叶斯网络结构"
variableDomainsDict[X_POS_VAR] = X_POS_VALS
variableDomainsDict[Y_POS_VAR] = Y_POS_VALS
variableDomainsDict[FOOD_HOUSE_VAR] = HOUSE_VALS
variableDomainsDict[GHOST_HOUSE_VAR] = HOUSE_VALS
edgeTuplesList = [(X_POS_VAR, GHOST_HOUSE_VAR), (X_POS_VAR, FOOD_HOUSE_VAR),
(Y_POS_VAR, FOOD_HOUSE_VAR), (Y_POS_VAR, GHOST_HOUSE_VAR)]
edges.extend(edgeTuplesList)
for housePos in gameState.getPossibleHouses():
for obsPos in gameState.getHouseWalls(housePos):
obsVar = OBS_VAR_TEMPLATE % obsPos
obsVars.append(obsVar)
edges.append((FOOD_HOUSE_VAR, obsVar))
edges.append((GHOST_HOUSE_VAR, obsVar))
variableDomainsDict[obsVar] = OBS_VALS
variables = [X_POS_VAR, Y_POS_VAR] + HOUSE_VARS + obsVars
net = bn.constructEmptyBayesNet(variables, edges, variableDomainsDict)
return net, obsVars
"*** END YOUR CODE HERE ***"
(2)贝叶斯网络概率
对于给出的y position变量所指向的每一个值观测值,按照如下提示进行概率的设定,然后建立条件概率表即可。
代码如下:
"*** YOUR CODE HERE ***"
"贝叶斯概率"
yFactor.setProbability({Y_POS_VAR: LEFT_TOP_VAL}, PROB_ONLY_LEFT_TOP)
yFactor.setProbability({Y_POS_VAR: BOTH_TOP_VAL}, PROB_BOTH_TOP)
yFactor.setProbability({Y_POS_VAR: LEFT_BOTTOM_VAL}, PROB_ONLY_LEFT_BOTTOM)
yFactor.setProbability({Y_POS_VAR: BOTH_BOTTOM_VAL}, PROB_BOTH_BOTTOM)
bayesNet.setCPT(Y_POS_VAR, yFactor)
"*** END YOUR CODE HERE ***"
(3)加入因素
先看题目提示:1.应该计算用于连接这些因素的非条件变量集和条件变量集;2.假设所有加入的变量域因素是相同的因为它们同样来自贝叶斯网络;3.只允许非条件变量出现在一个输入因素中。
所以:1.计算非条件变量和条件变量;2.过滤条件变量列表;3.计算概率。
代码如下:
"加入因素"
factors_list = [i for i in factors]
unconditioned_variables = []
conditioned_variables = []
variablesDomainDict = factors_list[0].variableDomainsDict()
# 填充无条件变量和条件变量列表
for factor in factors_list:
unconditioned_variables += [i for i in factor.unconditionedVariables() if i not in unconditioned_variables]
conditioned_variables += [i for i in factor.conditionedVariables() if i not in conditioned_variables]
# 过滤条件变量列表
for variable in unconditioned_variables:
if variable in conditioned_variables:
conditioned_variables.remove(variable)
retFactor = Factor(unconditioned_variables, conditioned_variables, variablesDomainDict)
# 获取和计算概率
assignments = retFactor.getAllPossibleAssignmentDicts()
for assignment in assignments:
probability = 1
for factor in factors_list:
probability = probability * factor.getProbability(assignment)
retFactor.setProbability(assignment, probability)
return retFactor
"*** END YOUR CODE HERE ***"
三、运行结果:
四、总结思考:
1.贝叶斯网络(Bayesian network),又称信念网络,或有向无环图模型,是一种概率图模型,可以模拟人类推理过程中因果关系的不确定性处理。通过本次对贝叶斯网络的实践,理论落地也是加深理论理解的过程。从生活中的可能不可能到概率、从贝叶斯公式到贝叶斯网络,看似不可能的事物出现了,看似无关联的事物却产生了并且还在不断延伸。这个概念诞生的过程就很不可思议,可实践之处也是我超出我知识或者说想象范畴的,这是我在这次实验和贝叶斯网络学习中感受到的。
2.本实验构建出一个贝叶斯网络,围绕着它的组成元素1.无回路的有向无环图 2.节点参数与边的方向,下面分这两步来描述下如何构造一个贝叶斯网络。
1、确定随机变量间的拓扑关系,形成无回路的有向无环图。想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。
2、训练贝叶斯网络参数——估计出各节点的条件概率表。这一步也就是要完成条件概率表的构造,如果每个随机变量的值都是可以直接观察的,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂。