2013-06-18 64 views
8

我正在嘗試實施貝葉斯網絡。信念傳播實施

我的主圖是我想用於信念傳播的因子圖。但是,在計算消息時的信念傳播中,並非所有參數都傳遞給函數,最終函數將成爲聯合分佈的限制。

我想到的最好方法是以某種方式限制函數,以便在每次計算新值的邊際值時不要執行所有替換。

我問如何實現這樣的功能here

我想知道是否有更好的方法來做這樣的事情,或者是否有比我想要做的更簡單快捷的方法。

回答

2

這裏有一個建議:創建一個閉包,它接受包含初始變量及其各自值的映射作爲第一次計算的鍵值對。同一個閉包返回一個內部函數,該函數接受另一個映射,其餘的變量和值用於最終計算。

因此定義一個閉包,其中第一部分計算是在外部函數中完成的。根據你的鏈接,部分計算是一個總和,但我想你會計算概率的產品。內部函數可以作爲一個自由變量訪問部分和。當您使用包含其餘變量 - 值對的映射調用它時,計算就完成了。

您還可以在外部函數中定義一個集合來保存第一次計算中使用的所有變量。然後允許內部函數以自由變量的形式訪問這個集合。這將確保在最終計算中排除第一次計算中遇到的任何可變關鍵字的值。

所有這些如下所示。

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