Я не уверен, что это вопрос PyMC3 или вопрос Theano. Я долгое время использовал PyMC2, чтобы подогнать космологию к данным о сверхновых. Для этого требуются некоторые запутанные интегралы (см., например, http://arxiv.org/abs/astroph/9905116 )
Поэтому я использую пакет на питоне под названием Cosmolopy для интеграции и некоторых других удобных функций. В то время как это отлично работало с PyMC2, с опорой на theano в PyMC3, я не могу понять, есть ли способ использовать Cosmolopy.
Вот пример кода моего текущего понимания того, как построить модель в PyMC3.
import numpy as np
import pymc as pm
import cosmolopy as cp
# generate some redshifts
nSNe = 100
z = np.random.uniform( low=0.0, high=1.0, size=nSNe )
# set cosmology and simulate some distance moduli and errors
cosmo = cp.fidcosmo
muSN = cp.magnitudes.distance_modulus( z, **cosmo ) + np.random.normal( loc=0, scale=0.15, size=nSNe )
muSN_err = np.random.uniform(low=0.1, high=0.3, size=nSNe)
# pymc model
with pm.Model() as model:
# omega matter is the free parameter in this simple example
omega_matter = pm.Uniform( 'omega_matter', lower=0.0, upper=1.0 )
# the cosmology as a function of omega_matter
cosmo['omega_M_0'] = omega_matter
cosmo['omega_lambda_0'] = 1.0 - omega_matter
mu_fit = cp.magnitudes.distance_modulus( z, **cosmo )
# what should be fit by the MCMC
snr = pm.Normal( 'snr', mu = mu_fit, sd = muSN_err, observed = muSN )
Этот код дает сбой, потому что Cosmolopy ожидает число с плавающей запятой для omega_matter, но вместо этого получает theano.TensorVariable.
Так что вопрос двоякий:
Я просто упустил что-то синтаксически с PyMC3, что позволило бы мне это сделать (возможно, потому, что я все еще каким-то образом застрял в построении модели PyMC2)?
Если не 1, то мне нужно найти способ сделать интегралы в theano?