Как получить scipy.special функции для приема pymc3 RV в качестве входных данных - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь использовать pymc3 для подгонки модели, включающей функцию voigt (из scipy.special). Входные данные для функции voigt должны быть массивами, тогда как a, b являются классами pymc3. Как мне получить функции scipy.special для приема pymc3 RV в качестве входных данных? Выполнение приведенного ниже кода приводит к ошибке:

import pymc3 as pm
from scipy.special import voigt_profile
import numpy as np

with pm.Model() as linear_model:
    a = pm.Lognormal('a',mu=0, sigma=2.)
    b = pm.Lognormal('b',mu=0, sigma=2.)
    x = np.linspace(-1,1)
    c = voigt_profile(x,a,b)

TypeError: ufunc 'voigt_profile' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

1 Ответ

3 голосов
/ 17 апреля 2020

К лучшему или к худшему, вам нужно (пере) реализовать функцию, используя theano. Вот одна наивная версия, которая работает: обратите внимание, что вы не можете использовать erfc, потому что theano выдает ошибки.

import theano.tensor as tt

def faddeeva(z):
    m = tt.exp(-tt.square(z))
    return (m - m * tt.erf(1.j * z))

def voigt_profile(x, sigma, gamma):
    z = (x + 1.j * gamma) / (tt.sqrt(2.) * sigma)
    return faddeeva(z).real / (sigma * tt.sqrt(2 * np.pi))
...