ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

人工智能-Project 4: Inference in Bayes Nets(2)

2021-10-22 13:06:43  阅读:263  来源: 互联网

标签:retFactor Inference 变量 factors assignment factor Project Bayes Factor


官网项目介绍
源码框架下载
这次实习是继续上一次Inference in Bayes Nets剩下的问题进行完善

1、实习介绍

前面已经介绍过了,就不再重复了

2、问题编码

1、Question 4-Eliminate

  • 在factoropertions.py中实现消除功能。它需要一个Factor和一个变量来消除,并返回一个不包含该变量的新Factor。这相当于将Factor中的所有条目相加,这些条目仅在被消除的变量值上存在差异。
  • 应该计算无条件变量集和条件变量集通过消除变量获得的Factor的变量消除变量,返回一个新Factor,其中所有行eliminationVariable与匹配的行相加其他变量的赋值。
		# 需要用到的参数
		Factor.getAllPossibleAssignmentDicts
        Factor.getProbability
        Factor.setProbability
        Factor.unconditionedVariables
        Factor.conditionedVariables
        Factor.variableDomainsDict
"*** YOUR CODE HERE ***"
        # marker
        # 从原始因子中获取无条件/条件变量
        unconditioned_variables = list(factor.unconditionedVariables())
        conditioned_variables = list(factor.conditionedVariables())
        variablesDomainDict = factor.variableDomainsDict()

        # 产生我们的新Facter
        retFactor = Factor([i for i in unconditioned_variables if i != eliminationVariable], \
                           conditioned_variables, variablesDomainDict)

        # 获取和计算概率
        assignments = retFactor.getAllPossibleAssignmentDicts()
        print("assignments:", assignments)
        print("variablesDomainDict:", variablesDomainDict)
        print("eliminationVariable:", eliminationVariable)
        print("eliminated_values:", variablesDomainDict[eliminationVariable])
        print("variablesDomainDict[eliminationVariable]:", variablesDomainDict[eliminationVariable])
        for assignment in assignments:
            probability = 0
            for eliminated_values in variablesDomainDict[eliminationVariable]:
                prev_assignment = assignment.copy()
                prev_assignment[eliminationVariable] = eliminated_values
                probability += factor.getProbability(prev_assignment)

            retFactor.setProbability(assignment, probability)

        return retFactor

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

2、Question 5-Normalize

  • 归一化因子的条件变量集包括输入因子的条件变量以及任何输入因子的无条件变量,在其
    领域由于该变量的域中只有一个条目,因此可以假设它被指定为只有一个变量的证据在其域中,者在其域中只有一个条目可以开始。这模糊了证据分配和变量之间的区别对于单值域,但这是可以的,因为我们必须分配在其域中只有一个值的变量将转换为该单个值。
  • 返回一个新因子,其中表中所有概率之和为1。这应该是一个新的因素,而不是对现有因素的修改。如果输入因子中的概率之和为0,应该不返回任何内容。
  • 这个函数在用于概率推理查询的结尾。因此,所有变量中都包含多个元素域被假定为无条件的。normalize有更多的通用实现,但我们只会实现这个版本。
# 用到的参数
	Factor.getAllPossibleAssignmentDicts
    Factor.getProbability
    Factor.setProbability
    Factor.unconditionedVariables
    Factor.conditionedVariables
    Factor.variableDomainsDict
"*** YOUR CODE HERE ***"
    unconditioned_variables = list(factor.unconditionedVariables())
    conditioned_variables = list(factor.conditionedVariables())
    variablesDomainDict = factor.variableDomainsDict()

    # 一般是我们的因素
    retFactor_conditioned_varaibles = conditioned_variables \
                                      + [i for i in unconditioned_variables if len(variableDomainsDict[i]) == 1]
    retFactor_unconditioned_varaibles = [i for i in unconditioned_variables if i not in retFactor_conditioned_varaibles]
    retFactor = Factor(retFactor_unconditioned_varaibles, retFactor_conditioned_varaibles, variablesDomainDict)

    #计算用于规范化目的的总概率
    total_probablity = 0
    for assignment_dict in factor.getAllPossibleAssignmentDicts():
        # print("Probability of", assignment_dict, "is", factor.getProbability(assignment_dict))
        total_probablity += factor.getProbability(assignment_dict)

    # 为我们的retFactor生成概率
    for assignment in retFactor.getAllPossibleAssignmentDicts():
        probability = factor.getProbability(assignment)
        retFactor.setProbability(assignment, probability / total_probablity)

    return retFactor
    "*** END YOUR CODE HERE ***"

3、Question 6-Variable Elimination

此函数应执行概率推断查询,该查询返回系数:P(queryVariables | evidenceDict)
  • 它应该通过交叉连接变量来执行推理按照变量的顺序,根据取消订单。有关枚举的示例,请参见推断ByEnumeration如何使用这些函数。
  • 我们需要使用joinFactorsByVariable来联接所有的因子包含一个变量以便自动加载器认识到您执行了正确的连接和消除。
  • 如果要从中消除变量的因子只有一个无条件变量,不应消除它取而代之的是放弃这个因素。这是因为消除的结果将是1(我们将边缘化所有无条件变量),但它不是有效因子。因此,这简化了消除结果的使用。
  • 概率之和应为1(因此为真)
bayesNet:   我们正在进行查询的贝叶斯网。queryVariables:无条件变量的列表在推理查询中。
evidenceDict:    指定的赋值dict{variable:value}作为证据呈现的变量(条件)在推理查询中。
eliminationOrder: 消除中变量的顺序。
Hint: BayesNet.getAllCPTsWithEvidence
将返回所有条件概率表
即使传入一个空的dict(或无)作为证据ICT。
在这种情况下,它不会专门化CPT中的任何变量域。
"*** YOUR CODE HERE ***"
        # print("eliminationOrder:", eliminationOrder)
        all_factors = bayesNet.getAllCPTsWithEvidence(evidenceDict)

        for elimination_variable in eliminationOrder:
            unjoined_factors, joined_factors = joinFactorsByVariable(all_factors, elimination_variable)
            all_factors = unjoined_factors

            if len(joined_factors.unconditionedVariables()) != 1:
                all_factors.append(eliminate(joined_factors, elimination_variable))

        return normalize(joinFactors(all_factors))

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

3、运行结果

1、Question 4-Eliminate

运行指令:
python autograder.py -q q4

在这里插入图片描述

在调试期间运行特定测试可能很有用,以查看仅打印出一组因素。例如,要仅运行第一个测试,请运行:
python autograder.py -t test_cases/q4/1-simple-eliminate

在这里插入图片描述

2、Question 5-Normalize

运行指令:
python autograder.py -q q5

在这里插入图片描述

在调试期间运行特定测试可能很有用,以查看仅打印出一组因素。例如,要仅运行第一个测试,请运行:
python autograder.py -t test_cases/q5/1-preNormalized

在这里插入图片描述

3、Question 6-Variable Elimination

运行指令:
python autograder.py -q q6

在这里插入图片描述

在调试期间运行特定测试可能很有用,以查看仅打印出一组因素。例如,要仅运行第一个测试,请运行:
python autograder.py -t test_cases/q6/1-disconnected-eliminate

在这里插入图片描述

标签:retFactor,Inference,变量,factors,assignment,factor,Project,Bayes,Factor
来源: https://blog.csdn.net/xiten/article/details/120890770

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有