我不确定这是PyMC3问题还是Theano问题。我已经使用PyMC2很长一段时间来使宇宙学符合超新星数据。这需要一些混乱的积分(见http://arxiv.org/abs/astroph/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中进行积分的方法?
答案 0 :(得分:0)
我不太了解PyMC3,但我非常了解Theano。 Theano使用符号编译器和TensorVariable是这样的符号变量。您需要编译并执行该函数以从中获取值。我不知道在PyMC3中这是做什么的。如果变量仅依赖于常量和共享变量,那么尝试的快速方法就是调用::
the_tensor_variable.eval()
这将编译该函数并假设它不接受任何变量输入,如果它编译,它将运行它并返回值。
答案 1 :(得分:0)
我认为一种可能的解决方案是按照http://deeplearning.net/software/theano/extending/
上的说明编写自定义Theano Op我会写一个纯Python的op而不支持渐变计算,你只需要实现make_node()和perform()方法。