コード例 #1
0
ファイル: abcsmc.py プロジェクト: bcmd/BCMD
    def computeParticleWeights(self):
        if self.debug == 2:print "\t***computeParticleWeights"

        for k in range(self.nparticles):
            this_model = self.model_curr[k]
            this_param = self.parameters_curr[k]
            
            # calculate model prior probility 
            mprob = self.modelprior[ this_model ]

            np = len(self.parameters_curr[k])
            # particle prior probability
            pprob = 1
            for n in range(0,np):
                x = 1.0
                if self.models[ this_model ].prior[n][0]==0:
                    x=1

                if self.models[ this_model ].prior[n][0]==1: 
                    x=statistics.getPdfGauss(self.models[ this_model ].prior[n][1],
                                             numpy.sqrt(self.models[ this_model ].prior[n][2]),
                                             this_param[n])
                
                if self.models[ this_model ].prior[n][0]==2: 
                    x=statistics.getPdfUniform(self.models[ this_model ].prior[n][1],
                                               self.models[ this_model ].prior[n][2],
                                               this_param[n])
    
                if self.models[ this_model ].prior[n][0]==3: 
                    x=statistics.getPdfLognormal(self.models[ this_model ].prior[n][1],
                                                 numpy.sqrt(self.models[ this_model ].prior[n][2]),
                                                 this_param[n])
                pprob = pprob*x

            numer = self.b[k] * mprob * pprob
        
            denom_m = 0
            for i in range(self.nmodel):
                denom_m = denom_m + self.margins_prev[i]*getPdfModelKernel(this_model, i, self.modelKernel, self.nmodel, self.dead_models)
            denom = 0
            # print "Calculating denom\t", selected_model, sampleParameters
            for j in range(self.nparticles):

                if(int(this_model) == int(self.model_prev[j]) ):
                    # print "\t", j, model_prev[j], weights_prev[j], parameters_prev[j]
                    if self.debug == 2:
                        print "\tj, weights_prev, kernelpdf", j, self.weights_prev[j],
                        self.kernelpdffn(this_param, self.parameters_prev[j], self.models[this_model].prior, self.kernels[this_model], self.kernel_aux[j], self.kernel_type )
                    denom = denom + self.weights_prev[j] * self.kernelpdffn(this_param, self.parameters_prev[j], self.models[this_model].prior, self.kernels[this_model], self.kernel_aux[j], self.kernel_type )

                if self.debug == 2: print "\tnumer/denom_m/denom/m(t-1) : ", numer,denom_m, denom, self.margins_prev[this_model]

            self.weights_curr[k] = numer/(denom_m*denom/self.margins_prev[this_model])
コード例 #2
0
ファイル: kernels.py プロジェクト: walkymatt/BCMD
def getPdfParameterKernel(params, params0, priors, kernel, auxilliary,
                          kernel_type):
    if kernel_type == 1:
        prob = 1
        # n refers to the index of the parameter (integer between 0 and np-1)
        # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
        ind = 0
        for n in kernel[0]:
            kern = statistics.getPdfUniform(params0[n] + kernel[2][ind][0],
                                            params0[n] + kernel[2][ind][1],
                                            params[n])
            prob = prob * kern
            ind += 1
        return prob

    elif kernel_type == 2:
        # n refers to the index of the parameter (integer between 0 and np-1)
        # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
        prob = 1
        ind = 0
        for n in kernel[0]:
            mean = params0[n]
            scale = numpy.sqrt(kernel[2][ind])
            kern = statistics.getPdfGauss(mean, scale, params[n])
            kern = kern / auxilliary[n]
            prob = prob * kern
            ind += 1
        return prob

    elif kernel_type == 3:
        p0 = list()
        p = list()
        for n in kernel[0]:
            p0.append(params0[n])
            p.append(params[n])
        kern = statistics.getPdfMultinormal(p0, kernel[2], p)
        kern = kern / auxilliary
        return kern

    elif (kernel_type == 4 or kernel_type == 5):
        p0 = list()
        p = list()
        D = kernel[2]
        for n in kernel[0]:
            p0.append(params0[n])
            p.append(params[n])
        kern = statistics.getPdfMultinormal(p0, D[str(params0)], p)
        kern = kern / auxilliary
        return kern
コード例 #3
0
ファイル: kernels.py プロジェクト: buck06191/BCMD
def getPdfParameterKernel(params, params0, priors, kernel, auxilliary, kernel_type):
    if kernel_type == 1:
        prob = 1
        # n refers to the index of the parameter (integer between 0 and np-1)
        # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
        ind = 0
        for n in kernel[0]:
            kern = statistics.getPdfUniform(params0[n] + kernel[2][ind][0], params0[n] + kernel[2][ind][1], params[n])
            prob = prob * kern
            ind += 1
        return prob

    elif kernel_type == 2:
        # n refers to the index of the parameter (integer between 0 and np-1)
        # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
        prob = 1
        ind = 0
        for n in kernel[0]:
            mean = params0[n]
            scale = numpy.sqrt(kernel[2][ind])
            kern = statistics.getPdfGauss(mean, scale, params[n])
            kern = kern / auxilliary[n]
            prob = prob * kern
            ind += 1
        return prob

    elif kernel_type == 3:
        p0 = list()
        p = list()
        for n in kernel[0]:
            p0.append(params0[n])
            p.append(params[n])
        kern = statistics.getPdfMultinormal(p0, kernel[2], p)
        kern = kern / auxilliary
        return kern

    elif kernel_type == 4 or kernel_type == 5:
        p0 = list()
        p = list()
        D = kernel[2]
        for n in kernel[0]:
            p0.append(params0[n])
            p.append(params[n])
        kern = statistics.getPdfMultinormal(p0, D[str(params0)], p)
        kern = kern / auxilliary
        return kern
コード例 #4
0
ファイル: kernels.py プロジェクト: walkymatt/BCMD
def perturbParticle(params, priors, kernel, kernel_type, special_cases):
    np = len(priors)
    prior_prob = 1

    if special_cases == 1:
        # this is the case where kernel is uniform and all priors are uniform
        ind = 0
        for n in kernel[0]:
            lflag = (params[n] + kernel[2][ind][0]) < priors[n][1]
            uflag = (params[n] + kernel[2][ind][1]) > priors[n][2]

            lower = kernel[2][ind][0]
            upper = kernel[2][ind][1]
            if lflag == True:
                lower = -(params[n] - priors[n][1])
            if uflag == True:
                upper = priors[n][2] - params[n]

            delta = 0
            positive = False
            if lflag == False and uflag == False:
                # proceed as normal
                delta = rnd.uniform(low=kernel[2][ind][0],
                                    high=kernel[2][ind][1])
            else:
                # decide if the particle is to be perturbed positively or negatively
                positive = rnd.uniform(0,
                                       1) > abs(lower) / (abs(lower) + upper)

                if positive == True:
                    # theta = theta + U(0, min(prior,kernel) )
                    delta = rnd.uniform(low=0, high=upper)
                else:
                    # theta = theta + U( max(prior,kernel), 0 )
                    delta = rnd.uniform(low=lower, high=0)

            params[n] = params[n] + delta
            ind += 1

        # this is not the actaul value of the pdf but we only require it to be non zero
        return 1.0

    else:
        if kernel_type == 1:
            ind = 0
            # n refers to the index of the parameter (integer between 0 and np-1)
            # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
            for n in kernel[0]:
                params[n] = params[n] + rnd.uniform(low=kernel[2][ind][0],
                                                    high=kernel[2][ind][1])
                ind += 1

        if kernel_type == 2:
            ind = 0
            # n refers to the index of the parameter (integer between 0 and np-1)
            # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
            for n in kernel[0]:
                params[n] = rnd.normal(params[n], numpy.sqrt(kernel[2][ind]))
                ind += 1

        if kernel_type == 3:
            mean = list()
            for n in kernel[0]:
                mean.append(params[n])
            tmp = statistics.mvnd_gen(mean, kernel[2])
            ind = 0
            for n in kernel[0]:
                params[n] = tmp[ind]
                ind = ind + 1

        if (kernel_type == 4 or kernel_type == 5):
            mean = list()
            for n in kernel[0]:
                mean.append(params[n])
            D = kernel[2]
            tmp = statistics.mvnd_gen(mean, D[str(params)])
            ind = 0
            for n in kernel[0]:
                params[n] = tmp[ind]
                ind = ind + 1

        # compute the likelihood
        prior_prob = 1
        for n in range(np):
            x = 1.0
            #if priors[n][0]==1:
            #    x=statistics.getPdfGauss(priors[n][1], numpy.sqrt(priors[n][2]), params[n])
            # if we do not care about the value of prior_prob, then here: x=1.0

            if priors[n][0] == 2:
                x = statistics.getPdfUniform(priors[n][1], priors[n][2],
                                             params[n])

            #if priors[n][0]==3:
            #    x=statistics.getPdfLognormal(priors[n][1],priors[n][2],params[n])
            # if we do not care about the value of prior_prob, then here: x=1.0 if params[n]>=0 and 0 otherwise

            prior_prob = prior_prob * x

        return prior_prob
コード例 #5
0
ファイル: kernels.py プロジェクト: buck06191/BCMD
def perturbParticle(params, priors, kernel, kernel_type, special_cases):
    np = len(priors)
    prior_prob = 1

    if special_cases == 1:
        # this is the case where kernel is uniform and all priors are uniform
        ind = 0
        for n in kernel[0]:
            lflag = (params[n] + kernel[2][ind][0]) < priors[n][1]
            uflag = (params[n] + kernel[2][ind][1]) > priors[n][2]

            lower = kernel[2][ind][0]
            upper = kernel[2][ind][1]
            if lflag == True:
                lower = -(params[n] - priors[n][1])
            if uflag == True:
                upper = priors[n][2] - params[n]

            delta = 0
            positive = False
            if lflag == False and uflag == False:
                # proceed as normal
                delta = rnd.uniform(low=kernel[2][ind][0], high=kernel[2][ind][1])
            else:
                # decide if the particle is to be perturbed positively or negatively
                positive = rnd.uniform(0, 1) > abs(lower) / (abs(lower) + upper)

                if positive == True:
                    # theta = theta + U(0, min(prior,kernel) )
                    delta = rnd.uniform(low=0, high=upper)
                else:
                    # theta = theta + U( max(prior,kernel), 0 )
                    delta = rnd.uniform(low=lower, high=0)

            params[n] = params[n] + delta
            ind += 1

        # this is not the actaul value of the pdf but we only require it to be non zero
        return 1.0

    else:
        if kernel_type == 1:
            ind = 0
            # n refers to the index of the parameter (integer between 0 and np-1)
            # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
            for n in kernel[0]:
                params[n] = params[n] + rnd.uniform(low=kernel[2][ind][0], high=kernel[2][ind][1])
                ind += 1

        if kernel_type == 2:
            ind = 0
            # n refers to the index of the parameter (integer between 0 and np-1)
            # ind is an integer between 0 and len(kernel[0])-1 which enables to determine the kernel to use
            for n in kernel[0]:
                params[n] = rnd.normal(params[n], numpy.sqrt(kernel[2][ind]))
                ind += 1

        if kernel_type == 3:
            mean = list()
            for n in kernel[0]:
                mean.append(params[n])
            tmp = statistics.mvnd_gen(mean, kernel[2])
            ind = 0
            for n in kernel[0]:
                params[n] = tmp[ind]
                ind = ind + 1

        if kernel_type == 4 or kernel_type == 5:
            mean = list()
            for n in kernel[0]:
                mean.append(params[n])
            D = kernel[2]
            tmp = statistics.mvnd_gen(mean, D[str(params)])
            ind = 0
            for n in kernel[0]:
                params[n] = tmp[ind]
                ind = ind + 1

        # compute the likelihood
        prior_prob = 1
        for n in range(np):
            x = 1.0
            # if priors[n][0]==1:
            #    x=statistics.getPdfGauss(priors[n][1], numpy.sqrt(priors[n][2]), params[n])
            # if we do not care about the value of prior_prob, then here: x=1.0

            if priors[n][0] == 2:
                x = statistics.getPdfUniform(priors[n][1], priors[n][2], params[n])

            # if priors[n][0]==3:
            #    x=statistics.getPdfLognormal(priors[n][1],priors[n][2],params[n])
            # if we do not care about the value of prior_prob, then here: x=1.0 if params[n]>=0 and 0 otherwise

            prior_prob = prior_prob * x

        return prior_prob
コード例 #6
0
ファイル: abcsmc.py プロジェクト: walkymatt/BCMD
    def computeParticleWeights(self):
        if self.debug == 2: print "\t***computeParticleWeights"

        for k in range(self.nparticles):
            this_model = self.model_curr[k]
            this_param = self.parameters_curr[k]

            # calculate model prior probility
            mprob = self.modelprior[this_model]

            np = len(self.parameters_curr[k])
            # particle prior probability
            pprob = 1
            for n in range(0, np):
                x = 1.0
                if self.models[this_model].prior[n][0] == 0:
                    x = 1

                if self.models[this_model].prior[n][0] == 1:
                    x = statistics.getPdfGauss(
                        self.models[this_model].prior[n][1],
                        numpy.sqrt(self.models[this_model].prior[n][2]),
                        this_param[n])

                if self.models[this_model].prior[n][0] == 2:
                    x = statistics.getPdfUniform(
                        self.models[this_model].prior[n][1],
                        self.models[this_model].prior[n][2], this_param[n])

                if self.models[this_model].prior[n][0] == 3:
                    x = statistics.getPdfLognormal(
                        self.models[this_model].prior[n][1],
                        numpy.sqrt(self.models[this_model].prior[n][2]),
                        this_param[n])
                pprob = pprob * x

            numer = self.b[k] * mprob * pprob

            denom_m = 0
            for i in range(self.nmodel):
                denom_m = denom_m + self.margins_prev[i] * getPdfModelKernel(
                    this_model, i, self.modelKernel, self.nmodel,
                    self.dead_models)
            denom = 0
            # print "Calculating denom\t", selected_model, sampleParameters
            for j in range(self.nparticles):

                if (int(this_model) == int(self.model_prev[j])):
                    # print "\t", j, model_prev[j], weights_prev[j], parameters_prev[j]
                    if self.debug == 2:
                        print "\tj, weights_prev, kernelpdf", j, self.weights_prev[
                            j],
                        self.kernelpdffn(this_param, self.parameters_prev[j],
                                         self.models[this_model].prior,
                                         self.kernels[this_model],
                                         self.kernel_aux[j], self.kernel_type)
                    denom = denom + self.weights_prev[j] * self.kernelpdffn(
                        this_param, self.parameters_prev[j], self.
                        models[this_model].prior, self.kernels[this_model],
                        self.kernel_aux[j], self.kernel_type)

                if self.debug == 2:
                    print "\tnumer/denom_m/denom/m(t-1) : ", numer, denom_m, denom, self.margins_prev[
                        this_model]

            self.weights_curr[k] = numer / (denom_m * denom /
                                            self.margins_prev[this_model])