信念传播实现

2024-10-01 17:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现贝叶斯网络。在

我的主图是一个因子图,我想用它来传播信念。但是,在信度传播中计算消息时,并不是所有的参数都传递给函数,最终的函数将受到联合分布的限制。在

我想到的最好的方法是,在我想计算一个新值的边际值时,不必每次都做所有的替换。在

我问如何实现这样一个函数here。在

我想知道是否有更好的方法来做这件事,或者是否有比我想做的更简单、更快的方法。


Tags: 方法函数网络消息参数here因子信念
1条回答
网友
1楼 · 发布于 2024-10-01 17:29:17

这里有一个建议:创建一个闭包,它接受包含初始变量及其各自值的映射作为第一次计算的键值对。同一个闭包返回一个内部函数,该函数接受另一个带有剩余变量和值的映射,以便进行最终计算。在

所以定义一个闭包,其中第一个部分计算是在外部函数中完成的。根据你的链接,部分计算是一个和,但我想你将计算概率的乘积。内部函数可以将部分和作为自由变量访问。当使用包含剩余变量值对的映射调用计算时,计算即完成。在

您也可以在外部函数中定义一个集合,以保存第一次计算中使用的所有变量。然后允许内部函数也作为自由变量访问这个集合。这将确保在最终计算中排除第一次计算中遇到的任何变量键的值。在

所有这些都在下面进行了说明。在

def f1(map1):

    # set to contain seen variables as keys
    seen_keys = set()

    computed_val1 = 0.0

    for key in map1.keys():
        val = map1[key]
        computed_val1 += val

        # remember keys already in 1st computed
        seen_keys.add(key)

    def f2(map2):
        computed_val2 = computed_val1

        for key2 in map2.keys():
            # omit keys in first computation
            if key2 in seen_keys:
                continue

            val2 = map2[key2]
            computed_val2 += val2

        return computed_val2

    return f2

if __name__ == '__main__':

    partial_map = {'factor1': 1, 'factor2': 2}
    func = f1(partial_map)

    remaining_map1 = {'factor3': 3}
    answer1A = func(remaining_map1)
    print "Answer after using partial and remaining maps = ", answer1A

    # complete the partial map with factor3 to show that
    # the return function will ignore variables already seen in 1st computaion
    partial_map['factor3'] = 3
    answer1B = func(partial_map)
    print "Answer with completed map to same func = ", answer1B

    # Compute remaining map with different value for factor 3
    remaining_map2 = {'factor3': 15}
    answer2 = func(remaining_map2)
    print "Answer with different second map = ", answer2

相关问题 更多 >

    热门问题