<aside> <img src="/icons/condense_yellow.svg" alt="/icons/condense_yellow.svg" width="40px" /> Python | 结构化概率 | 模型 | 贝叶斯 | 散度 | 问题决策 | 影响图 | 量子运算 | 噪声 | 概率图 | 汽车油耗 | 活塞 | 原木纱 | 强度 | 电阻 | 覆盖率 | 统计

</aside>

📜结构化概率模型-用例

📜贝叶斯网络计算库尔贝克-莱布勒散度(概率分布标准误差度量) | 📜问题决策影响图模型 | 📜量子运算和噪声模型 | 📜概率图神经 | 📜Python汽车油耗活塞循环原木纱强度及电阻覆盖率现实统计模型计算

✒️Python贝叶斯网络

下面给出了贝叶斯网络的条件概率表。 A 和 C 是基节点,因此对于它们我们有绝对概率。节点 B、D、E、G、H、I 具有单亲,因此第一列表示父节点采用的值,第二列表示节点本身采用的值,最后一列是该情况发生的概率。节点 F 有两个父节点 B 和 D。因此,第一列代表 B 所取的值,第二列代表 D 所取的值,第三列代表 F 本身所取的值,最后一列代表该情况的概率正在发生。


flowchart TB
 A((A/0.1))-->B((B/0.4/0.9))
 C((C/0.5))-->D((D/0.3/0.6))
 B & D-->F((F/0.7/0.4/0.2/0))-->G((G/0.9/0.1))
 B-->E((E/0.1/0.2))-->H((H/0.5/0.7)) & I((I/0.8/0.7))

💦构建模型

 
 a = Disbution({'1': 1./10, '0': 9./10})
 
 
 c = Disbution({'1': 1./2, '0': 1./2})
 
 b = ConditionalProbabilityTable(
         [[ '0', '0', 0.1 ],
          [ '0', '1', 0.9 ],
          [ '1', '0', 0.6 ],
          [ '1', '1', 0.4 ]],[a])
 
 d = ConditionalProbabilityTable(
         [[ '0', '0', 0.4 ],
          [ '0', '1', 0.6 ],
          [ '1', '0', 0.7 ],
          [ '1', '1', 0.3 ]],[c])
 
 e = ConditionalProbabilityTable(
         [[ '0', '0', 0.8 ],
          [ '0', '1', 0.2 ],
          [ '1', '0', 0.9 ],
          [ '1', '1', 0.1 ]],[b])
 
 h = ConditionalProbabilityTable(
         [[ '0', '0', 0.3 ],
          [ '0', '1', 0.7 ],
          [ '1', '0', 0.5 ],
          [ '1', '1', 0.5 ]],[e])
 
 i = ConditionalProbabilityTable(
         [[ '0', '0', 0.3 ],
          [ '0', '1', 0.7 ],
          [ '1', '0', 0.2 ],
          [ '1', '1', 0.8 ]],[e])
 
 f = ConditionalProbabilityTable(
         [[ '0', '0', '1', 0.0 ],
          [ '0', '1', '1', 0.2 ],
          [ '1', '0', '1', 0.4 ],
          [ '1', '1', '1', 0.7 ],
          [ '0', '0', '0', 1.0 ],
          [ '0', '1', '0', 0.8 ],
          [ '1', '0', '0', 0.6 ],
          [ '1', '1', '0', 0.3 ]],[b,d])
 
 g = ConditionalProbabilityTable(
         [[ '0', '0', 0.9 ],
          [ '0', '1', 0.1 ],
          [ '1', '0', 0.1 ],
          [ '1', '1', 0.9 ]],[f])

将这些分布与节点名称一起传递到状态对象中。

 A = State(a, name="A")
 B = State(b, name="B")
 C = State(c, name="C")
 D = State(d, name="D")
 E = State(e, name="E")
 F = State(f, name="F")
 G = State(g, name="G")
 H = State(h, name="H")
 I = State(i, name="I")

将状态添加到网络

 model = BayesianNetwork("DS251_A2_Q5-2")
 model.add_states(A, B, C, D, E, F, G, H, I)

然后我们需要向模型添加边缘。边代表哪些状态是哪些其他状态的父状态。

 model.add_edge(A, B)
 model.add_edge(B, E)
 model.add_edge(B, F)
 model.add_edge(C, D)
 model.add_edge(D, F)
 model.add_edge(E, H)
 model.add_edge(E, I)
 model.add_edge(F, G)

最后,必须烘烤模型以完成内部结构。

 model.bake()

💦计算概率

为了计算条件概率,提供已知节点的值,它将预测所有其他节点的概率。例如,考虑 P(I|C) 的计算。 在此我们知道 C 的值为 1。因此我们将其提供给我们的函数。 基于此,它将返回一个数组,其中包含所有节点的所有不同值的概率。 在我们的例子中,我们只关心我取值 1 的概率,考虑到从 0 开始索引,该值的索引为 8。因此,我们选择数组的第 8 个索引和参数为 1,以获得特定的概率,结果为 0.7115。

同样,也可以求出其他情况的概率。所有值均与使用笔和纸计算的值相符。

 #a P(I|C)
 round(model.predict_proba([{'C': '1'}])[0][8].parameters[0]['1'],4)