2013-06-18 29 views
8

Tôi đang cố gắng triển khai Mạng Bayesian.Tin tưởng Tuyên truyền Thực hiện

Biểu đồ chính của tôi là biểu đồ yếu tố mà tôi muốn sử dụng để truyền bá niềm tin. Tuy nhiên, trong truyền bá niềm tin khi tính toán các thông điệp, không phải tất cả các đối số được truyền cho hàm và hàm cuối cùng sẽ là một hạn chế của sự phân phối chung.

Cách tốt nhất mà đến với tâm trí của tôi là bằng cách nào đó hạn chế các chức năng để không thực hiện tất cả thay thế mỗi khi tôi muốn tính toán biên cho một giá trị mới.

Tôi đã hỏi cách triển khai chức năng như vậy here.

Tôi muốn biết nếu có cách nào tốt hơn để làm một điều như vậy hoặc có cách tiếp cận đơn giản và nhanh hơn so với cách tôi muốn làm.

Trả lời

2

Đây là một gợi ý: tạo một đóng cửa chấp nhận một bản đồ có chứa các biến ban đầu và giá trị tương ứng của chúng như cặp khóa-giá trị cho phép tính đầu tiên. Cùng một kết thúc trả về một hàm bên trong chấp nhận một bản đồ khác với các biến còn lại và các giá trị cho phép tính cuối cùng.

Vì vậy, xác định một đóng cửa trong đó tính toán một phần đầu tiên được thực hiện trong hàm bên ngoài. Dựa trên liên kết của bạn, tính toán từng phần là tổng nhưng tôi tưởng tượng bạn sẽ tính toán các sản phẩm của xác suất. Hàm bên trong có quyền truy cập vào tổng một phần dưới dạng biến miễn phí. Tính toán được hoàn thành khi bạn gọi nó với một bản đồ chứa các cặp biến-giá trị còn lại.

Bạn cũng có thể xác định trong hàm bên ngoài một tập hợp để giữ tất cả các biến được sử dụng trong lần tính toán đầu tiên. Sau đó cho phép chức năng bên trong truy cập bộ này dưới dạng biến miễn phí. Điều này sẽ đảm bảo rằng các giá trị của bất kỳ khóa biến nào gặp phải trong lần tính toán đầu tiên được loại trừ trong tính toán cuối cùng.

Tất cả điều này được minh họa bên dưới.

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 
Các vấn đề liên quan