只是为了用一个具体的例子来阐明上述答案,以便对某人有所帮助,让我们从以下简单的数据集开始(包含 4 个变量和 5 个数据点):
import pandas as pd
df = pd.DataFrame({'A':[0,0,0,1,0], 'B':[0,0,1,0,0], 'C':[1,1,0,0,1], 'D':[0,1,0,1,1]})
df.head()
# A B C D
#0 0 0 1 0
#1 0 0 1 1
#2 0 1 0 0
#3 1 0 0 1
#4 0 0 1 1
现在我们用'exact'算法和pomegranate从以上数据中学习贝叶斯网络结构(使用DP/A*学习最优BN结构),使用如下代码sn-p
import numpy as np
from pomegranate import *
model = BayesianNetwork.from_samples(df.to_numpy(), state_names=df.columns.values, algorithm='exact')
# model.plot()
学习的 BN 结构和对应的 CPT 如下图所示
从上图可以看出,准确的解释了数据。我们可以使用模型计算数据的对数似然如下:
np.sum(model.log_probability(df.to_numpy()))
# -7.253364813857112
一旦学习了BN结构,我们就可以从BN中采样如下:
model.sample()
# array([[0, 1, 0, 0]], dtype=int64)
作为旁注,如果我们使用algorithm='chow-liu' 代替(它找到一个快速近似的树状结构),我们将获得以下BN:
这次数据的对数似然是
np.sum(model.log_probability(df.to_numpy()))
# -8.386987635761297
这表明算法exact找到了更好的估计。