<aside> <img src="/icons/condense_yellow.svg" alt="/icons/condense_yellow.svg" width="40px" /> Python | 结构化概率 | 模型 | 贝叶斯 | 散度 | 问题决策 | 影响图 | 量子运算 | 噪声 | 概率图 | 汽车油耗 | 活塞 | 原木纱 | 强度 | 电阻 | 覆盖率 | 统计
</aside>
📜贝叶斯网络计算库尔贝克-莱布勒散度(概率分布标准误差度量) | 📜问题决策影响图模型 | 📜量子运算和噪声模型 | 📜概率图神经 | 📜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)