我不确定这是 PyMC3 问题还是 Theano 问题。我已经使用 PyMC2 很长时间来将宇宙学与超新星数据相匹配。这需要一些凌乱的积分(参见http://arxiv.org/abs/astron/9905116)
所以我在 python 中使用了一个名为 Cosmolopy 的包来进行集成和其他一些便利功能。虽然这在 PyMC2 上运行良好,但在 PyMC3 中依赖 theano,我不知道是否有使用 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 中进行积分?