python中的贝叶斯网络构建

python中的贝叶斯网络构建,第1张

我只是应用一下说明一下,本文会详细说一下如何通过TabularCPD构造条件概率分布CPD(condition probability distribution)表格,以及各个参数的意义,如果需要完整的贝叶斯网络案例请看这个大神

首先咱是这么个网络
先把点点连起来,前面是箭头出来的事务,后面是箭头到达的事务,如L->N

from pgmpy.models import BayesianNetwork
my_model = BayesianNetwork([('L','N'),('I','N'),('S','N'),('N','R'),('S','R')]) # créer le modèle

你要是喜欢,可以和我一样画一下(就是代码多了点hh)
这里我是用graphviz 中的 Digraph画的,当然比较麻烦,需要下载包再配置环境,还要修改os(建议跳过🐶)

from pgmpy.factors.discrete import TabularCPD
import os
os.environ["PATH"] += os.pathsep + r'D:\software\Anaconda\Lib\graphviz\bin/' # changer le route de graphviz
from pgmpy.models import BayesianNetwork
from graphviz import Digraph
#Probabilistic Graphical Model(概率图模式)
#Directed Acyclic Graph(有向无环图 DAG)
#构建网络,将节点的边连到一起

my_model = BayesianNetwork([('L','N'),('I','N'),('S','N'),('N','R'),('S','R')]) # créer le modèle
node_attr = dict(shape ="ellipse",color = "lightblue2",style ="filled") # dessiner les noeuds
dot = Digraph(node_attr=node_attr) # utiliser dot pour le présenter
dot.attr(rankdir ="LR") # type de graph
edges = my_model.edges() # lier les edges
for a,b in edges:
    dot.edge(a,b)
print(dot.source)

然后就是将各个事件发生的概率输入


好啦,终于可以讲CPD啦,我这个笨瓜一直看不懂别人写的,这里的
variable就是该变量的别名,card在高数中表示元素个数,所以就是变量的元素个数,咱看I的元素只有T/F,所以是2啦。
evidence就是证据,证据啊证据,比如 S和N会推到R嘛,那S和N就是R的证据。
evidence_card就是证据的元素个数,一一对应来写,比如S是R的证据,S的值是T/F,所以evidence_card对应的就是2,同理N对应的也是2,所以这边就是[2,2],希望我说明白了呜呜。
value就是变量对应的值了嘛,我这边是True作第一行,False作第二行,同学说底层实现是按照上面的表来的,不能换。

#通过TabularCPD构造条件概率分布CPD(condition probability distribution)表格
#最后将CPD数据添加到贝叶斯网络结构中,完成贝叶斯网络的构造
# variable:变量名
# variable_card:基数(可影响的变量数),如I有两个可能:True/false,就是2
# values:变量值,对应上面变量的值
# evidence:指向该变量(会导致该事件的事件)
#evidence_card:每个evidence事件对应的可能数,如N的L有True和False,则为2
cpd_I = TabularCPD(variable='I',variable_card=2,values=[[0.21],[0.79]])
cpd_L = TabularCPD(variable='L',variable_card=2,values=[[0.08],[0.92]])
cpd_S = TabularCPD(variable='S',variable_card=2,values=[[0.12],[0.88]])
cpd_R = TabularCPD(variable='R',variable_card=2,
                   values=[[0.38,0.08,0.16,0.05],
                           [0.62,0.92,0.84,0.95]],
                   evidence=['N','S'],
                   evidence_card=[2,2])
cpd_N = TabularCPD(variable='N',variable_card=2,
                   values=[[0.92,0.88,0.79,0.73,0.22,0.08,0.17,0.03],
                           [0.08,0.12,0.21,0.27,0.78,0.92,0.83,0.97]],
                   evidence=['L','S','I'],
                   evidence_card=[2,2,2])
my_model.add_cpds(cpd_N,cpd_R,cpd_S,cpd_L,cpd_I)
#检查一下模型对不对,输出True就好了
print(my_model.check_model())

暂时就这样,知道更多了再改

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/799719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存