Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #5
0
        ai = Node("A" + str(i + 1),
                  parents=[aarray[-1], node_k, node_m],
                  rvname='continuous')
        mi = Node("M" + str(i + 1), parents=[ai], rvname='continuous')
        aarray.append(ai)
        marray.append(mi)

    # discretize continuous rv
    # node a0
    a0num = 20 + 2
    mu, var = rv_a0.stats()
    sigma = np.sqrt(var)
    lb = mu - 3. * sigma
    ub = mu + 3. * sigma
    a0bins = np.linspace(lb, ub, a0num - 1)
    a0names = node_a0.discretize(lb, ub, a0num, infinity='+-', bins=a0bins)
    # node m
    mnum = 20 + 2
    mu, var = rv_m.stats()
    sigma = np.sqrt(var)
    lb = mu - 3. * sigma
    ub = mu + 3. * sigma
    mbins = np.linspace(lb, ub, mnum - 1)
    mnames = node_m.discretize(lb, ub, mnum, infinity='+-', bins=mbins)
    # 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)))
    node_a0 = Node('a0', parents=None, rvname='normal', rv=rv_a0)
    aarray = [node_a0]
    marray=[]
    for i in range(life):
        ai = Node("A"+str(i+1), parents=[aarray[-1], node_k, node_m], rvname='continuous')
        mi = Node("M"+str(i+1), parents=[ai], rvname='continuous')
        aarray.append(ai)
        marray.append(mi)

    # discretize continuous rv
    # node a0
    a0num = 20+2
    mu,var = rv_a0.stats(); sigma = np.sqrt(var)
    lb = mu-3.*sigma; ub = mu+3.*sigma
    a0bins = np.linspace(lb, ub, a0num-1)
    a0names = node_a0.discretize(lb, ub, a0num, infinity='+-', bins=a0bins)
    # node m
    mnum = 20+2
    mu,var = rv_m.stats(); sigma = np.sqrt(var)
    lb = mu-3.*sigma; ub = mu+3.*sigma
    mbins = np.linspace(lb, ub, mnum-1)
    mnames = node_m.discretize(lb, ub, mnum, infinity='+-', bins=mbins)
    # 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)
Beispiel #7
0
    for i in range(life):
        h = Node("H"+str(i+1), parents=[uh], rvname='continuous')
        e = Node("E"+str(i+1),parents=[earray[-1],q,h], rvname='discrete')
        harray.append(h)
        earray.append(e)

    # discretize continuous rv
    # r4, m4, r5 and m5
    r4num = 20+1
    r5num = 20+1
    m4num = 20+2
    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)
    # q
    qnum = 30+1
    qlb = 0.; qub = 150.
    qbins = np.hstack(np.linspace(qlb, qub, qnum))
    qnames = q.discretize(qlb, qub, qnum, infinity='+', bins=qbins)
    # uh
    uhnum = 50+1
    uhlb = 0.; uhub = 150.
    uhbins = np.hstack(np.linspace(uhlb, uhub, uhnum))
    uhnames = uh.discretize(uhlb, uhub, uhnum, infinity='+', bins=uhbins)
Beispiel #8
0
    # create nodes
    r5 = Node("R5", parents=None, rvname='lognormal', rv=rv5)
    r4 = Node("R4", parents=[r5], rvname='lognormal', rv=rv4)
    m4 = Node("M4", parents=[r4], rvname='continuous')
    m5 = Node("M5", parents=[r5], rvname='continuous')
    e = Node("E",parents=[r4,r5], rvname='discrete')

    # discretize continuous rv
    r4num = 20+1
    r5num = 20+1
    m4num = 20+2
    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.]]))
                 rvname='discrete')
        harray.append(h)
        earray.append(e)

    # discretize continuous rv
    # r4, m4, r5 and m5
    r4num = 20 + 1
    r5num = 20 + 1
    m4num = 20 + 2
    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)
    # q
    qnum = 30 + 1
    qlb = 0.
    qub = 150.
    qbins = np.hstack(np.linspace(qlb, qub, qnum))
    qnames = q.discretize(qlb, qub, qnum, infinity='+', bins=qbins)
    # uh
    uhnum = 50 + 1
    uhlb = 0.
Beispiel #10
0
# random variables
rvX1 = stats.lognorm(1., scale=np.exp(0))
rvX3 = stats.lognorm(1., scale=np.exp(3*np.sqrt(2)))

# create nodes
x1 = Node("X1", parents=None, rvname='lognormal', rv=rvX1)
x2 = Node("X2", parents=[x1], rvname='continuous')
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):
Beispiel #11
0
    r4 = Node("R4", parents=[r5], rvname='lognormal', rv=rv4)
    m4 = Node("M4", parents=[r4], rvname='continuous')
    m5 = Node("M5", parents=[r5], rvname='continuous')
    e = Node("E", parents=[r4, r5], rvname='discrete')

    # discretize continuous rv
    r4num = 20 + 1
    r5num = 20 + 1
    m4num = 20 + 2
    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()))