官网项目介绍
源码框架下载
这次实习是继续上一次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