Quickstart

Here is a quickstart example. There are basically 4 steps you will need to make.

  1. Learn the structure.

  2. Learn the parameters.

  3. Convert the structure and parameters into a Bayesian Belief Network (BBN).

  4. Convert the BBN into a Join Tree (JT) for exact inference.

 1from lassobbn.learn import learn_parameters, learn_structure, to_bbn, to_join_tree, posteriors_to_df
 2
 3# Step 1. Learn the structure
 4df_path = './data/data-binary.csv'
 5meta_path = './data/data-binary-complete.json'
 6
 7parents = learn_structure(df_path, meta_path, n_way=2, ignore_neg_gt=-0.01, ignore_pos_lt=0.05)
 8print('parents')
 9print(parents)
10print('-' * 15)
11# {'e': ['d!b'], 'd': ['b!a']}
12
13# Step 2. Learn the parameters
14d, g, p = learn_parameters(df_path, parents)
15print('domains')
16print(d)
17print('-' * 15)
18# {'d!b': ['0', '1'], 'e': ['0', '1'], 'd': ['0', '1'], 'b': ['0', '1'], 'b!a': ['0', '1'], 'a': ['0', '1']}
19
20print('structure')
21for pa, ch in g.edges():
22    print(f'{pa} -> {ch}')
23print('-' * 15)
24# d!b -> e
25# d -> d!b
26# b -> d!b
27# b -> b!a
28# b!a -> d
29# a -> b!a
30
31print('parameters')
32for k, arr in p.items():
33    probs = [f'{v:.2f}' for v in arr]
34    probs = ', '.join(probs)
35    print(f'{k}: [{probs}]')
36print('-' * 15)
37# d!b: [1.00, 0.00, 1.00, 0.00, 1.00, 0.00, 0.00, 1.00]
38# e: [0.77, 0.23, 0.08, 0.92]
39# d: [0.79, 0.21, 0.80, 0.20]
40# b: [0.80, 0.20]
41# b!a: [1.00, 0.00, 1.00, 0.00, 1.00, 0.00, 0.00, 1.00]
42# a: [0.19, 0.81]
43
44# Step 3. Get the BBN
45bbn = to_bbn(d, g, p)
46
47# Step 4. Get the Join Tree
48jt = to_join_tree(bbn)
49
50print('bbn')
51print(bbn)
52print('-' * 15)
53# 0|d!b|0,1
54# 1|e|0,1
55# 2|d|0,1
56# 3|b|0,1
57# 4|b!a|0,1
58# 5|a|0,1
59# 0->1
60# 2->0
61# 3->0
62# 3->4
63# 4->2
64# 5->4
65
66print('join tree')
67print(jt)
68print('-' * 15)
69# (d!b,e)
70# (b,d,d!b)
71# (b,b!a,d)
72# (a,b,b!a)
73# |(b,d,d!b) -- d,b -- (b,b!a,d)|
74# |(b,b!a,d) -- b,b!a -- (a,b,b!a)|
75# |(d!b,e) -- d!b -- (b,d,d!b)|
76# (b,d,d!b)--|(b,d,d!b) -- d,b -- (b,b!a,d)|--(b,b!a,d)
77# (b,b!a,d)--|(b,b!a,d) -- b,b!a -- (a,b,b!a)|--(a,b,b!a)
78# (d!b,e)--|(d!b,e) -- d!b -- (b,d,d!b)|--(b,d,d!b)
79
80# Get posteriors
81print('posteriors')
82mdf = posteriors_to_df(jt)
83print(mdf)
84
85# should print
86#              0         1
87# name
88# d!b   0.960997  0.039003
89# e     0.740779  0.259221
90# d     0.795200  0.204800
91# b     0.802900  0.197100
92# b!a   0.840211  0.159789
93# a     0.189300  0.810700