Байесовская нелинейная регрессия с PyMC3 - PullRequest
0 голосов
/ 05 сентября 2018

Впервые пользователь PyMC3 пытается использовать модуль для байесовской нелинейной регрессии. Учитывая данные ввода-вывода (x_i, y_i), предположение моделирования составляет

enter image description here

где функция f нелинейная в параметрах модели w . Следовательно,

enter image description here.

Предположим для простоты, что enter image description here и что все образцы отбираются независимо, так что совместная вероятность равна произведению индивидуальных вероятностей.

Цель : Вычислить апостериорную вероятность для параметров модели w .

На первом шаге мне нужно определить функцию, которая для каждого x_i дает мне ожидаемое значение.

@as_op(itypes=[tt.dscalar]*5, otypes=[tt.dvector])
def compute_expected_value(eta, rho, lamd, vbar, v0):

    model_param = [[eta, rho, lamd, vbar, v0]]

    # Expected value of outcome
    model_param = np.tile(model_param, (len(df), 1))
    features = np.column_stack((model_param, df.maturity, df.strike))  
    features = standardise_inputs(features, train_mean, train_std)
    exp_value, _ = predict(features, nn, sess)

    return exp_value.reshape(-1)

При наличии фрейма данных с параметрами данных и модели w = (eta, rho, lambda, vbar, v0) входы стандартизируются и затем передаются в нейронную сеть, закодированную с использованием Tensorflow (это абстрагируется в функции predict) , Затем я стараюсь как можно точнее следовать учебнику Linear .

def build_model():

    with basic_model as model:

        # Uniform priors for unknown model parameters
        eta = pm.Uniform('eta', lower=0, upper=5)
        rho = pm.Uniform('rho', lower=-1, upper=0)
        lamd = pm.Uniform('lambda',lower=0, upper=10)
        vbar = pm.Uniform('vbar', lower=0, upper=1)
        v0 = pm.Uniform('v0', lower=0, upper=1)

        sigma = pm.HalfNormal('sigma', sd=1)

        # Returns a (1337,) numpy vector for the expected value
        print('Compute NN IV.')
        mean = compute_expected_value(eta, rho, lamd, vbar, v0)
        print('NN IV computed.')

        # Likelihood (sampling distribution) of observations
        Y_obs = pm.Normal('Y_obs', mu=mean, sd=sigma, observed=df.iv.values)

    return model

def run(n=500):
    model = build_model()
    with model:
        db = pm.backends.Text('test')
        trace = pm.sample(n, step=pm.Metropolis(), trace=db)

    pm.traceplot(trace)

Как указал @merv, NUTS недоступен, потому что пакет не может получить градиент от моей реализации нейронной сети Tensorflow, поэтому я пытаюсь использовать Metropolis. Это однако возвращает:

Compute NN IV.
NN IV computed.
Multiprocess sampling (2 chains in 2 jobs)
CompoundStep
>Metropolis: [sigma]
>Metropolis: [v0]
>Metropolis: [vbar]
>Metropolis: [lambda]
>Metropolis: [rho]
>Metropolis: [eta]
Sampling 2 chains:   0%|          | 0/2000 [00:00<?, ?draws/s]

Очевидно, что тестовый прогон работает (как видно из операторов печати), но имитация цепочки Маркова - нет.

  1. Почему MCMC не работает?
  2. Как и в учебнике , я передаю массив, а не скаляр для mu , это правильно?
...