def create_node_mi(name, parents, minum, milb, miub, mibins): node_mi = Node(name, parents=parents, rvname='continuous') minames = node_mi.discretize(milb, miub, minum, infinity='+-', bins=mibins) node_insp = parents[0] node_ai = parents[1] ainum = node_ai.nstates() labels = itertools.product(np.arange(node_insp.nstates()), np.arange(ainum)) labels = [label for label in labels] for i,label in enumerate(labels): if label[0] == 0: #no inspection probs = 1./minum * np.ones(minum) else: # with insepction if label[0] == 1: lmd = lmd1; beta = beta1 elif label[0] == 2: lmd = lmd2; beta = beta2 elif label[0] == 3: lmd = lmd3; beta = beta3 rvnames = ['Ai'] rvs = [node_ai.truncate_rv(label[1], lmd=trunclmd)] aimean = rvs[0].stats('m')[()] rv_am = stats.norm(aimean, sigmae) pod = 1.-stats.norm.cdf((np.log(aimean)-lmd)/beta) probs = rv_am.cdf(node_mi.bins[1:])-rv_am.cdf(node_mi.bins[:-1]) probs = probs/np.sum(probs)*pod probs[0] = probs[0]+(1.-pod) node_mi.assign_cpt(probs,label=np.asarray(label),statenames=node_mi.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_mi
def create_node_a(name, parents, ainum, ailb, aiub, aiedges, node_repair=None, asmp0=None): if node_repair is None: node_ai = Node(name, parents=parents, rvname='continuous') else: node_ai = Node(name, parents=parents + [node_repair], rvname='continuous') # dynamic discretization of nodes a and M node_ap = parents[0] knum = parents[1].nstates() mnum = parents[2].nstates() ainames = node_ai.discretize(ailb, aiub, ainum, infinity='+', bins=aiedges) aibins = node_ai.bins if node_repair is None: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum)) else: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum), np.arange(2)) labels = [label for label in labels] for i, label in enumerate(labels): if len(label) == 4 and label[-1] == 1: binnum, dummy = np.histogram(asmp0, aibins) probs = binnum / np.sum(binnum, dtype=float) node_ai.assign_cpt(probs, label=np.asarray(label), statenames=node_ai.statenames) else: truncrvs = [] for j, pstate in enumerate(label): truncrvs.append(node_ai.parents[j].truncate_rv(pstate, lmd=trunclmd)) rvnames = ['Ap', 'K', 'M'] rvs = truncrvs[:3] probs, smpdb = mc2ai(rvnames, rvs, node_ai.bins, acrit, nsmp=nsmp) # clean Ai states given Ai-1 apstate = label[0] aplb = node_ap.bins[apstate] aiubs = node_ai.bins[1:] probs[aiubs <= aplb] = 0. probs = probs / np.sum(probs) node_ai.assign_cpt(probs, label=np.asarray(label), statenames=node_ai.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_ai
def create_node_a(name, parents, ainum, ailb, aiub, aiedges, node_repair=None, asmp0=None): if node_repair is None: node_ai = Node(name, parents=parents, rvname='continuous') else: node_ai = Node(name, parents=parents+[node_repair], rvname='continuous') # dynamic discretization of nodes a and M node_ap = parents[0] knum = parents[1].nstates() mnum = parents[2].nstates() ainames = node_ai.discretize(ailb, aiub, ainum, infinity='+', bins=aiedges) aibins = node_ai.bins if node_repair is None: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum),np.arange(mnum)) else: labels = itertools.product(np.arange(node_ap.nstates()), np.arange(knum), np.arange(mnum), np.arange(2)) labels = [label for label in labels] for i,label in enumerate(labels): if len(label)==4 and label[-1] == 1: binnum,dummy = np.histogram(asmp0, aibins) probs = binnum/np.sum(binnum, dtype=float) node_ai.assign_cpt(probs,label=np.asarray(label),statenames=node_ai.statenames) else: truncrvs=[] for j,pstate in enumerate(label): truncrvs.append(node_ai.parents[j].truncate_rv(pstate,lmd=trunclmd)) rvnames = ['Ap', 'K', 'M'] rvs = truncrvs[:3] probs,smpdb = mc2ai(rvnames, rvs, node_ai.bins, acrit, nsmp=nsmp) # clean Ai states given Ai-1 apstate = label[0] aplb = node_ap.bins[apstate] aiubs = node_ai.bins[1:] probs[aiubs<=aplb] = 0. probs = probs/np.sum(probs) node_ai.assign_cpt(probs,label=np.asarray(label),statenames=node_ai.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_ai
def create_node_mi(name, parents, minum, milb, miub, mibins): node_mi = Node(name, parents=parents, rvname='continuous') minames = node_mi.discretize(milb, miub, minum, infinity='+-', bins=mibins) node_insp = parents[0] node_ai = parents[1] ainum = node_ai.nstates() labels = itertools.product(np.arange(node_insp.nstates()), np.arange(ainum)) labels = [label for label in labels] for i, label in enumerate(labels): if label[0] == 0: #no inspection probs = 1. / minum * np.ones(minum) else: # with insepction if label[0] == 1: lmd = lmd1 beta = beta1 elif label[0] == 2: lmd = lmd2 beta = beta2 elif label[0] == 3: lmd = lmd3 beta = beta3 rvnames = ['Ai'] rvs = [node_ai.truncate_rv(label[1], lmd=trunclmd)] aimean = rvs[0].stats('m')[()] rv_am = stats.norm(aimean, sigmae) pod = 1. - stats.norm.cdf((np.log(aimean) - lmd) / beta) probs = rv_am.cdf(node_mi.bins[1:]) - rv_am.cdf(node_mi.bins[:-1]) probs = probs / np.sum(probs) * pod probs[0] = probs[0] + (1. - pod) node_mi.assign_cpt(probs, label=np.asarray(label), statenames=node_mi.statenames) # print 'labels: {}, progress: {}%, prob: {}'.format(label, # float(i)/len(labels)*100, np.array_str(probs,precision=3)) return node_mi
knum = 20 + 1 ksmp_prior, msmp_prior = ksmp_mc(nsmp, rv_C, rv_Sre, G, rv_m, rv_Na) klb = np.percentile(ksmp_prior, 5) kub = np.percentile(ksmp_prior, 95) if klb > 0: kbins = np.hstack((0., np.linspace(klb, kub, knum - 1))) 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]
# node k knum = 20+1 ksmp_prior,msmp_prior = ksmp_mc(nsmp, rv_C, rv_Sre, G, rv_m, rv_Na) klb = np.percentile(ksmp_prior, 5) kub = np.percentile(ksmp_prior, 95) if klb>0: kbins = np.hstack((0., np.linspace(klb, kub, knum-1))) 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']
import numpy as np # create new net netp = Network("ChestClinic") # define nodes visitAsia = Node("VisitAsia", parents=None, rvname='discrete') smoking = Node("Smoking", parents=None, rvname='discrete') tuberculosis = Node("Tuberculosis", parents=[visitAsia], rvname='discrete') cancer = Node("Cancer", parents=[smoking], rvname='discrete') tbOrCa = Node("TbOrCa", parents=[tuberculosis, cancer], rvname='discrete') xRay = Node("XRay", parents=[tbOrCa], rvname='discrete') # assign CPT visitAsiaCpt = np.array([0.01, 0.99])[np.newaxis, :] visitAsia.assign_cpt(visitAsiaCpt, statenames=['visit', 'no_visit']) smokingCpt = np.array([0.50, 0.50])[np.newaxis, :] smoking.assign_cpt(smokingCpt, statenames=['smoker', 'nonsmoker']) tuberCpt = np.array([[0.05, 0.95], [0.01, 0.99]]) tuberculosis.assign_cpt(tuberCpt, statenames=['present', 'absent']) cancerCpt = np.array([[0.10, 0.90], [0.01, 0.99]]) cancer.assign_cpt(cancerCpt, statenames=['present', 'absent']) tbOrCaCpt = np.array([[1.0, 0.0], [1.0, 0.0], [1.0, 0.0], [0.0, 1.0]]) tbOrCa.assign_cpt(tbOrCaCpt, statenames=['true', 'false']) xRayCpt = np.array([[0.98, 0.02], [0.05, 0.95]]) xRay.assign_cpt(xRayCpt, statenames=['abnormal', 'normal']) # add node netp.add_nodes([visitAsia]) netp.add_nodes([smoking]) netp.add_nodes([tuberculosis])
uhnum = 50+1 uhlb = 0.; uhub = 150. uhbins = np.hstack(np.linspace(uhlb, uhub, uhnum)) uhnames = uh.discretize(uhlb, uhub, uhnum, infinity='+', bins=uhbins) # h for h in harray: hnum = 30+1 hlb = 0.; hub = 150. hbins = np.hstack(np.linspace(hlb, hub, hnum)) hnames = h.discretize(hlb, hub, hnum, infinity='+', bins=hbins) # 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
import numpy as np # create new net netp = Network("ChestClinic") # define nodes visitAsia = Node("VisitAsia", parents=None, rvname='discrete') smoking = Node("Smoking", parents=None, rvname='discrete') tuberculosis = Node("Tuberculosis", parents=[visitAsia], rvname='discrete') cancer = Node("Cancer", parents=[smoking], rvname='discrete') tbOrCa = Node("TbOrCa", parents=[tuberculosis, cancer], rvname='discrete') xRay = Node("XRay", parents=[tbOrCa], rvname='discrete') # assign CPT visitAsiaCpt = np.array([0.01, 0.99])[np.newaxis, :] visitAsia.assign_cpt(visitAsiaCpt, statenames=['visit','no_visit']) smokingCpt = np.array([0.50, 0.50])[np.newaxis, :] smoking.assign_cpt(smokingCpt, statenames=['smoker','nonsmoker']) tuberCpt = np.array([[0.05, 0.95], [0.01, 0.99]]) tuberculosis.assign_cpt(tuberCpt, statenames=['present','absent']) cancerCpt = np.array([[0.10, 0.90], [0.01, 0.99]]) cancer.assign_cpt(cancerCpt, statenames=['present','absent']) tbOrCaCpt = np.array([[1.0, 0.0], [1.0, 0.0], [1.0, 0.0], [0.0, 1.0]]) tbOrCa.assign_cpt(tbOrCaCpt, statenames=['true','false']) xRayCpt = np.array([[0.98, 0.02], [0.05, 0.95]]) xRay.assign_cpt(xRayCpt, statenames=['abnormal','normal']) # add node netp.add_nodes([visitAsia]) netp.add_nodes([smoking]) netp.add_nodes([tuberculosis])
m5num = 20+2 m = r5.rv.stats('m'); s = np.sqrt(r5.rv.stats('v')) lb = 50.; ub = 250. 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
# random variables rvX1 = stats.lognorm(1., scale=np.exp(0)) rvX3 = stats.lognorm(1., scale=np.exp(3*np.sqrt(2))) # create nodes weather = Node("Weather", parents=None, rvname='discrete') forecast = Node("Forecast", parents=[weather], rvname='discrete') umbrella = Node("Umbrella", parents=[forecast], rvname='discrete') satisfy = Node("Satisfaction", parents=[weather, umbrella], rvname='deterministic') umbrella.set_node_kind(DECISION_NODE) satisfy.set_node_kind(UTILITY_NODE) # assign CPT # node weather weathercpt = np.array([[0.7, 0.3]]) weather.assign_cpt(weathercpt, statenames=['sunshine', 'rain']) # node forecast forecastcpt = np.array([[0.7, 0.2, 0.1], [0.15, 0.25, 0.6]]) forecast.assign_cpt(forecastcpt, statenames=['sunny', 'cloudy', 'rainy']) # node umbrella umbrella.set_node_state_name(['take_umbrella', 'dont_take_umbrella']) # node satisfy def calculate_util(pstate): forecaststate,umbrellastate = pstate if forecaststate==0 and umbrellastate==0: return 20. elif forecaststate==0 and umbrellastate==1: return 100. elif forecaststate==1 and umbrellastate==0: return 70. elif forecaststate==1 and umbrellastate==1:
uhlb = 0. uhub = 150. uhbins = np.hstack(np.linspace(uhlb, uhub, uhnum)) uhnames = uh.discretize(uhlb, uhub, uhnum, infinity='+', bins=uhbins) # h for h in harray: hnum = 30 + 1 hlb = 0. hub = 150. hbins = np.hstack(np.linspace(hlb, hub, hnum)) hnames = h.discretize(hlb, hub, hnum, infinity='+', bins=hbins) # 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):
y = Node("Y", parents=[x2], rvname='discrete') # discretize continuous rv x1num = 5 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
lb = 50. ub = 250. 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
rvX3 = stats.lognorm(1., scale=np.exp(3 * np.sqrt(2))) # create nodes weather = Node("Weather", parents=None, rvname='discrete') forecast = Node("Forecast", parents=[weather], rvname='discrete') umbrella = Node("Umbrella", parents=[forecast], rvname='discrete') satisfy = Node("Satisfaction", parents=[weather, umbrella], rvname='deterministic') umbrella.set_node_kind(DECISION_NODE) satisfy.set_node_kind(UTILITY_NODE) # assign CPT # node weather weathercpt = np.array([[0.7, 0.3]]) weather.assign_cpt(weathercpt, statenames=['sunshine', 'rain']) # node forecast forecastcpt = np.array([[0.7, 0.2, 0.1], [0.15, 0.25, 0.6]]) forecast.assign_cpt(forecastcpt, statenames=['sunny', 'cloudy', 'rainy']) # node umbrella umbrella.set_node_state_name(['take_umbrella', 'dont_take_umbrella']) # node satisfy def calculate_util(pstate): forecaststate, umbrellastate = pstate if forecaststate == 0 and umbrellastate == 0: return 20. elif forecaststate == 0 and umbrellastate == 1: return 100. elif forecaststate == 1 and umbrellastate == 0: