📜结构化概率模型-用例
📜贝叶斯网络计算库尔贝克-莱布勒散度(概率分布标准误差度量) | 📜问题决策影响图模型 | 📜量子运算和噪声模型 | 📜概率图神经 | 📜Python汽车油耗活塞循环原木纱强度及电阻覆盖率现实统计模型计算。
✒️Python贝叶斯网络
下面给出了贝叶斯网络的条件概率表。 A 和 C 是基节点,因此对于它们我们有绝对概率。节点 B、D、E、G、H、I 具有单亲,因此第一列表示父节点采用的值,第二列表示节点本身采用的值,最后一列是该情况发生的概率。节点 F 有两个父节点 B 和 D。因此,第一列代表 B 所取的值,第二列代表 D 所取的值,第三列代表 F 本身所取的值,最后一列代表该情况的概率正在发生。
💦构建模型
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])
将这些分布与节点名称一起传递到状态对象中。
# State objects hold both the distribution, and a high level name.
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)
#b P (E|~D)
round(model.predict_proba([{'D': '0'}])[0][4].parameters[0]['1'],4)
#c P(G|B,~D)
round(model.predict_proba([{'B': '1', 'D': '0'}])[0][6].parameters[0]['1'],4)