MCMC: PicklingError: не могу засолить: поиск атрибута __builtin __. функция завершилась неудачно - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь выполнить MCMC. Этот MCMC хорошо работает, когда я запускаю код, но если я помещаю тот же код в функцию (чтобы иметь возможность вызывать его из другого сценария с аргументом), то я получаю сообщение об ошибке: PicklingError: Can'tpickle: поиск атрибута __builtin __. функция завершилась неудачей

Буквально единственное различие между работой или нет - это поместить MCMC внутрь функции или нет, так что вы знаете, что может произойти, или как ее решить? ? Я поместил здесь часть кода, которая выдает ошибку

Код, который работает:

    **(HERE I READ DATA FILE WITH VARIABLES)**

    def lnlike(theta, magh,R_200,ngal,ngal_err):
        phi_star, m_star, alpha = theta
        #model =int_nfw(rprofile,R_200,n0,c,rmax)
        model =  lf.LF(magh,R_200,phi_star,m_star,alpha)
        inv_sigma2 = 1.0/(ngal_err**2.)
        return -0.5*(np.sum((ngal-model)**2.*inv_sigma2 - np.log(inv_sigma2)))



    def lnprior(theta):
        phi_star, m_star,alpha = theta
        if 0. < phi_star < 100. and 10.< m_star < 30. and -3. < alpha < 0.:
            return 0.0
        return -np.inf


    def lnprob(theta, magh,R_200,ngal,ngal_err):
        lp = lnprior(theta)
        if not np.isfinite(lp):
            return -np.inf
        return lp + lnlike(theta, magh,R_200,ngal,ngal_err)






    nll = lambda *args: -lnprob(*args)
    result = scipy.optimize.minimize(nll, [20., 20.,-0.5], args=(magh,R_200,ngal,ngal_err))
    phi_star_ml, m_star_ml, alpha_ml = result["x"]

    ndim, nwalkers = 3, 500
    pos = [result["x"] + 1e-4*np.random.randn(ndim) for i in range(nwalkers)]


    Sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob, args=(magh,R_200,ngal,ngal_err), threads = 30)

    Sampler.run_mcmc(pos, 500)

код, который неработа:

def mcmc_luminosity(bin_number):

    **(HERE I READ DATA FILE WITH VARIABLES)**

    def lnlike(theta, magh,R_200,ngal,ngal_err):
        phi_star, m_star, alpha = theta
        #model =int_nfw(rprofile,R_200,n0,c,rmax)
        model =  lf.LF(magh,R_200,phi_star,m_star,alpha)
        inv_sigma2 = 1.0/(ngal_err**2.)
        return -0.5*(np.sum((ngal-model)**2.*inv_sigma2 - np.log(inv_sigma2)))



    def lnprior(theta):
        phi_star, m_star,alpha = theta
        if 0. < phi_star < 100. and 10.< m_star < 30. and -3. < alpha < 0.:
            return 0.0
        return -np.inf


    def lnprob(theta, magh,R_200,ngal,ngal_err):
        lp = lnprior(theta)
        if not np.isfinite(lp):
            return -np.inf
        return lp + lnlike(theta, magh,R_200,ngal,ngal_err)






    nll = lambda *args: -lnprob(*args)
    result = scipy.optimize.minimize(nll, [20., 20.,-0.5], args=(magh,R_200,ngal,ngal_err))
    phi_star_ml, m_star_ml, alpha_ml = result["x"]




    ndim, nwalkers = 3, 500
    pos = [result["x"] + 1e-4*np.random.randn(ndim) for i in range(nwalkers)]


    Sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob, args=(magh,R_200,ngal,ngal_err), threads = 30)

    Sampler.run_mcmc(pos, 500)

    return ndim, nwalkers
...