CS188-Project4

CS188-Project4

一、问题描述:

整个地图是不可见的。在探索过程中,他了解了有关相邻细胞的信息。地图包含两个房子:一个鬼屋,可能大部分是红色的,还有一个食品屋,可能大部分是蓝色的。吃豆人的目标是进入美食屋,同时避开鬼屋。吃豆人将根据他的观察推断哪个房子是哪个,并推断在冒险或收集更多证据之间的权衡。

问题目录如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYRQd2x5-1633888640976)(C:\Users\颜霸灿烈\AppData\Roaming\Typora\typora-user-images\image-20211011012925451.png)]
核心文件如下:

问题解析:

1.贝叶斯网络结构:

实现BayesAgents.pyconstructBayesNet,它构建了一个空贝叶斯网络,其结构如下所述:

贝叶斯网络图
  • X 位置决定哪个房子在棋盘的哪一边。它要么是食物剩下的,要么是鬼魂留下的。
  • Y 位置决定了房屋的垂直方向。它同时模拟两个房子的垂直位置,并具有四个值之一:both-top、both-bottom、left-top 和 left-bottom。“左上”顾名思义:棋盘左边的房子在上面,棋盘右边的房子在下面。
  • 食屋和鬼屋指定了两间屋子的实际位置。它们都是“X 位置”和“Y 位置”的确定性函数。
  • 观察结果是吃豆人在绕着棋盘旅行时所做的测量。请注意,有许多这样的节点——可能是房屋墙壁的每个棋盘位置都有一个。如果给定位置没有房子,则对应的观察值是none;否则它要么是红色,要么是蓝色,颜色的精确分布取决于房子的种类。

2.贝叶斯网络概率:

实现BayesAgents.pyfillYCPT ,不同于上一问的是,这一问题目已经规定好了X 位置、房屋和观察因素,我们需要采用在上一个问题中构建的贝叶斯网络,并指定控制 Y 位置变量的因素。

3.加入因素:

实现factorOperations.pyjoinFactors,它接受一个Factor的列表并返回一个新的Factor,其概率条目是输入Factor的相应行的乘积。

joinFactors可以用作乘积规则,如果有一个 P ( X ∣ Y ) P(X|Y) P(XY) 形式的因子和另一个 P ( Y ) P(Y) P(Y) 形式的因子,那么加入这些因子将产生 P ( X , Y ) P(X ,Y) P(X,Y)。因此,joinFactors允许合并条件变量(在本例中为 Y)的概率。但是,不应该假设joinFactors被称为概率表-这是可以调用joinFactorsFactors,它的行总和不等于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、训练贝叶斯网络参数——估计出各节点的条件概率表。这一步也就是要完成条件概率表的构造,如果每个随机变量的值都是可以直接观察的,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值