Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
    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]
Esempio n. 6
0
    # 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']
Esempio n. 7
0
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])
Esempio n. 8
0
    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
Esempio n. 9
0
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])
Esempio n. 10
0
    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
Esempio n. 11
0
# 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:
Esempio n. 12
0
    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):
Esempio n. 13
0
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
Esempio n. 14
0
    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
Esempio n. 15
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: