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函数返回一个名字字符串。

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

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

相关推荐
databook13 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar14 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805115 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_15 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机21 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i1 天前
drf初步梳理
python·django
每日AI新事件1 天前
python的异步函数
python