2013-11-01 29 views
0

我不确定这是PyMC3问题还是Theano问题。我已经使用PyMC2很长一段时间来适应超新星数据的宇宙学。这需要一些凌乱的积分(见http://arxiv.org/abs/astroph/9905116如何在PyMC3中建立需要外部封装的模型?

所以我在python中使用一个名为Cosmolopy的包来完成集成和其他一些便利功能。然而,这对PyMC2来说工作得很好,依靠PyMC3中的theano,我无法弄清楚是否有使用Cosmolopy的方法。

这里是我当前的因为Cosmolopy预计float型的omega_matter但收到theano.TensorVariable,而不是如何在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) 

此代码崩溃理解一些示例代码。

所以现在的问题是双重的:

  1. 我只思念语法与PyMC3的东西,让我这样做(可能是因为我仍然在某种程度上停留在PyMC2模型建设)?

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

回答

0

我不太了解PyMC3,但我很了解Theano。 Theano使用符号编译器和TensorVariable是这种符号变量。您需要编译并执行该函数以从中获取值。我不知道在PyMC3中该怎么做。一个快速的事去尝试,如果变量只依赖于常数和共享变量,将工作就是做这个调用::

the_tensor_variable.eval() 

这将编译功能,想这不采取任何变量输入,如果它编译,它会运行它并返回值。

+0

我试过TensorVariable.eval(),它只是返回eval()方法,但没有评估。 –

0

我认为一个可能的解决办法是在http://deeplearning.net/software/theano/extending/

编写自定义Theano欧普按照指示我会写一个纯Python运算,而不对梯度计算的支持,你将只需要执行make_node( )和执行()方法。

相关问题