0

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

所以这个问题有两个方面:

  1. 我是否只是在 PyMC3 的语法上遗漏了一些允许我这样做的东西(可能是因为我仍然以某种方式被困在 PyMC2 模型构建上)?

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

4

2 回答 2

0

我不太了解 PyMC3,但我很了解 Theano。Theano 使用符号编译器和 TensorVariable 就是这样的符号变量。您需要编译并执行该函数以从中获取值。我不知道在 PyMC3 中在哪里执行此操作。如果变量仅依赖于常量和共享变量,那么可以快速尝试的方法是执行以下调用::

the_tensor_variable.eval()

这将编译函数并假设它不接受任何变量输入,如果它编译,它将运行它并返回值。

于 2013-11-01T20:05:25.737 回答
0

我认为一种可能的解决方案是按照http://deeplearning.net/software/theano/extending/上的说明编写自定义 Theano Op

我会编写一个不支持梯度计算的纯 Python 操作,您只需实现 make_node() 和 perform() 方法。

于 2014-06-17T08:13:07.617 回答