else: kbins = np.linspace(0, kub, knum) knames = node_k.discretize(klb, kub, knum, infinity='+', bins=kbins) # calculate and assign CPT # node a0 a0cpt = node_a0.rv.cdf(node_a0.bins[1:]) - node_a0.rv.cdf(node_a0.bins[:-1]) a0cpt = a0cpt[np.newaxis, :] node_a0.assign_cpt(a0cpt, statenames=a0names) # node m mcpt = node_m.rv.cdf(node_m.bins[1:]) - node_m.rv.cdf(node_m.bins[:-1]) mcpt = mcpt[np.newaxis, :] node_m.assign_cpt(mcpt, statenames=mnames) # node k nstate = knum labels = itertools.product(np.arange(node_m.nstates())) labels = [label for label in labels] for i,label in enumerate(labels): truncrvs = [] for j, pstate in enumerate(label): truncrvs.append(node_k.parents[j].truncate_rv(pstate,lmd=trunclmd)) rvnames = ['M', 'C', 'Sre', 'Na'] rvs = truncrvs+[rv_C, rv_Sre, rv_Na] # rvnames = ['M', 'C', 'Sre', 'Na'] # rvs = [rv_m, rv_C, rv_Sre, rv_Na] probs = mc2k(rvnames, rvs, node_k.bins, G, nsmp) probs = probs/np.sum(probs,dtype=float) print 'labels: {}, progress: {}%, pmf: {}'.format(label, float(i)/len(labels)*100, np.array_str(probs,precision=3)) node_k.assign_cpt(probs,label=np.asarray(label),statenames=node_k.statenames) # node ai
kbins = np.linspace(0, kub, knum) knames = node_k.discretize(klb, kub, knum, infinity='+', bins=kbins) # calculate and assign CPT # node a0 a0cpt = node_a0.rv.cdf(node_a0.bins[1:]) - node_a0.rv.cdf( node_a0.bins[:-1]) a0cpt = a0cpt[np.newaxis, :] node_a0.assign_cpt(a0cpt, statenames=a0names) # node m mcpt = node_m.rv.cdf(node_m.bins[1:]) - node_m.rv.cdf(node_m.bins[:-1]) mcpt = mcpt[np.newaxis, :] node_m.assign_cpt(mcpt, statenames=mnames) # node k nstate = knum labels = itertools.product(np.arange(node_m.nstates())) labels = [label for label in labels] for i, label in enumerate(labels): truncrvs = [] for j, pstate in enumerate(label): truncrvs.append(node_k.parents[j].truncate_rv(pstate, lmd=trunclmd)) rvnames = ['M', 'C', 'Sre', 'Na'] rvs = truncrvs + [rv_C, rv_Sre, rv_Na] probs = mc2k(rvnames, rvs, node_k.bins, G, nsmp) probs = probs / np.sum(probs, dtype=float) print 'labels: {}, progress: {}%, pmf: {}'.format( label, float(i) / len(labels) * 100, np.array_str(probs, precision=3)) node_k.assign_cpt(probs, label=np.asarray(label),
r4bins = np.hstack((0, np.linspace(lb, ub, r4num-1))) r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50.; ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num-1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # calculate and assignCPT # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis,:] r5.assign_cpt(r5cpt, statenames=r5names) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates())) mvnorm = stats.multivariate_normal(mean=None,cov=np.array([[1.,rolnR],[rolnR,1.]])) for i,label in enumerate(labels): probs=[] plb = r5.bins[label[0]] #r5 lower bound pub = r5.bins[label[0]+1] #r5 upper bound z5lb = (np.log(plb)-logmean)/logstd z5ub = (np.log(pub)-logmean)/logstd for k in xrange(nstate): clb = r4.bins[k] #r4 lower bound cub = r4.bins[k+1] #r4 upper bound z4lb = (np.log(clb)-logmean)/logstd z4ub = (np.log(cub)-logmean)/logstd low = np.array([z5lb, z4lb]); low[np.isneginf(low)] = -20. upp = np.array([z5ub, z4ub]); upp[np.isposinf(upp)] = 20. prob,info = stats.mvn.mvnun(low, upp, np.zeros(2), np.array([[1.,rolnR],[rolnR,1.]]))
# calculate and assignCPT # e0 probs = np.array([[1., 0.]]) e0.assign_cpt(probs, statenames=['safe', 'fail']) # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis,:] r5.assign_cpt(r5cpt, statenames=r5names) # node Uh uhcpt = uh.rv.cdf(uh.bins[1:]) - uh.rv.cdf(uh.bins[:-1]) uhcpt = uhcpt[np.newaxis,:] uh.assign_cpt(uhcpt, statenames=uhnames) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates())) mvnorm = stats.multivariate_normal(mean=None,cov=np.array([[1.,rolnR],[rolnR,1.]])) for i,label in enumerate(labels): probs=[] plb = r5.bins[label[0]] #r5 lower bound pub = r5.bins[label[0]+1] #r5 upper bound z5lb = (np.log(plb)-logmean)/logstd z5ub = (np.log(pub)-logmean)/logstd for k in xrange(nstate): clb = r4.bins[k] #r4 lower bound cub = r4.bins[k+1] #r4 upper bound z4lb = (np.log(clb)-logmean)/logstd z4ub = (np.log(cub)-logmean)/logstd low = np.array([z5lb, z4lb]); low[np.isneginf(low)] = -20. upp = np.array([z5ub, z4ub]); upp[np.isposinf(upp)] = 20. prob,info = stats.mvn.mvnun(low, upp, np.zeros(2), np.array([[1.,rolnR],[rolnR,1.]]))
# decision making # type 1 dbnet.enter_finding(forecast, 0) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is sunny, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) dbnet.retract_netfindings() dbnet.enter_finding(forecast, 1) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is cloudy, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) dbnet.retract_netfindings() dbnet.enter_finding(forecast, 2) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is rainy, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) #type 2 dbnet.retract_netfindings() dummy = dbnet.get_node_expectedutils(umbrella) for fs in range(forecast.nstates()): decision = dbnet.get_node_funcstate(umbrella, [fs]) print 'If the forecast is {}, the best decision is {}.\n'.format( forecast.statenames[fs], umbrella.statenames[decision])
# calculate and assignCPT # e0 probs = np.array([[1., 0.]]) e0.assign_cpt(probs, statenames=['safe', 'fail']) # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis, :] r5.assign_cpt(r5cpt, statenames=r5names) # node Uh uhcpt = uh.rv.cdf(uh.bins[1:]) - uh.rv.cdf(uh.bins[:-1]) uhcpt = uhcpt[np.newaxis, :] uh.assign_cpt(uhcpt, statenames=uhnames) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates())) mvnorm = stats.multivariate_normal(mean=None, cov=np.array([[1., rolnR], [rolnR, 1.]])) for i, label in enumerate(labels): probs = [] plb = r5.bins[label[0]] #r5 lower bound pub = r5.bins[label[0] + 1] #r5 upper bound z5lb = (np.log(plb) - logmean) / logstd z5ub = (np.log(pub) - logmean) / logstd for k in xrange(nstate): clb = r4.bins[k] #r4 lower bound cub = r4.bins[k + 1] #r4 upper bound z4lb = (np.log(clb) - logmean) / logstd z4ub = (np.log(cub) - logmean) / logstd low = np.array([z5lb, z4lb])
x2num = 5 m = x1.rv.stats('m'); s = np.sqrt(x1.rv.stats('v')) #lb = np.maximum(0, m-2*s); ub = m+2*s lb = 0.; ub = m+1.5*s x1names = x1.discretize(lb, ub, x1num, infinity='+') x2names = x2.discretize(lb*10., ub*10., x2num, infinity='+') # calculate and assign CPT # node X1 x1cpt = x1.rv.cdf(x1.bins[1:]) - x1.rv.cdf(x1.bins[:-1]) x1cpt = x1cpt[np.newaxis,:] x1.assign_cpt(x1cpt, statenames=x1names) # node X2 lmd = 0.05 nstate = x2num labels = itertools.product(np.arange(x1.nstates())) for i, label in enumerate(labels): rvs = [] probs=[] for j, pstate in enumerate(label): rvs.append(x2.parents[j].truncate_rv(pstate)) for k in xrange(nstate): probs.append(rvs[0].cdf(x2.bins[k+1]/10.) - rvs[0].cdf(x2.bins[k]/10.)) probs = np.asarray(probs) x2.assign_cpt(probs,label=np.asarray(label),statenames=x2names) # node Y nstate = 2 labels = itertools.product(np.arange(x2.nstates())) rvnames = [x2.name, 'X3'] corr = np.eye(nstate)
r4names = r4.discretize(lb, ub, r4num, infinity='+', bins=r4bins) m4names = m4.discretize(lb, ub, m4num, infinity='+-', bins=r4bins) lb = 50. ub = 250. r5bins = np.hstack((0, np.linspace(lb, ub, r5num - 1))) r5names = r5.discretize(lb, ub, r5num, infinity='+', bins=r5bins) m5names = m5.discretize(lb, ub, m5num, infinity='+-', bins=r5bins) # calculate and assignCPT # node R5 r5cpt = r5.rv.cdf(r5.bins[1:]) - r5.rv.cdf(r5.bins[:-1]) r5cpt = r5cpt[np.newaxis, :] r5.assign_cpt(r5cpt, statenames=r5names) # node R4 nstate = r4num labels = itertools.product(np.arange(r5.nstates())) mvnorm = stats.multivariate_normal(mean=None, cov=np.array([[1., rolnR], [rolnR, 1.]])) for i, label in enumerate(labels): probs = [] plb = r5.bins[label[0]] #r5 lower bound pub = r5.bins[label[0] + 1] #r5 upper bound z5lb = (np.log(plb) - logmean) / logstd z5ub = (np.log(pub) - logmean) / logstd for k in xrange(nstate): clb = r4.bins[k] #r4 lower bound cub = r4.bins[k + 1] #r4 upper bound z4lb = (np.log(clb) - logmean) / logstd z4ub = (np.log(cub) - logmean) / logstd low = np.array([z5lb, z4lb])
dbnet.set_autoupdate() # save the network dbnet.save_net("BNdecision.dne") # decision making # type 1 dbnet.enter_finding(forecast, 0) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is sunny, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) dbnet.retract_netfindings() dbnet.enter_finding(forecast, 1) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is cloudy, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) dbnet.retract_netfindings() dbnet.enter_finding(forecast, 2) utils = dbnet.get_node_expectedutils(umbrella) print 'If the forecast is rainy, expected utility of {} is {}, of {} is {}\n'.format( umbrella.statenames[0], utils[0], umbrella.statenames[1], utils[1]) #type 2 dbnet.retract_netfindings() dummy = dbnet.get_node_expectedutils(umbrella) for fs in range(forecast.nstates()): decision = dbnet.get_node_funcstate(umbrella, [fs]) print 'If the forecast is {}, the best decision is {}.\n'.format( forecast.statenames[fs], umbrella.statenames[decision])