贝叶斯网络算法的假人?

时间:2019-11-12 14:17:19

标签: python artificial-intelligence bayesian-networks introduction

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

所以我知道我们有条件概率表(CPT),应该将它们相乘并执行变量消除,但是如何在代码中实现呢?因此,我尝试将每个CPT表示为词典列表:

{
            {
                "Cavity": "True",
                "own_value": "True",
                "probability": 0.9
            },
            {
                "Cavity": "True",
                "own_value": "False",
                "probability": 0.1
            },
            {
                "Cavity": "False",
                "own_value": "True",
                "probability": 0.4
            },
            {
                "Cavity": "False",
                "own_value": "False",
                "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,字典等)向我解释如何实现贝叶斯网络?

0 个答案:

没有答案