贝叶斯网络算法的假人?

对于贝叶斯网络的算法,是否有一个简单明了的解释,而没有给出所有夸张的术语?我不允许使用库,所以请不要只给我一个库并告诉我使用它有多么容易。

所以我知道我们有条件概率表(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,字典等)向我解释如何实现贝叶斯网络?

suzhuang 回答:贝叶斯网络算法的假人?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3116772.html

大家都在问