def ve(Phi, q, E, Z, m): for z in Z: Phi = eliminate(Phi, z, E, m) q.value = True S = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi]) q.value = False T = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi]) w_X[q.name] = S/(S + T) return S + T
def weighted_sample(model, evidence, tobn): w = 1 for node in tobn: if node in evidence: w = w * bn.likelihood(model[node]) else: model[node].random() return w
def draw_sample(): global m, tobn f = g = 0 for node in tobn: if not node.name in e: node.random() n = m[node.name] n.value = node.value f += math.log(bn.likelihood(node)) g += math.log(bn.likelihood(n)) f = math.exp(f) g = math.exp(g) g *= reduce(mul, [bn.likelihood(m[node]) for node in e]) if g == 0: return bn.as_sample(m), 0, 0 else: return bn.as_sample(m), g, f
def p(phi, query): global w_X result = 0 if phi: head = bndict[phi.pop(0)] if str(head) in e: m[head].value = e[str(head)] result = bayesnet.likelihood(m[head]) * p(list(phi), query) else: m[head].value = True tmp = bayesnet.likelihood(m[head]) * p(list(phi), query) m[head].value = False result = tmp + bayesnet.likelihood(m[head]) * p(list(phi), query) if m[head].name == query: w_X[m[head].name][0] = result - tmp w_X[m[head].name][1] = tmp return result else: return 1
def lam(z=z): z.value = True s = reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi_1]) z.value = False t = s + reduce(operator.mul, [bayesnet.likelihood(n) if not n.name.startswith('tau') else n.lam() for n in Phi_1]) return t
def init(X, evidence, model): t0 = time.time() # global types global N, Y, MB, O, iteration, M, tobn, nonev, mnonev, rnodes, roots, observables, E, M, enodes N = { str(x): [0, 0] for x in X } Y = { str(x): [] for x in X } enodes = [model[e] for e in evidence] M = model EC = [] #init important sets tobn = bn.topo_ordered(model) nonev = [node for node in tobn if node not in evidence] mnonev = [model[n] for n in nonev] rnodes = [model[x] for x in X] roots = [r for r in bn.roots(model)] MB = { str(x): [] for x in tobn if x not in evidence } # init net # the initial net might be improper as likelihood of evidence nodes can be 0 for e in evidence: model[e].value = evidence[e] for p in model[e].parents: if p in evidence: continue par = model[p] par.value = True if MB[p] == []: MB[p] = [model[c] for c in par.children] if p in nonev: nonev.remove(p) #if bn.likelihood(n) == 0: # print "still something wrong with initialization at node " + node for node in nonev: n = model[node] # P = [0]*2 # prod = 1 # if n.children and MB[node] == []: # MB[node] = [model[c] for c in n.children] # if n.children: # EC = [model[e] for e in n.children if e in evidence] # if EC == []: # n.random() # continue # else: # n.value = True # if bn.likelihood(n) == 0: # print n.name # n.value = False # continue # print "here" # P[0] = log(bn.likelihood(n)) # for e in EC: # if e.name == 'v': # print bn.likelihood(e) # if bn.likelihood(e) == 0: # n.value = False # break # P[0] += log(bn.likelihood(e)) # else: # n.value = False # if bn.likelihood(n) == 0: # n.value = True # continue # P[1] = log(bn.likelihood(n)) # for e in EC: # if bn.likelihood(e) == 0: # n.value = True # break # P[1] += log(bn.likelihood(e)) # else: # likelihood = exp(P[0]) / (exp(P[0]) + exp(P[1])) # if likelihood > random.random(): # n.value = True # else: # n.value = False # if random.random() > .5: # n.value = True # else: # n.value = False if n.children != [] and MB[node] == []: MB[node] = [model[c] for c in n.children] #n.random() n.value = True for node in tobn: n = model[node] if node not in evidence: flip_mb(n) else: if bn.likelihood(n) == 0: print "straaaaaange " + node print "time to init: " + str(time.time() - t0) return
def flip_mb(node): P = [0]*2 #if node.name == 'alc': # print bn.likelihood(node) #print node.name if node.children: # P( node | pa( node ) ) * \prod_{c \in ch( node )} P( c | pa( c ) ) node.value = True # check if this is impossible if bn.likelihood(node) == 0: #print "Set " + node.name + " = False: P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node)) node.value = False #print "---> P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node)) return 0 else: P[0] = log(bn.likelihood(node)) # ...also for all children for n in MB[node.name]: if bn.likelihood(n) == 0: #print "Set " + node.name + " = False: P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n)) node.value = False #print "---> P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n)) return 1 else: P[0] += log(bn.likelihood(n)) # for normalization node.value = False # check if this is impossible if bn.likelihood(node) == 0: #print "Set " + node.name + " = True: P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node)) node.value = True #print "---> P( "+ node.name + " = " + str(node.value) + " | " + str({ M[p].name: M[p].value for p in node.parents }) + " ) = " + str(bn.likelihood(node)) return 2 else: P[1] = log(bn.likelihood(node)) # ...also for all children for n in MB[node.name]: if bn.likelihood(n) == 0: #print "Set " + node.name + " = True: P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents}) + " ) = " + str(bn.likelihood(n)) node.value = True #print "---> P( "+ n.name + " = " + str(n.value) + " | " + str({ M[p].name: M[p].value for p in n.parents }) + " ) = " + str(bn.likelihood(n)) return 3 else: P[1] += log(bn.likelihood(n)) #print iteration #print "case 4, " + node.name + " " + str(exp(P[0]) + exp(P[1])) likelihood = exp(P[0]) / (exp(P[0]) + exp(P[1])) #print "P( "+ node.name + " | " + str({M[p].name: M[p].value for p in node.parents}) + str({c.name: c.value for c in MB[node.name]}) + " ) = " + str(likelihood) if likelihood > random.random(): node.value = True else: node.value = False return 4 else: node.random() return 5