Я пытаюсь выполнить 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