2013-06-18 4 views
8

Ich versuche, Bayes'sche Netzwerke zu implementieren.Glauben Propagation Implementation

Mein Hauptdiagramm ist ein Faktorgraph, den ich für die Glaubensfortpflanzung verwenden möchte. Aber bei der Glaubensweitergabe bei der Berechnung von Nachrichten werden nicht alle Argumente an die Funktion übergeben, und die letzte Funktion wird eine Beschränkung der gemeinsamen Verteilung sein.

Der beste Weg, der mir in den Sinn kommt, ist, die Funktionen irgendwie einzuschränken, um nicht jedes Mal den ganzen Austausch zu machen, wenn ich ein Randelement für einen neuen Wert berechnen möchte.

Ich fragte, wie man eine solche Funktion here implementieren.

Ich möchte wissen, ob es eine bessere Möglichkeit gibt, so etwas zu tun, oder gibt es einfachere und schnellere Ansätze als die, die ich machen möchte.

Antwort

2

Hier ist ein Vorschlag: Erstellen Sie eine Schließung, die eine Karte akzeptiert, die die Anfangsvariablen und ihre jeweiligen Werte als Schlüssel/Wert-Paare für die erste Berechnung enthält. Die gleiche Schließung gibt eine innere Funktion zurück, die eine andere Karte mit den verbleibenden Variablen und Werten für die endgültige Berechnung akzeptiert.

Definieren Sie also einen Abschluss, bei dem die erste Teilberechnung in der äußeren Funktion erfolgt. Basierend auf Ihrer Verbindung ist die partielle Berechnung eine Summe, aber ich stelle mir vor, dass Sie Produkte von Wahrscheinlichkeiten berechnen werden. Die innere Funktion hat Zugriff auf die Partialsumme als freie Variable. Die Berechnung ist abgeschlossen, wenn Sie sie mit einer Zuordnung aufrufen, die die verbleibenden Variablenwertpaare enthält.

Sie können auch in der äußeren Funktion einen Satz definieren, der alle Variablen enthält, die bei der ersten Berechnung verwendet werden. Dann erlaube der inneren Funktion, auch auf diese Menge als freie Variable zuzugreifen. Dies stellt sicher, dass die Werte aller variablen Schlüssel, die bei der ersten Berechnung angetroffen werden, bei der endgültigen Berechnung ausgeschlossen werden.

All dies wird unten veranschaulicht.

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