哪种数据结构组合可以有效地存储离散贝叶斯网络?


22

我了解贝叶斯网络背后的理论,并且想知道在实践中建立贝叶斯网络需要做什么。假设在这个例子中,我有一个由100个离散随机变量组成的贝叶斯网络(有向网络)。每个变量最多可以使用10个值之一。

我是否将所有节点都存储在DAG中,并且为每个节点存储其条件概率表(CPT)?当某些CPT更改时(除DAG使用的那些CPT以外),我还应使用其他数据结构来确保有效地计算值吗?


我正在内存sqlite数据库中用于存储CP表,因为期望DB具有处理表的高效算法和数据结构。工作正常!:)
Pratik Deoghare 2012年

请定义高效(内存,性能等)的含义,并包括您的约束。没有这些,这很容易导致有效的竞赛,而这些竞赛将退化为我从来不想在日常工作中处理的神秘代码。
贾斯汀·博佐尼尔

1
@JustinBozonier需要更少的内存并且速度很快?
Pratik Deoghare 2012年

Answers:


12

“最佳”数据结构可能取决于您要解决的特定问题。这是我见过(并用过的自己)的一种方法,该方法只是存储所有信息并将其交给算法处理。

  1. 首先,您使用从0到n-1的唯一整数索引节点。然后,您只需为每个节点将其父级列表存储为整数数组-例如在C ++中,您可以在std::vector<std::vector<int> >第一个矢量上遍历节点,第二个矢量列出各个父级。这捕获了整个DAG结构。

  2. 此外,由于每个节点都只有一个与之关联的条件概率表,因此您可以为那些具有相同整数ID的索引。对于每个概率表,您需要存储其范围,即定义其的随机变量集。其次,您可能会有一个很大的浮点数列表,其中包含实际的条件概率(并且您需要确保正确建立索引)。再给出一个C ++示例,可以这样做:

    struct CondProbTable {
        std::vector<int> scope;    // list of random variables the CPT is defined over
        std::vector<double> table; // appropriately sized and indexed table of
                                   // conditional probabilities
    };
    

    这样,您可以使用A std::vector<CondProbTable>存储所有CPT。

同样,这基本上只存储贝叶斯网络,它不假设您要使用它做什么。在CondProbTable中包括CPT范围有点多余,因为可以从第1点所述的父节点列表中推断出它。


0

基本上,离散的CPT是超矩阵,您应该以这种方式查看它们。

表示超矩阵的一种很常见的方法是使用带有字符串索引的哈希表。例如,在2维中,t [1] [2]将是t.get(“ 1_2”)

可能会有更高效的内存解决方案:如果超矩阵是稀疏的,则可以使用特殊的稀疏表示(例如Fuchs 72),如果它具有结构,则可以使用ADD(代数决策图)或基于逻辑的规则。

您的最后一个问题不是很清楚,但是,如果您希望CPT经常更改,那么最好使用表或哈希表来统一表示CPT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.