对于贝叶斯网络的算法,是否有一个简单明了的解释,而没有给出所有夸张的术语?我不允许使用库,所以请不要只给我一个库并告诉我使用它有多么容易。
所以我知道我们有条件概率表(CPT),应该将它们相乘并执行变量消除,但是如何在代码中实现呢?因此,我尝试将每个CPT表示为词典列表:
{
{
"Cavity": "True","own_value": "True","probability": 0.9
},{
"Cavity": "True","own_value": "False","probability": 0.1
},{
"Cavity": "False","probability": 0.4
},"probability": 0.6
}
}
然后将这些CPT插入另一个字典中。
但是,我无法继续讨论如何将这些CPT乘以以及如何保留它们? 例如。 P(A | B,C,D)* P(D | E,F)= P(A,D | B,C,E,F)
2个CPT的乘积会导致一个具有多个正面的因素,因此字典不再有效...
基本上,以下代码段是到目前为止我可以想到的算法,其中存储节点队列并将其传递给此函数,直到找到所有节点的所有已知概率。当然,队列已经按照拓扑顺序排列,因此始终可以保证父母是已知概率。
但是正如您现在已经意识到的那样,该算法只能回答P(A = true)或P(C = false),等等
cpt = self.conditional_probabilities[nodename] #get my cpt
for parent in self.dependencies[nodename]:
parentProb = self.knownProbabilities[parent]
#matching of the parent and multiplying the probability
for probability in parentProb:
varName = probability
varProb = parentProb[probability]
for item in cpt:
if parent in item and (item[parent] == varName):
item["probability"] = item["probability"] * varProb
#eliminate the parent node
#some code here
#insert known probability into my known probabilities table
#e.g. insert P(A) into a dict() of P(B),P(C),... where A,B,C are keys
nodeProbability = dict()
for item in cpt:
state = item["own_value"]
nodeProbability[state] = item["probability"]
self.knownProbabilities[nodename] = nodeProbability
这无法执行像P(A = true,B = false | C = false,D =“ donkey”,E =“ cat”)这样的贝叶斯网络查询。
D,E的域为[“ donkey”,“ cat”,“ dog”,“ mouse”],其余为布尔值。
TL; DR谁能使用简单的数据结构(列表,pq,字典等)向我解释如何实现贝叶斯网络?