Added a random query generation
This commit is contained in:
parent
14c651dfa7
commit
b6d03c3a7f
28
main.py
28
main.py
@ -27,8 +27,11 @@ def main():
|
|||||||
#Generate random evidence
|
#Generate random evidence
|
||||||
E = gen_ev(bayes_net)
|
E = gen_ev(bayes_net)
|
||||||
|
|
||||||
|
#Generate a random query that is not an evidence variable in the form of {var : val}
|
||||||
|
X = gen_query(E, bayes_net)
|
||||||
|
|
||||||
#Get W from LW
|
#Get W from LW
|
||||||
W = likelihood_weighting(1, E, bayes_net, 10)
|
W = likelihood_weighting(X, E, bayes_net, 10)
|
||||||
|
|
||||||
#Print if desired
|
#Print if desired
|
||||||
print()
|
print()
|
||||||
@ -41,6 +44,7 @@ def main():
|
|||||||
def gen_json(type, num_nodes):
|
def gen_json(type, num_nodes):
|
||||||
os.chdir("./gen_bn")
|
os.chdir("./gen_bn")
|
||||||
os.system('python gen_bn.py' + ' ' + type + ' ' + str(num_nodes))
|
os.system('python gen_bn.py' + ' ' + type + ' ' + str(num_nodes))
|
||||||
|
os.chdir("..")
|
||||||
|
|
||||||
#Import the BN from the json
|
#Import the BN from the json
|
||||||
def import_bayes():
|
def import_bayes():
|
||||||
@ -53,11 +57,11 @@ def import_bayes():
|
|||||||
def gen_ev(bayes_net):
|
def gen_ev(bayes_net):
|
||||||
total_nodes = len(bayes_net)
|
total_nodes = len(bayes_net)
|
||||||
#Arbitrarily, let's only generate total_nodes/2 (rounded up) evidence variables at most, but at least 1
|
#Arbitrarily, let's only generate total_nodes/2 (rounded up) evidence variables at most, but at least 1
|
||||||
num_ev = random.randint(1, int(math.ceil(total_nodes/2)))
|
num_ev = random.randint(0, int(math.ceil(total_nodes/2)))
|
||||||
fixed_ev = []
|
fixed_ev = []
|
||||||
#Go through and generate nodes that will be fixed
|
#Go through and generate nodes that will be fixed
|
||||||
for i in range(num_ev):
|
for i in range(num_ev):
|
||||||
fixed_var = random.randint(0, total_nodes-1)
|
fixed_var = random.randint(1, total_nodes-1)
|
||||||
if fixed_var not in fixed_ev:
|
if fixed_var not in fixed_ev:
|
||||||
fixed_ev.append(fixed_var)
|
fixed_ev.append(fixed_var)
|
||||||
#Now generate random values for the ev
|
#Now generate random values for the ev
|
||||||
@ -69,9 +73,23 @@ def gen_ev(bayes_net):
|
|||||||
E[str(i)] = True
|
E[str(i)] = True
|
||||||
else:
|
else:
|
||||||
E[str(i)] = False
|
E[str(i)] = False
|
||||||
|
|
||||||
return E
|
return E
|
||||||
|
|
||||||
|
#Given the evidence variables and the bayes net, generate a random variable to query and its value
|
||||||
|
def gen_query(ev, bayes_net):
|
||||||
|
possible_vars = list(range(len(bayes_net)))
|
||||||
|
ev_vars = [*ev]
|
||||||
|
for e in ev_vars:
|
||||||
|
if int(e) in possible_vars:
|
||||||
|
possible_vars.remove(int(e))
|
||||||
|
query = random.choice(possible_vars)
|
||||||
|
rand_prob = random.random()
|
||||||
|
if rand_prob >= 0.5:
|
||||||
|
val = True
|
||||||
|
else:
|
||||||
|
val = False
|
||||||
|
|
||||||
|
return {query : val}
|
||||||
|
|
||||||
#Checks if node has parents
|
#Checks if node has parents
|
||||||
def is_root(node, BN):
|
def is_root(node, BN):
|
||||||
@ -99,8 +117,6 @@ def get_parents(node, BN):
|
|||||||
#Compute the estimate of P(X|e), where X is the query variable, and e is the observed value for variables E
|
#Compute the estimate of P(X|e), where X is the query variable, and e is the observed value for variables E
|
||||||
def likelihood_weighting(X, e, bayes_net, num_samples):
|
def likelihood_weighting(X, e, bayes_net, num_samples):
|
||||||
W = {}
|
W = {}
|
||||||
T = 0
|
|
||||||
F = 0
|
|
||||||
|
|
||||||
for i in range(num_samples):
|
for i in range(num_samples):
|
||||||
w = 1
|
w = 1
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user