CS188-project4-q4~6

CS188-Project4(Q4-Q6)

一、问题描述:

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

问题目录如下:
在这里插入图片描述
核心文件如下:
在这里插入图片描述
问题解析:

1.消元:

​ 在 factorOperations.py 中实现 eliminate 函数,它需要一个 Factor 和一个要消除变量并返回一个不包含该变量的新 Factor。 对于 Factor 中的所有条目求和,这些条目仅在被消除的变量值上有所不同。

​ 换而言之就是实现变量消元法。

  • eliminate应该返回一个新的Factor
  • eliminate可用于将概率表的变量边缘化。例如:
    • 消除 (P(X,Y|Z),Y) = P(X|Z)
    • 消除 (P(X,Y|Z),X) = P(Y|Z)
  • Factors 存储原始 BayesNetvariableDomainsDict,而不仅仅是它们使用的无条件和条件变量。 因此,返回的 Factor 应该与输入Factor 具有相同的 variableDomainsDict

2.正则化:

​ 在factorOperations.py中实现 normalize函数,接受一个 Factor 作为输入并对其进行归一化,也就是说,它缩放 Factor 中的所有条目,使得 Factor 中条目的总和为 1。如果输入因子中的概率总和为 0,您应该返回 None。

​ 即实现正则化,将所有行的概率加和为1以防止过拟合。

  • normalize应该返回一个新的Factor
  • normalize不影响概率分布(因为概率分布必须已合并为 1);
  • 请记住,Factors 存储原始 BayesNetvariableDomainsDict,而不仅仅是它们使用的无条件和条件变量。 因此,返回的 Factor 应该与输入 Factor 具有相同的 variableDomainsDict

3.变量消除:

​ 在 inference.py.中实现inferenceByVariableElimination 函数,它实现了概率查询,该查询使用贝叶斯网络、查询变量列表和证据表示。

  • 算法应该以消除顺序迭代隐藏变量,执行连接和消除该变量,直到只剩下查询和证据变量;
  • 输出因子中概率的总和应为 1(因此它是真实的条件概率,以证据为条件);
  • 查看 inference.py 中的inferenceByEnumeration 函数以获取有关如何使用所需函数的示例。 (提醒:枚举推理首先连接所有变量,然后消除所有隐藏变量。相反,变量消除通过迭代所有隐藏变量来交错连接和消除,然后在继续之前对单个隐藏变量执行连接和消除 到下一个隐藏变量。)
  • 需要注意这种特殊情况,即加入的因子只有一个无条件变量(文档字符串更详细地指定了要做什么)。

二、解题思路:

(1)消元

为了去除重复计算,降低贝叶斯网络的推理复杂度,我们实现变量消除(因为它等价于直接从联合概率分布求边缘概率分布),就是对联合概率不断求和消除其中的变量,最后得到边缘分布:1.点积 2.对变量求和 。

在本题中需要我们实现变量消除算法中的消除运算,输入一组因素和待消除变量,输出剩余变量。

具体步骤如下: (1)首先获取无条件变量(2)去除要去除的变量(3)得到概率表然后由此计算新的概率值(4)直至计算完所有概率即可返回新因子(概率表)

代码如下:

def eliminate(factor, eliminationVariable):
    """
    Question 4: Your eliminate implementation
    """
    # autograder tracking -- don't remove
    if not (callTrackingList is None):
        callTrackingList.append(('eliminate', eliminationVariable))

    # typecheck portion
    if eliminationVariable not in factor.unconditionedVariables():
        print("Factor failed eliminate typecheck: ", factor)
        raise ValueError("Elimination variable is not an unconditioned variable " \
                         + "in this factor\n" +
                         "eliminationVariable: " + str(eliminationVariable) + \
                         "\nunconditionedVariables:" + str(factor.unconditionedVariables()))

    if len(factor.unconditionedVariables()) == 1:
        print("Factor failed eliminate typecheck: ", factor)
        raise ValueError("Factor has only one unconditioned variable, so you " \
                         + "can't eliminate \nthat variable.\n" + \
                         "eliminationVariable:" + str(eliminationVariable) + "\n" + \
                         "unconditionedVariables: " + str(factor.unconditionedVariables()))

    "*** YOUR CODE HERE ***"

    final_uncond_vars = factor.unconditionedVariables()
    #print(final_uncond_vars)
    final_uncond_vars.remove(eliminationVariable)
    return_factor = Factor(final_uncond_vars, factor.conditionedVariables(), factor.variableDomainsDict())

    for assignment in return_factor.getAllPossibleAssignmentDicts():
        initial_prob = 0

        possible_dicts = [d for d in factor.getAllPossibleAssignmentDicts() if assignment.items() <= d.items()]

        for dictionary in possible_dicts:
            initial_prob += factor.getProbability(dictionary)
        return_factor.setProbability(assignment, initial_prob)
    return return_factor

    "*** END YOUR CODE HERE ***"

return eliminate
(2)正则化

在本题中要实现正则化,即对消元后的概率表更改概率值,依照条件,选择与证据匹配的联合概率,然后对选择正则化。

具体步骤如下:(1)找到条件变量和无条件变量(2)将无条件变量中的概率和为1的因子加入条件变量中(3)得到总体概率表,然后计算每个因素的概率总和,为0则返回none,为1则直接返回,否则进行归一化计算:用1除以总和然后用该值乘以原概率更新概率表。

代码如下:

def normalize(factor):
    """
    Question 5: Your normalize implementation
    """

    # typecheck portion
    variableDomainsDict = factor.variableDomainsDict()
    for conditionedVariable in factor.conditionedVariables():
        if len(variableDomainsDict[conditionedVariable]) > 1:
            print("Factor failed normalize typecheck: ", factor)
            raise ValueError("The factor to be normalized must have only one " + \
                             "assignment of the \n" + "conditional variables, " + \
                             "so that total probability will sum to 1\n" +
                             str(factor))

    "*** YOUR CODE HERE ***"


    new_cond_vars = factor.conditionedVariables()
    new_uncond_vars = factor.unconditionedVariables()

    # finding and adding unconditioned vars with 1 domain entry to conditioned vars.
    for var in factor.unconditionedVariables():
        if len(factor.variableDomainsDict()[var]) == 1:
            new_cond_vars.add(var)
            new_uncond_vars.remove(var)

    return_factor = Factor(new_uncond_vars, new_cond_vars, factor.variableDomainsDict())
    initial_sum = 0
    for assignment in factor.getAllPossibleAssignmentDicts():
        initial_sum += factor.getProbability(assignment)
    if initial_sum == 0:
        return None
    elif initial_sum == 1:
        return factor
    else:
        # modifying all probs by scaling factor to allow sum to 1
        scaling_factor = 1 / initial_sum
        for assignment in factor.getAllPossibleAssignmentDicts():
            return_factor.setProbability(assignment, factor.getProbability(assignment) * scaling_factor)
    return return_factor
    "*** END YOUR CODE HERE ***"
(3)变量消除

在本题中需要实现基于变量消元法的后验概率推理算法。因为变量消除顺序影响推理复杂度,所以不仅需要考虑所有相关因素,同时还要考虑所有因素的顺序。

实现伪代码如下:

VE(N,E,e,Q,p):
输入: N 一个贝叶斯网
E 证据变量
e 证据变量的取值
Q 查询变量
p 消元顺序,包含所有不在Q和E中的变量
输出: P(Q|E=e)

  1. 将N中所有概率分布的集合赋值给F
  2. 在F的因子中,将证据变量E设置为其观测值e
  3. while(p不空):
  4. 设Z为p中排在最前面的变量,将Z从p中删除
  5. F←Elim(F,Z)
  6. end while
  7. 将F中所有因子相乘,得到Q的函数h(Q)
  8. return h(Q)/sum_Q(h(Q))

代码如下:

"*** YOUR CODE HERE ***"

currentFactorsList = bayesNet.getAllCPTsWithEvidence(evidenceDict)
for var in eliminationOrder:
    currentFactorsList, joinedFactor = joinFactorsByVariable(currentFactorsList, var)
    if len(joinedFactor.unconditionedVariables()) > 1:
        currentFactorsList.append(eliminate(joinedFactor, var))

currentFactorsList = joinFactors(currentFactorsList)
currentFactorsList = normalize(currentFactorsList)
return currentFactorsList


"*** END YOUR CODE HERE ***"
(4)运行结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、总结思考:

​ 本次实验实现的贝叶斯网络的推理应用,主要利用变量消除法来降低贝叶斯网络推理复杂度。贝叶斯网推理主要包含三大类问题:后验概率问题、最大后验假设问题和最大可能解释问题。其中后验概率问题是最基本的问题。后验概率问题是指已知贝叶斯网中某些变量的值,计算另外一些变量的后验概率分布。一个简单的贝叶斯网络要进行的运算就有很多,为了利用联合概率分布的分解来降低推理复杂度我们可以先计算边缘概率,联合分布的分解之所以能降低推理复杂度,是因为它使得运算局部化。在变量众多的网络中,这种运算量的降低可能是指数级的,与贝叶斯网的节点度有关,所以有了消元运算。

​ 这些知识点是环环相扣的,如果上课认真听讲了这些知识点的融会贯通就不会是问题,可是我在写作业范难时才意识到……

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值