f1 = FactorNode(cpd=f1_cpd, graph=fg, name='f1', ordered_variables=(a, b)) f2 = FactorNode(cpd=f2_cpd, graph=fg, name='f2', ordered_variables=(a, c)) f3 = FactorNode(cpd=f3_cpd, graph=fg, name='f3', ordered_variables=(b, c)) fg.add_var_nodes([a, b, c]) fg.add_factor_nodes([f1, f2, f3]) fg.add_edge(a, f1) fg.add_edge(f1, b) fg.add_edge(b, f3) fg.add_edge(f3, c) fg.add_edge(a, f2) fg.add_edge(f2, c) pos = {a: (-3, 0), b: (0, 3), c: (3, 0), f1: (-1.5, 1.5), f2: (0, 0), f3: (1.5, 1.5)} fg.save_graph_fig(num=1, pos=pos) # fg.sum_product(node=b) fg.loopy_sum_product(iterations=20, epsilon=1e-5, plot_errors=True) beliefs = fg.get_beliefs() for k in beliefs: print(f"marginal prob. of node {k}:{beliefs[k]}") print() fg.loopy_max_sum(iterations=20, epsilon=1e-5, plot_errors=True) map_beliefs = fg.get_beliefs() for k in map_beliefs: print(f"conf. of node {k} for max joint prob.:{np.argmax(map_beliefs[k])}") print(fg.get_beliefs())
x2: (0, 7.5), fb: (4, 7.5), x3: (7.5, 7.5), fc: (0, 3), x4: (0, 0) } fg.save_graph_fig(num=1, pos=pos, fig_name='tree-1') fg.sum_product(x3) # fg.max_product(x3) # fg.max_sum(x3) # fg.loopy_sum_product(iterations=5, plot_errors=True) # fg.loopy_max_product(iterations=5) # fg.loopy_max_sum(iterations=5) beliefs = fg.get_beliefs() for k in beliefs: print(f"marginal prob. of node {k}:{beliefs[k]}") fg.max_sum(x3) map_beliefs = fg.get_beliefs() for k in map_beliefs: print(f"conf. of node {k} for max joint prob.:{np.argmax(map_beliefs[k])}") fg.loopy_sum_product(iterations=20, epsilon=1e-5, plot_errors=True) lbp_beliefs = fg.get_beliefs() error = [ np.linalg.norm(b - lb) for b, lb in zip(beliefs.values(), lbp_beliefs.values()) ] error = sum(error) / len(error)