如何在PyMC3中构建需要外部包的模型?

时间:2013-11-01 03:30:17

标签: pymc theano

我不确定这是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。

所以问题是双重的:

  1. 我是否只是遗漏了与PyMC3语法相关的东西,这样我就可以做到这一点(可能是因为我仍然在某种程度上坚持PyMC2模型构建)?

  2. 如果不是1,那么我是否需要找到一种在theano中进行积分的方法?

2 个答案:

答案 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()方法。