CS188-Project 4

Bayes Net Structure

题目简述

  贝叶斯网络,又称信念网络,或有向无环图模型,是一种概率图模型,于1985年由Judea Pearl首先提出。它是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓朴结构是一个有向无环图(DAG)。

  贝叶斯网络是一种描述随机变量之间互相条件独立关系的有向无环图。在这个有向无环图中,每个节点代表一个随机变量对其父节点的条件概率分布 P ( X i ∣ p a r e n t s ( X i ) ) P( X_i | parents(X_i) ) PXiparents(Xi) ,每一条边可以理解成变量之间的联系。

  贝叶斯网络的有向无环图中的节点表示随机变量 ( X 1 , X 2 , . . . , X n ) (X_1,X_2,...,X_n) (X1,X2,...,Xn)。对于任意的随机变量,其联合概率可由各自的局部条件概率分布相乘而得出: P ( x 1 , . . . , x k ) = P ( x k ∣ x 1 , . . . , x k − 1 ) . . . P ( x 2 ∣ x 1 ) P ( x 1 ) P(x_1,...,x_k) = P(x_k|x_1,...,x_{k-1})...P(x_2|x_1)P(x_1) P(x1,...,xk)=P(xkx1,...,xk1)...P(x2x1)P(x1)

  朴素贝叶斯朴素在于两个假设:特征出现的概率与其他特征(条件)独立;每个特征同等重要。
  贝叶斯公式如下:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) = P ( 类 别 ∣ 特 征 ) = P ( 特 征 根 ∣ 类 别 ) P ( 类 别 ) P ( 特 征 ) P(A|B)=\frac{P(B|A)P(A)}{P(B)}=P(类别|特征)=\frac{P(特征根|类别)P(类别)}{P(特征)} P(AB)=P(B)P(BA)P(A)=P()=P()P()P()

游戏过程

  在本次吃豆人游戏中,整个地图是看不见的。当Pacman探索地图时,他可以了解周边邻域地图的信息。整座地图包含两栋房子:一个鬼屋,大部分大部分是红色的,一个食物屋,它可能是蓝色的。Pacman的目标是进入食物屋,同时避开鬼屋。

  Pacman会根据他的观察来解释哪栋房子是哪栋房子,以及抓住机会或收集更多证据之间的权衡。为了实现概率权衡,问题一要求构造一个空的贝叶斯网络让Pacman做出决策选择。

本题创建的贝叶斯网络为:(Raining --> Traffic <-- Ballgame)。同时,根据以下5个变量构造出本题的空白贝叶斯网络

  • 单个“x 位置”变量(控制房屋的 x 位置)
  • 单个“y 位置”变量(控制房屋的 y 位置)
  • 单个“食品屋”变量(包含房屋中心)
  • 单个“鬼屋”变量(包含房屋中心)
  • 每个单元格的大量“观察”变量 Pacman 可以测量

代码实现

    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

    edges.append((X_POS_VAR, GHOST_HOUSE_VAR))
    edges.append((X_POS_VAR, FOOD_HOUSE_VAR))
    edges.append((Y_POS_VAR, FOOD_HOUSE_VAR))
    edges.append((Y_POS_VAR, GHOST_HOUSE_VAR))

    for housePos in gameState.getPossibleHouses():
        for obsPos in gameState.getHouseWalls(housePos):
            obsVar = OBS_VAR_TEMPLATE % obsPos
            obsVars.append(obsVar)
            variableDomainsDict[obsVar] = OBS_VALS

    for obsVar in obsVars:
        edges.append((FOOD_HOUSE_VAR, obsVar))
        edges.append((GHOST_HOUSE_VAR, obsVar))

    variables = [X_POS_VAR, Y_POS_VAR] + HOUSE_VARS + obsVars
    net = bn.constructEmptyBayesNet(variables, edges, variableDomainsDict)
    return net, obsVars

结果展示

在这里插入图片描述

Bayes Net Probabilities

题目简述

  贝叶斯方法的特点是用概率去表示所有形式的不确定性,学习或其它形式的推理都用概率规则来实现。贝叶斯学习的结果表示为随机变量的概率分布,它可以解释为我们对不同可能性的信任程度。
  贝叶斯学派的起点是贝叶斯的两项工作:贝叶斯定理和贝叶斯假设。贝叶斯定理将事件的先验概率与后验概率联系起来。
  假定随机向量 x , θ x,θ x,θ的联合分布密度是 p(x,θ),他们的边际密度分别是p(x)、P(θ)。一般情况下设 x 是观测向量,θ 是未知参数向量,通过观测向量获得未知参数向量的估计,贝叶斯定理记作:
p ( θ ∣ x ) = π ( θ ) p ( x ∣ θ ) p ( x ) = π ( θ ) p ( x ∣ θ ) ∫ π ( θ ) p ( x ∣ θ ) d θ p(θ|x)=\frac{π(θ)p(x|θ)}{p(x)}=\frac{π(θ)p(x|θ)}{∫π(θ)p(x|θ)dθ} p(θx)=p(x)π(θ)p(xθ)=π(θ)p(xθ)dθπ(θ)p(xθ)

  贝叶斯方法对未知参数向量估计的一般方法为:
(1)将未知参数看成随机向量,这是贝叶斯方法与传统的参数估计方法的最大区别。
(2)根据以往对参数θ的知识,确定先验分布π(θ),它是贝叶斯方法容易引起争议的一步,因此而受到经典统计界的攻击。
(3)计算后验分布密度,做出对未知参数的推断。
  在第(2)步,如果没有任何以往的知识来帮助确定π(θ)π(θ),贝叶斯提出可以采用均匀分布作为其分布,即参数在它的变化范围内,取到各个值得机会是相同的,称这个假定为贝叶斯假设。

游戏过程

  在问题二中,需要使用在前一个问题中构建的空白 Bayes 网,并给出 y 位置变量的先验概率的 条件概率表CPT,可以参考上文的 f i l l X C P T fillXCPT fillXCPT函数。并且需要注意每栋房子可以处于四个位置之一:左上,右上,左下,或右下角。

代码实现

    yFactor.setProbability({Y_POS_VAR: BOTH_TOP_VAL}, PROB_BOTH_TOP)
    yFactor.setProbability({Y_POS_VAR: BOTH_BOTTOM_VAL}, PROB_BOTH_BOTTOM)
    yFactor.setProbability({Y_POS_VAR: LEFT_TOP_VAL}, PROB_ONLY_LEFT_TOP)
    yFactor.setProbability({Y_POS_VAR: LEFT_BOTTOM_VAL}, PROB_ONLY_LEFT_BOTTOM)
    bayesNet.setCPT(Y_POS_VAR, yFactor)

结果展示

在这里插入图片描述

Join Factors

题目简述

  在贝叶斯公式中:P(Y|X) = P(X|Y)*P(Y)/P(X)。给定先验概率P(Y),以及后验概率P(Y|X),然后再加入已知的Factors概率列表,通过贝叶斯公式得到P(X,Y)。
  其中后验概率P(Y|X ) 是根据先验概率P(Y )做了一个系数修正之后的,所以叫后验概率。

游戏过程

  本题需要实现在factorOperations.py文件中实现joinFactors函数。要求给出一个Factors列表,能够返回一个新的new_Factors列表。这个新的new_Factors列表的概率是输入Factors的相应行的乘积。

代码实现

factors_list = [i for i in factors]
    unconditioned_variables = []
    conditioned_variables = []
    variablesDomainDict = factors_list[0].variableDomainsDict()

    # Fill up our unconditioned_variables and conditioned_variables lists
    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]

    # Filters the conditioned_varaibles list
    for variable in unconditioned_variables:
        if variable in conditioned_variables:
            conditioned_variables.remove(variable)

    retFactor = Factor(unconditioned_variables, conditioned_variables, variablesDomainDict)

    # Getting and calculating the probabilities
    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

结果展示

在这里插入图片描述

收获

一、本次实习循序渐进,由浅入深的介绍以及应用贝叶斯网络到具体的实例上。贝叶斯网络,由一个有向无环图(DAG)和条件概率表(CPT)组成。问题一主要是构造一个空贝叶斯网络,即要求我们构造一个有向无环图(DAG)。在构造对应的有向无环图(DAG)中需要先了解本次实习需要构建的是怎么样贝叶斯网络。贝叶斯网络有三种结构:head-to-head;tail-to-tail;head-to-tail。我们需要构建的是head-to-head网络,满足P(a,b,c) = P(a)*P(b)*P(c|a,b)。并据此实现代码。

二、问题二要求我们构造一个条件概率表(CPT),这题的难度稍微较低。因为前面已经给出了fillXCPT函数,我们需要在这一个函数的基础上,实现fillYCPT函数。

三、通过这次实习以及在实习中学到的理解,能够感受到贝叶斯定理特别实用。在生活中经常能遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
  同时,贝叶斯网络又假设某一节点条件独立于其所有非直接前驱前辈节点,这样的假设让贝叶斯网络可以方便计算联合概率分布。贝叶斯网络模拟了人的认知思维推理模式,用一组条件概率函数以及有向无环图对不确定性的因果推理关系建模,因此其具有更高的实用价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值