Python 代码实现了一系列与贝叶斯网络相关的功能

python 复制代码
import sys

'''
WRITE YOUR CODE BELOW.
'''
 #想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: "黄页小艺"或公#众#号:"卧看星河"
from numpy import zeros, float32
#  pgmpy͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
import pgmpy
from pgmpy.models import BayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
#You are not allowed to use following set of modules from 'pgmpy' Library.͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
#
# pgmpy.sampling.*͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
# pgmpy.factors.*͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
# pgmpy.estimators.*͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌

def make_security_system_net():
    """
        Create a Bayes Net representation of the above security system problem. 
        Use the following as the name attribute: "H","C", "M","B", "Q", 'K",
        "D"'. (for the tests to work.)
    """
    BayesNet = BayesianNetwork()
    BayesNet.add_edges_from([ # add relationships/dependencies
        ('H', 'Q'),   
        ('C', 'Q'),   
        ('M', 'K'),   
        ('B', 'K'),   
        ('Q', 'D'),   
        ('K', 'D')])

    #raise NotImplementedError
    return BayesNet


def set_probability(bayes_net):
    """
        Set conditional probability distribution (cpd) for each node in the security system.
        Use the following as the name attribute: "H","C", "M","B", "Q", 'K",
        "D"'. (for the tests to work.)
    """
    cpd_H = TabularCPD('H', 2, values=[[0.5], [0.5]]) 
    cpd_C = TabularCPD('C', 2, values=[[0.7], [0.3]])
    cpd_M = TabularCPD('M', 2, values=[[0.2], [0.8]])
    cpd_B = TabularCPD('B', 2, values=[[0.5], [0.5]])

    cpd_Q = TabularCPD('Q', 2, 
                       values = [[0.95, 0.75, 0.45, 0.1],  # false
                                 [0.05, 0.25, 0.55, 0.9]], # true 
                       evidence=['H', 'C'], evidence_card=[2, 2])
    cpd_K = TabularCPD('K', 2,
                       values=[[0.99, 0.85, 0.5, 0.25],  # false (safe) 
                               [0.01, 0.15, 0.5, 0.75]], # true 
                       evidence=['M', 'B'], evidence_card=[2, 2])
    cpd_D = TabularCPD('D', 2,
                       values=[[0.98, 0.35, 0.6, 0.01],  # false (fail to get files)
                               [0.02, 0.65, 0.4, 0.99]], # true (success tp get files)
                       evidence=['Q', 'K'], evidence_card=[2, 2])
    
    bayes_net.add_cpds(cpd_H, cpd_C, cpd_M, cpd_B, cpd_Q, cpd_K, cpd_D) # add cpd to the network
    assert bayes_net.check_model()
    #raise NotImplementedError    
    return bayes_net


def get_marginal_double0(bayes_net):
    """
        Calculate the marginal probability that Double-0 gets compromised.
    """
    # Create an inference object
    solver = VariableElimination(bayes_net)
    marginal_prob = solver.query(variables=['D'], joint=False) # marginal inference on the D node
    double0_prob = marginal_prob.values[1]  # extract the probability that D = True and index 1 corresponds to that

    #raise NotImplementedError
    return double0_prob


def get_conditional_double0_given_no_contra(bayes_net):
    """
        Calculate the conditional probability that Double-0 gets compromised
        given Contra is shut down.
    """
    solver = VariableElimination(bayes_net)
    conditional_prob = solver.query(variables=['D'], evidence={'C': 0}, joint=False)
    double0_prob = conditional_prob.values[1]
    # raise NotImplementedError
    return double0_prob


def get_conditional_double0_given_no_contra_and_bond_guarding(bayes_net):
    """
        Calculate the conditional probability that Double-0 gets compromised
        given Contra is shut down and Bond is reassigned to protect M.
    """
    solver = VariableElimination(bayes_net)
    conditional_prob = solver.query(variables=['D'], evidence={'C': 0, 'B': 1}, joint=False)
    double0_prob = conditional_prob.values[1]
    # raise NotImplementedError
    return double0_prob


def get_game_network():
    """
        Create a Bayes Net representation of the game problem.
        Name the nodes as "A","B","C","AvB","BvC" and "CvA".  
    """
    BayesNet = BayesianNetwork()
    # BayesNet.add_edges_from([ # add relationships/dependencies
    #     ('H', 'Q'),   
    #     ('C', 'Q'),   
    #     ('M', 'K'),   
    #     ('B', 'K'),   
    #     ('Q', 'D'),   
    #     ('K', 'D')])
    raise NotImplementedError    
    return BayesNet


def calculate_posterior(bayes_net):
    """
        Calculate the posterior distribution of the BvC match given that A won against B and tied C. 
        Return a list of probabilities corresponding to win, loss and tie likelihood.
    """
    posterior = [0,0,0]
    # TODO: finish this function͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌    
    raise NotImplementedError
    return posterior # list 


def Gibbs_sampler(bayes_net, initial_state):
    """
        Complete a single iteration of the Gibbs sampling algorithm 
        given a Bayesian network and an initial state value. 
        
        initial_state is a list of length 6 where: 
        index 0-2: represent skills of teams A,B,C (values lie in [0,3] inclusive)
        index 3-5: represent results of matches AvB, BvC, CvA (values lie in [0,2] inclusive)
        
        Returns the new state sampled from the probability distribution as a tuple of length 6.
        Return the sample as a tuple. 

        Note: You are allowed to calculate the probabilities for each potential variable
        to be sampled. See README for suggested structure of the sampling process.
    """
    sample = tuple(initial_state)    
    # TODO: finish this function͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌

    variable_index = None # Your chosen variable

    if variable_index == 0:
        # Sample A͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
        raise NotImplementedError
    elif variable_index == 1:
        # Sample B͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
        raise NotImplementedError
    elif variable_index == 2:
        # Sample C͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
        raise NotImplementedError

    elif variable_index == 4:
        # Sample BvC͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
        raise NotImplementedError
    
    else:
        raise ValueError("Variable index out of range")


    return sample


def MH_sampler(bayes_net, initial_state):
    """
        Complete a single iteration of the MH sampling algorithm given a Bayesian network and an initial state value. 
        initial_state is a list of length 6 where: 
        index 0-2: represent skills of teams A,B,C (values lie in [0,3] inclusive)
        index 3-5: represent results of matches AvB, BvC, CvA (values lie in [0,2] inclusive)    
        Returns the new state sampled from the probability distribution as a tuple of length 6. 
    """
    A_cpd = bayes_net.get_cpds("A")      
    AvB_cpd = bayes_net.get_cpds("AvB")
    match_table = AvB_cpd.values
    team_table = A_cpd.values
    sample = tuple(initial_state)    
    # TODO: finish this function͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
    raise NotImplementedError    
    return sample


def compare_sampling(bayes_net, initial_state):
    """
        Compare Gibbs and Metropolis-Hastings sampling by calculating how long it takes for each method to converge.
    """    
    Gibbs_count = 0
    MH_count = 0
    MH_rejection_count = 0
    Gibbs_convergence = [0,0,0] # posterior distribution of the BvC match as produced by Gibbs 
    MH_convergence = [0,0,0] # posterior distribution of the BvC match as produced by MH
    # TODO: finish this function͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
    raise NotImplementedError        
    return Gibbs_convergence, MH_convergence, Gibbs_count, MH_count, MH_rejection_count


def sampling_question():
    """
        Question about sampling performance.
    """
    # TODO: assign value to choice and factor͏︅͏︀͏︋͏︋͏󠄌͏󠄎͏󠄋͏󠄊͏󠄏͏︌
    raise NotImplementedError
    choice = 2
    options = ['Gibbs','Metropolis-Hastings']
    factor = 0
    return options[choice], factor


def return_your_name():
    """
        Return your name from this function
    """
    return "Jinglin Xu"
    #raise NotImplementedError
  #想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: "黄页小艺"或公#众#号:"卧看星河"

这段 Python 代码实现了一系列与贝叶斯网络相关的功能,主要包括以下几个方面:

一、贝叶斯网络构建与设置

  1. 构建安全系统贝叶斯网络

    • make_security_system_net函数创建了一个表示安全系统的贝叶斯网络,定义了节点之间的依赖关系,包括"黑客攻击(H)""反情报机构(C)""军情六处被攻击(M)""邦德保护军情六处(B)""黑客获取文件(Q)""克格勃获取文件(K)""双重间谍被暴露(D)"等节点,并添加了相应的边表示依赖关系。

    • set_probability函数为安全系统贝叶斯网络中的每个节点设置条件概率分布(CPD)。例如,为"黑客攻击(H)""反情报机构(C)"等节点设置了二值分布,为"黑客获取文件(Q)""克格勃获取文件(K)""双重间谍被暴露(D)"等节点设置了基于其依赖节点的条件概率分布。

  2. 构建游戏贝叶斯网络(未完全实现)

    • get_game_network函数被定义用于创建一个表示游戏问题的贝叶斯网络,但目前仅抛出了NotImplementedError,说明该功能尚未实现。

二、概率计算

  1. 安全系统相关概率计算

    • get_marginal_double0函数使用变量消除法计算双重间谍被暴露的边际概率。
    • get_conditional_double0_given_no_contra函数计算在反情报机构关闭的条件下双重间谍被暴露的条件概率。
    • get_conditional_double0_given_no_contra_and_bond_guarding函数计算在反情报机构关闭且邦德被重新分配去保护军情六处的条件下双重间谍被暴露的条件概率。
  2. 游戏问题相关概率计算(未完全实现)

    • calculate_posterior函数被定义用于计算在给定特定比赛结果的情况下,某场比赛的后验分布,但目前仅抛出了NotImplementedError,说明该功能尚未实现。

三、采样算法

  1. Gibbs 采样

    • Gibbs_sampler函数实现了 Gibbs 采样算法的一次迭代。给定一个贝叶斯网络和初始状态,通过选择一个变量,根据当前状态下其他变量的值,从该变量的条件分布中采样一个新的值,然后返回更新后的状态作为一个元组。但目前函数中大部分内容抛出了NotImplementedError,说明该功能尚未完全实现。
  2. Metropolis-Hastings 采样(未完全实现)

    • MH_sampler函数被定义用于实现 Metropolis-Hastings 采样算法的一次迭代,但目前仅抛出了NotImplementedError,说明该功能尚未实现。
  3. 采样算法比较(未完全实现)

    • compare_sampling函数被定义用于比较 Gibbs 采样和 Metropolis-Hastings 采样算法的收敛速度,但目前仅抛出了NotImplementedError,说明该功能尚未实现。
  4. 采样问题回答(未完全实现)

    • sampling_question函数被定义用于回答关于采样性能的问题,但目前仅抛出了NotImplementedError,说明该功能尚未实现。

四、返回名字

  • return_your_name函数返回一个名字字符串。

总体来说,这段代码旨在构建和操作贝叶斯网络,实现概率计算和采样算法,以解决特定的概率推理问题,但目前许多功能尚未完全实现。

#想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: "黄页小艺" 。

相关推荐
好看资源平台7 分钟前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
进击的六角龙29 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂29 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc37 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤40 分钟前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
羊小猪~~43 分钟前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
wkj0011 小时前
php操作redis
开发语言·redis·php
lzhlizihang1 小时前
python如何使用spark操作hive
hive·python·spark
q0_0p1 小时前
牛客小白月赛105 (Python题解) A~E
python·牛客
极客代码1 小时前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow