Впервые пользователь PyMC3 пытается использовать модуль для байесовской нелинейной регрессии. Учитывая данные ввода-вывода (x_i, y_i), предположение моделирования составляет
где функция f нелинейная в параметрах модели w . Следовательно,
.
Предположим для простоты, что
и что все образцы отбираются независимо, так что совместная вероятность равна произведению индивидуальных вероятностей.
Цель : Вычислить апостериорную вероятность для параметров модели 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]
Очевидно, что тестовый прогон работает (как видно из операторов печати), но имитация цепочки Маркова - нет.
- Почему MCMC не работает?
- Как и в учебнике , я передаю массив, а не скаляр для mu , это правильно?