Как построить модель, требующую внешнего пакета в PyMC3?

Я не уверен, что это вопрос PyMC3 или вопрос Theano. Я долгое время использовал PyMC2, чтобы подогнать космологию к данным о сверхновых. Для этого требуются некоторые запутанные интегралы (см., например, http://arxiv.org/abs/astroph/9905116 )

Поэтому я использую пакет на питоне под названием Cosmolopy для интеграции и некоторых других удобных функций. В то время как это отлично работало с PyMC2, с опорой на theano в PyMC3, я не могу понять, есть ли способ использовать 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?


person Brian Hayden    schedule 01.11.2013    source источник


Ответы (2)


Я плохо знаю PyMC3, но хорошо знаю Theano. Theano использует символический компилятор, а TensorVariable является такой символьной переменной. Вам нужно скомпилировать и выполнить функцию, чтобы получить от нее значение. Я не знаю, где это сделать в PyMC3. Быстрая попытка, которая будет работать, если переменная зависит только от константы и общей переменной, - это сделать этот вызов::

the_tensor_variable.eval()

Это скомпилирует функцию и предположит, что она не принимает никаких входных переменных, и если она скомпилируется, она запустит ее и вернет значение.

person nouiz    schedule 01.11.2013
comment
Я пробовал TensorVariable.eval(), и он просто возвращает метод eval(), но без оценок. - person Brian Hayden; 02.11.2013

Я думаю, что одним из возможных решений было бы написать пользовательскую Theano Op, следуя инструкциям на http://deeplearning.net/software/theano/extending/

Я бы написал чистую операцию Python без поддержки вычисления градиента, в которой вам нужно было бы реализовать только методы make_node() и Perform().

person Kai Londenberg    schedule 17.06.2014