Cup*_*tor 8 python bayesian-networks belief-propagation
我正在尝试实施贝叶斯网络.
我的主图是我想用于信念传播的因子图.但是,在计算消息时的置信传播中,并非所有参数都传递给函数,最终函数将是联合分布的限制.
我想到的最好的方法是以某种方式限制函数,以便每当我想为新值计算边际值时不进行所有替换.
我问过如何在这里实现这样的功能.
我想知道是否有更好的方法来做这样的事情,或者是否有比我想做的更简单快捷的方法.
小智 3
这里有一个建议:创建一个闭包,它接受一个包含初始变量及其各自值的映射作为第一次计算的键值对。相同的闭包返回一个内部函数,该函数接受另一个映射以及最终计算的剩余变量和值。
因此,定义一个闭包,其中第一个部分计算在外部函数中完成。根据您的链接,部分计算是一个总和,但我想您将计算概率的乘积。内部函数可以将部分和作为自由变量访问。当您使用包含剩余变量值对的映射调用它时,计算就完成了。
您还可以在外部函数中定义一个集合来保存第一次计算中使用的所有变量。然后允许内部函数也将这个集合作为自由变量访问。这将确保在第一次计算中遇到的任何变量键的值都被排除在最终计算中。
所有这些都如下图所示。
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2643 次 |
最近记录: |