我了解贝叶斯网络背后的理论,并且想知道在实践中建立贝叶斯网络需要做什么。假设在这个例子中,我有一个由100个离散随机变量组成的贝叶斯网络(有向网络)。每个变量最多可以使用10个值之一。
我是否将所有节点都存储在DAG中,并且为每个节点存储其条件概率表(CPT)?当某些CPT更改时(除DAG使用的那些CPT以外),我还应使用其他数据结构来确保有效地计算值吗?
我了解贝叶斯网络背后的理论,并且想知道在实践中建立贝叶斯网络需要做什么。假设在这个例子中,我有一个由100个离散随机变量组成的贝叶斯网络(有向网络)。每个变量最多可以使用10个值之一。
我是否将所有节点都存储在DAG中,并且为每个节点存储其条件概率表(CPT)?当某些CPT更改时(除DAG使用的那些CPT以外),我还应使用其他数据结构来确保有效地计算值吗?
Answers:
“最佳”数据结构可能取决于您要解决的特定问题。这是我见过(并用过的自己)的一种方法,该方法只是存储所有信息并将其交给算法处理。
首先,您使用从0到n-1的唯一整数索引节点。然后,您只需为每个节点将其父级列表存储为整数数组-例如在C ++中,您可以在std::vector<std::vector<int> >
第一个矢量上遍历节点,第二个矢量列出各个父级。这捕获了整个DAG结构。
此外,由于每个节点都只有一个与之关联的条件概率表,因此您可以为那些具有相同整数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点所述的父节点列表中推断出它。