D分离python实现

7eumitmz  于 2023-03-24  发布在  Python
关注(0)|答案(2)|浏览(180)

我是一个全新的贝叶斯网络领域.对于我的项目,我需要检查所有可能的d分离条件存在于一个7节点DAG和我正在寻找一些好的Python代码.我的编程知识是有限的(一点数值分析和数据结构;但我理解d分离,e分离和dag中的其他概念相当好)。
如果有人能指出在哪里可以找到这样一个特定的代码,这将是非常有帮助的。请注意,我想要一个python代码,检查所有的条件独立性,从d分离在一个7节点dag
我会更高兴与算法检查是否每个路径是阻塞或不等,而不是一个建立在半图形 axios 。
我不知道我应该去哪里找,或者我应该问谁,所以任何帮助都会非常感激。

4xrmg8kj

4xrmg8kj1#

我想你明白你的需求是一个非常大的列表。即使我们只考虑2个变量之间的d-分离(由一组节点约束)。
无论如何,使用pyAgrum(https://agrum.org)可以很容易地做到这一点。

import itertools
import pyAgrum as gum

# create a BN
bn=gum.fastBN("A->B<-C->D->E->F;B->E<-G");

# print the indepency model by testing d-separations

# how to iterate for each subset of an interable
def powerset(iterable):
    """
    powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
    """
    xs = list(iterable)
    # note we return an iterator rather than a list
    return itertools.chain.from_iterable(itertools.combinations(xs,n) for n in range(len(xs)+1))

# testing every d-separation
for i in bn.names():
    for j in bn.names()-{i}:
        for k in powerset(bn.names()-{i,j}):
            if bn.isIndependent(i,j,k):
                print(f"{i} indep {j} given {k}")

结果(在笔记本中):

zbdgwd5y

zbdgwd5y2#

我做了一个软件包,准确地实现了你想要的功能。真巧啊!

pip install cdpi
from cdpi import pattern
ptn = pattern()
ptn.add_edges([
    ('A', 'B'),
    ('C', 'B'),
    ('B', 'D'),
    ('E', 'D'),
    ('F', 'D'),
    ('D', 'G')
])
ptn.draw()

[out]图形可视化也支持!但10声誉限制...😂我不能上传图像...

ds = ptn.get_all_d_separation() # ds is 2-d dictionary
ds['F']['A'] #example

[出]

{(),
 ('B',),
 ('B', 'C'),
 ('B', 'D'),
 ('B', 'D', 'C'),
 ('B', 'E'),
 ('B', 'E', 'C'),
 ('B', 'E', 'D'),
 ('B', 'E', 'D', 'C'),
 ('B', 'E', 'D', 'G'),
 ('B', 'E', 'G'),
 ('B', 'E', 'G', 'C'),
 ('B', 'G'),
 ('B', 'G', 'C'),
 ('C',),
 ('E',),
 ('E', 'C'),
 ('G', 'B', 'D'),
 ('G', 'B', 'D', 'C'),
 ('G', 'E', 'C', 'B', 'D')}

如果要查看整个代码或其工作原理,请参见hered-separation part

相关问题